Code › ai-engineering-study

스케일링과 규제(Regularization)

특성의 크기를 맞추고 Ridge, Lasso, Elastic Net으로 모델의 복잡도를 조절하는 과정

오늘은 스케일링과 함께 자주 등장하는 정규화, 표준화, 규제에 대해 조금 정리해 보려고 한다. 아, 그 전에 여담이지만 오늘 팀원들과 함께 위클리 페이어 공유시간을 가졌는데 좀 장황하게 정리하는 바람에 핵심이 무엇이다 라고 짚고 넘어가는 것이 부족했다. 정의를 확실하게 정리한 후 그 정의를 딱 깔끔하게 말하고 이후 부연설명으로 넘어가는 것이 가장 베스트인 것 같다! 여튼 위클리 페이퍼랑도 내용이 이어지는 부분이 있어서 잠시 언급 해 보았다.

먼저, 스케일링과 규제(Regularization)는 선형 모델에서는 함께 생각하면 편한 것 같다. 규제는 가중치의 크기에 벌점을 주는데, 입력 특성의 단위가 서로 매우 차이나면 가중치의 크기만 공정하게 비교하기 어렵기 때문이다.

예를 들어 집값을 예측할 때 방 개수는 1에서 5 정도이고 면적은 수십에서 수백까지 움직인다. 수치의 범위가 큰 특성이 반드시 더 중요한 것은 아니지만, 거리 기반 계산에서는 큰 값의 영향을 더 많이 받을 수 있고 경사하강법에서도 특성마다 변화 폭이 달라져 최솟값을 찾아가는 속도가 느려질 수 있다.


헷갈리는 세 용어부터 구분하기

Normalization, Standardization, Regularization은 이름이 비슷하고 한국어 번역도 겹쳐서 처음에는 구분하기 어려웠다. 강사님이 수업시간에서도 언급해주신 부분이긴 하지만 특히 Normalization과 Regularization을 모두 정규화라고 부르는 경우가 있어서, 이 글에서는 의미가 섞이지 않도록 용어를 나눠 쓴다.

  • Normalization은 데이터의 크기나 범위를 일정한 기준으로 변환한다. 다만 Min-Max 변환뿐 아니라 벡터의 길이를 1로 맞추는 변환을 뜻하기도 하므로, 여기서는 구체적으로 Min-Max Scaling이라고 쓴다.
  • Standardization은 각 값에서 평균을 빼고 표준편차로 나누는 표준화다.
  • Regularization은 데이터를 바꾸는 전처리가 아니라, 손실 함수에 가중치 벌점을 더하는 규제다.

Min-Max Scaling과 Standardization은 모두 특성 스케일링에 포함된다. 반면 Ridge, Lasso, Elastic Net 같은 Regularization은 스케일링이 끝난 데이터를 사용해 모델의 복잡도를 조절한다. 즉 스케일링은 입력 데이터를 변환하고, 규제는 모델이 가중치를 학습하는 방식을 제한한다.


특성의 크기를 맞추는 스케일링

**표준화(Standardization)**는 각 값에서 평균을 빼고 표준편차로 나눈다.

z=xμσz = \frac{x-\mu}{\sigma}

변환한 특성은 평균이 0, 표준편차가 1인 분포를 갖는다. 이상치가 있으면 평균과 표준편차도 영향을 받지만, 선형회귀나 로지스틱 회귀, SVM처럼 특성의 크기에 민감한 모델에서 자주 사용한다.

**정규화(Normalization)**라는 말은 여러 의미로 쓰이지만, 수업에서 자주 보는 Min-Max Scaling은 최솟값을 0, 최댓값을 1로 맞춘다.

x=xxminxmaxxminx' = \frac{x-x_{min}}{x_{max}-x_{min}}

값의 범위가 정해진다는 장점이 있지만 최솟값과 최댓값을 기준으로 삼기 때문에 이상치의 영향을 크게 받으며, 표준화와 Min-Max Scaling 중 하나가 항상 더 좋은 것은 아니다. 데이터 분포와 사용할 모델을 기준으로 선택해야 한다.

