머신러닝 기초 - 정규화 기법: L1과 L2
🔎 개요 및 소개
머신러닝 모델은 복잡한 데이터를 학습하는 과정에서 모델의 가중치(weight)가 너무 크게 되거나 불필요한 피처(feature)에 과도하게 의존하는 문제가 발생할 수 있다. 이를 방지하고 모델의 일반화(generalization) 성능을 향상시키기 위해 정규화(Regularization) 기법이 사용된다. 정규화는 모델의 복잡도를 제어하여 과적합(overfitting)을 줄이는 역할을 한다. 이번 글에서는 대표적인 정규화 기법인 L1 정규화(L1 Regularization, Lasso)와 L2 정규화(L2 Regularization, Ridge)의 원리, 차이점, 그리고 파이썬 코드 예제를 통해 정규화 기법의 효과를 초보자도 쉽게 이해할 수 있도록 설명한다.
🔥 정규화(Regularization)의 기본 원리
정규화는 모델의 손실 함수(loss function)에 추가적인 항(term)을 더해 모델의 복잡도를 제한하는 기법이다. 기본적으로 회귀 문제에서 일반적인 손실 함수는 평균 제곱 오차(Mean Squared Error, MSE)이다. 여기에 정규화 항을 추가하면 모델이 지나치게 큰 가중치를 갖지 않도록 유도할 수 있다.
- L1 정규화 (L1 Regularization, Lasso):
L1 정규화는 가중치의 절대값 합계(absolute sum)를 손실 함수에 추가한다. 이 방식은 일부 가중치를 0으로 만들 수 있어 자동으로 피처 선택(feature selection) 효과를 가져온다. - L2 정규화 (L2 Regularization, Ridge):
L2 정규화는 가중치 제곱합(squared sum)을 손실 함수에 추가한다. 모든 가중치를 조금씩 줄여 모델을 안정화시키며, 가중치가 0이 되는 일은 없지만 전체적으로 작은 값을 유지하도록 유도한다.
정규화 항의 강도는 하이퍼파라미터인 람다(λ) 또는 알파(alpha)로 조절할 수 있으며, 이를 통해 모델의 편향(bias)과 분산(variance) 사이의 균형을 맞출 수 있다.
💻 파이썬 코드 예시: L1 (Lasso)와 L2 (Ridge) 정규화 비교
아래 코드는 사이킷런(scikit-learn)을 사용해 임의 데이터를 대상으로 L1 정규화와 L2 정규화를 적용한 선형 회귀 모델을 학습시키고, 두 모델의 성능과 가중치 차이를 비교하는 예제다.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Lasso, Ridge, LinearRegression
from sklearn.metrics import mean_squared_error
from sklearn.model_selection import train_test_split
# 임의의 선형 데이터 생성: y = 5*x + 3 + 노이즈
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 5 * X.flatten() + 3 + np.random.randn(100) * 2
# 학습 데이터와 테스트 데이터 분할 (70% 학습, 30% 테스트)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# 기본 선형 회귀 (정규화 없음)
lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)
y_pred_lin = lin_reg.predict(X_test)
mse_lin = mean_squared_error(y_test, y_pred_lin)
# L1 정규화 (Lasso Regression) 적용
lasso_reg = Lasso(alpha=0.1) # alpha 값은 정규화 강도 조절
lasso_reg.fit(X_train, y_train)
y_pred_lasso = lasso_reg.predict(X_test)
mse_lasso = mean_squared_error(y_test, y_pred_lasso)
# L2 정규화 (Ridge Regression) 적용
ridge_reg = Ridge(alpha=0.1)
ridge_reg.fit(X_train, y_train)
y_pred_ridge = ridge_reg.predict(X_test)
mse_ridge = mean_squared_error(y_test, y_pred_ridge)
print("기본 선형 회귀 MSE:", mse_lin)
print("Lasso (L1) 회귀 MSE:", mse_lasso)
print("Ridge (L2) 회귀 MSE:", mse_ridge)
# 모델의 가중치 비교
print("기본 선형 회귀 계수:", lin_reg.coef_)
print("Lasso 회귀 계수:", lasso_reg.coef_)
print("Ridge 회귀 계수:", ridge_reg.coef_)
# 데이터 및 예측 결과 시각화
plt.figure(figsize=(10, 6))
plt.scatter(X_test, y_test, color='black', label='Test Data')
X_new = np.linspace(0, 2, 100).reshape(-1, 1)
plt.plot(X_new, lin_reg.predict(X_new), label='Linear Regression', linewidth=2)
plt.plot(X_new, lasso_reg.predict(X_new), label='Lasso Regression (L1)', linewidth=2)
plt.plot(X_new, ridge_reg.predict(X_new), label='Ridge Regression (L2)', linewidth=2)
plt.xlabel("X")
plt.ylabel("y")
plt.title("정규화 기법 비교: 기본, Lasso, Ridge")
plt.legend()
plt.show()
이 코드는 동일한 데이터셋에 대해 기본 선형 회귀, L1 정규화(Lasso), L2 정규화(Ridge) 모델을 학습시키고, 테스트 데이터에 대한 평균 제곱 오차(MSE)를 출력한다. 또한, 각 모델의 가중치(coefficient)를 비교해 정규화 기법이 모델의 복잡도를 어떻게 조절하는지 확인할 수 있다. 시각화 결과를 통해 세 모델의 예측 곡선이 어떻게 달라지는지도 쉽게 이해할 수 있다.
📊 정규화 기법의 효과와 선택 기준
정규화 기법은 모델의 가중치 크기를 제한해 과적합을 방지하는 동시에, 데이터에 대한 해석 가능성을 높여준다.
- L1 정규화 (Lasso):
- 불필요한 피처의 가중치를 0으로 만들어 자동 피처 선택 효과를 가져온다.
- 데이터 차원이 높거나 피처 중 일부만 중요한 경우 효과적이다.
- L2 정규화 (Ridge):
- 모든 피처의 가중치를 작게 유지하며, 모델의 안정성을 높인다.
- 모든 피처가 일정 정도 기여하는 경우, 가중치를 완만하게 줄이는 데 적합하다.
실제 문제에서는 데이터의 특성과 목표에 따라 L1 또는 L2 정규화를 선택하거나, Elastic Net과 같이 두 가지를 결합한 기법을 사용하기도 한다.
🔍 초보자를 위한 실습 및 이해 포인트
초보자는 정규화 기법을 직접 구현하고, 모델의 가중치와 예측 성능이 어떻게 변화하는지를 관찰해보면 좋다.
- 데이터셋 준비 및 분할:
- 임의 데이터셋 또는 공개 데이터셋을 사용해 학습과 테스트 데이터를 분할한다.
- 기본 모델과 정규화 모델 비교:
- 기본 선형 회귀 모델과 Lasso, Ridge 모델을 각각 학습시켜 MSE 및 가중치를 비교해본다.
- 하이퍼파라미터(alpha) 조정 실험:
- alpha 값(정규화 강도)을 조절하며 모델의 복잡도 변화와 예측 성능을 분석해본다.
- 시각화로 차이점 확인:
- 모델 예측 곡선을 시각화해 정규화 전후의 차이를 명확하게 확인한다.
이와 같은 실습을 통해 정규화 기법이 모델의 과적합을 방지하고, 보다 일반화된 예측 모델을 만드는 데 어떻게 기여하는지 직접 체험할 수 있다.
📚 주요 용어 정리
이번 블로그에서 다룬 주요 용어들을 간단히 정리하면 다음과 같다.
- 정규화 (Regularization): 모델의 복잡도를 제어하기 위해 손실 함수에 추가적인 항을 도입하는 기법.
- L1 정규화 (L1 Regularization, Lasso): 가중치의 절대값 합계를 손실 함수에 추가하여 일부 가중치를 0으로 만들어 피처 선택 효과를 유도하는 기법.
- L2 정규화 (L2 Regularization, Ridge): 가중치 제곱합을 손실 함수에 추가해 모든 가중치를 작게 유지하는 기법.
- 과적합 (Overfitting): 모델이 학습 데이터에 지나치게 적합하여 새로운 데이터에 대한 일반화 성능이 저하되는 현상.
- 하이퍼파라미터 (Hyperparameter): 모델 학습 전에 설정하는 파라미터로, 정규화 강도(alpha) 등이 이에 해당된다.
🧪 실제 프로젝트에서의 정규화 활용 방안
실무에서는 데이터의 복잡도와 모델의 성능을 고려해 정규화 기법을 적극 활용한다. 예를 들어, 금융 예측, 의료 데이터 분석, 텍스트 데이터 처리 등 다양한 분야에서 모델이 과적합되지 않도록 L1 또는 L2 정규화를 적용한다. 정규화 기법은 데이터 차원이 높을 때 불필요한 피처를 제거하거나, 모든 피처의 영향을 일정하게 유지하는 데 큰 도움이 된다. 모델의 하이퍼파라미터 튜닝 과정에서 교차 검증을 병행하면, 최적의 alpha 값을 찾아 모델의 일반화 성능을 극대화할 수 있다. 이러한 접근법은 실제 서비스 환경에서 모델의 신뢰성과 안정성을 보장하는 데 중요한 역할을 한다.
🔍 마무리 및 요약
정규화 기법은 머신러닝 모델의 복잡도를 제어해 과적합을 방지하고, 모델의 일반화 능력을 향상시키는 필수 도구다. L1 정규화는 피처 선택 효과를 통해 불필요한 피처를 제거하고, L2 정규화는 모든 피처의 가중치를 안정적으로 조절해 모델을 보편화시킨다. 본 글에서는 Lasso와 Ridge 회귀 모델을 예시로 들어, 두 정규화 기법의 원리와 효과를 파이썬 코드로 확인했다. 초보자는 이를 통해 정규화의 중요성을 이해하고, 실제 데이터셋에 적용하여 모델 성능을 개선하는 방법을 체험해보길 권장한다.
#정규화기법 #L1정규화 #L2정규화 #머신러닝기초