AI/Machine Learning

머신러닝에서 L1, L2 규제

comflex 2025. 4. 13. 12:24
728x90
반응형

l1_l2


머신러닝 모델을 만들다 보면 종종 “과적합(overfitting)”이라는 문제를 마주하게 됩니다.
학습 데이터에는 잘 맞지만, 실제 데이터에서는 성능이 떨어지는 현상이죠.

이런 과적합을 방지하기 위한 대표적인 기법 중 하나가 바로
"정규화(Regularization)", 그 중에서도 L1, L2 규제입니다.

이번 글에서는 L1, L2 규제가 무엇인지, 어떤 차이가 있는지,
그리고 실제로 어떻게 적용하는지를 정리해보겠습니다.


왜 규제가 필요한가요?

머신러닝 모델은 보통 다음과 같은 손실 함수(Loss Function)를 최소화하려고 학습합니다:

Loss = 예측값과 실제값의 차이

하지만 모델이 너무 복잡하거나 파라미터가 너무 많으면
학습 데이터에만 지나치게 최적화되어
테스트 데이터에서는 성능이 떨어질 수 있어요.

이를 방지하기 위해 손실 함수에 패널티(penalty) 항을 추가하여
모델이 너무 복잡해지지 않도록 제한합니다.
이걸 정규화(regularization) 라고 부르며, 가장 흔한 방식이 바로 L1, L2 규제입니다.


L1 규제 (Lasso)

정의

L1 규제는 모델의 가중치들의 절댓값을 손실 함수에 추가합니다.

수식:

Loss = 원래 손실 + λ * Σ|wᵢ|
  • wᵢ: 각 피처의 가중치(weight)
  • λ (람다): 규제 강도 (0에 가까우면 규제가 약해지고, 클수록 강해짐)

특징

  • 가중치를 0으로 만드는 경향이 있음 → 변수 선택 효과
  • 희소성(sparsity) 유도 → 일부 피처만 사용함
  • 고차원 데이터 (예: 텍스트, 유전자 데이터 등)에서 매우 유용

예시

from sklearn.linear_model import Lasso

model = Lasso(alpha=0.1)
model.fit(X_train, y_train)

반응형
728x90

L2 규제 (Ridge)

정의

L2 규제는 가중치들의 제곱값을 손실 함수에 추가합니다.

수식:

Loss = 원래 손실 + λ * Σ(wᵢ²)

특징

  • 가중치를 0에 가깝게 만듦 (하지만 완전히 0으로 만들진 않음)
  • 모든 피처를 조금씩 사용하려는 경향
  • 모델이 부드러워지고, 노이즈에 덜 민감해짐

예시

from sklearn.linear_model import Ridge

model = Ridge(alpha=1.0)
model.fit(X_train, y_train)

L1 vs L2 비교

항목 L1 (Lasso) L2 (Ridge)
규제 방식 절댓값 제곱값
가중치 영향 일부를 완전히 0으로 만듦 대부분을 작게 만들지만 0은 안 됨
변수 선택 가능 (sparse 모델) 불가능
계산 복잡도 비교적 낮음 더 안정적, 수치적으로 안정
사용 예시 피처가 많고, 중요하지 않은 피처 제거 필요할 때 피처가 많은 경우 전반적인 안정성 향상 필요할 때

L1 + L2 = ElasticNet

L1과 L2를 동시에 사용하는 방법도 있습니다.
이를 ElasticNet이라고 부르며, 실제로 많이 사용되는 기법입니다.

from sklearn.linear_model import ElasticNet

model = ElasticNet(alpha=1.0, l1_ratio=0.5)  # L1과 L2를 50:50 비율로
model.fit(X_train, y_train)
  • l1_ratio = 0: Ridge와 동일
  • l1_ratio = 1: Lasso와 동일
  • l1_ratio = 0.5: 절반씩 섞음

실전 팁

  • 피처가 많고 불필요한 게 많을 때 → L1 규제
  • 피처들이 모두 중요할 수 있을 때 → L2 규제
  • 둘 다 적절히 쓰고 싶다면 → ElasticNet

마무리

머신러닝 모델의 성능을 높이는 데 있어
단순히 모델 구조만 신경 쓰는 건 부족합니다.

L1, L2 규제는 모델이 과적합을 방지하고,
더 일반화된 예측력을 갖도록 만들어주는 강력한 도구
입니다.

728x90
반응형