스케일러는 전체 데이터가 아니라 훈련 데이터에만 맞춰야 한다. 테스트 데이터까지 사용해 평균이나 최솟값을 계산하면 학습 단계에서 알 수 없어야 할 정보가 들어간다. 훈련 데이터로 스케일러를 학습한 뒤, 같은 기준을 검증 데이터와 테스트 데이터에 적용해야 데이터 누수(data leakage)를 피할 수 있다.

Min-Max 변환과 Z-score 공식은 첫 번째 위클리 페이퍼의 데이터 전처리 부분에도 함께 정리했다.


가중치가 지나치게 커지는 것을 막는 규제

모델이 훈련 데이터의 작은 잡음까지 따라가면 학습 데이터에서는 잘 맞지만 새로운 데이터에서 성능이 떨어질 수 있다. 규제(regularization)는 비용 함수에 가중치 크기에 대한 벌점을 더해 모델이 지나치게 복잡해지는 것을 제한한다.

손실 함수가 실제값과 예측값의 차이를 어떻게 계산하는지는 두 번째 위클리 페이퍼의 손실 함수 부분에서 MSE 공식을 기준으로 정리했다. 규제는 이 기존 손실에 가중치 벌점을 추가한다.

Ridge는 L2 규제를 사용한다. 각 가중치의 제곱을 더해 벌점으로 적용하므로 큰 가중치가 특히 강한 제약을 받고, 가중치를 전반적으로 줄이지만 보통 정확히 0으로 만들지는 않는다.

J(w)=Loss(w)+λj=1dwj2J(w) = \text{Loss}(w) + \lambda \sum_{j=1}^{d}w_j^2

Lasso는 L1 규제를 사용하며 가중치 절댓값의 합을 벌점으로 더한다. 일부 가중치를 0으로 만들 수 있어서 모델이 사용하지 않는 특성을 줄이는 효과도 있다.

J(w)=Loss(w)+λj=1dwjJ(w) = \text{Loss}(w) + \lambda \sum_{j=1}^{d}|w_j|

Elastic Net은 L1과 L2를 함께 사용한다. Lasso의 특성 선택 효과와 Ridge의 안정적인 가중치 축소를 조합하며, 서로 연관된 특성이 많은 데이터에서 두 규제 사이의 균형을 조절할 수 있다.

여기서 규제 강도를 결정하는 값이 람다이며, scikit-learn의 Ridge와 Lasso에서는 보통 alpha라는 이름을 사용한다. 값이 너무 작으면 규제 효과가 거의 없고, 너무 크면 필요한 관계까지 약하게 만들어 과소적합이 생길 수 있다.


왜 스케일링을 먼저 할까

면적과 방 개수처럼 단위가 다른 특성은 같은 예측에 기여하더라도 필요한 가중치 크기가 다를 수 있다. 규제는 이 가중치의 절댓값이나 제곱값을 직접 비교하므로, 스케일을 맞추지 않으면 단위 차이 때문에 특정 특성이 더 큰 벌점을 받을 수 있다.

그래서 특성의 크기에 민감한 모델에서는 데이터를 나눈 뒤 훈련 데이터로 스케일러를 학습하고, 변환된 데이터로 규제가 적용된 모델을 학습하는 순서가 중요하다. scikit-learn에서는 Pipeline으로 이 과정을 묶어 데이터 누수를 줄일 수 있다.

from sklearn.linear_model import Ridge
from sklearn.pipeline import make_pipeline
from sklearn.preprocessing import StandardScaler

model = make_pipeline(
    StandardScaler(),
    Ridge(alpha=1.0),
)

오늘은 이렇게 스케일링 후 규제를 통해 모델의 성능을 더욱 높일 수 있는 이론에 대해서 알아보았다. 모델의 성능은 오히려 자체 알고리즘의 개선 보다도 이 데이터의 전처리에서 많이 갈린다고 한다. 그래서 이 부분을 더욱 잘 정리해야겠다.