046 Ridge와 Lasso 회귀
키워드: Ridge, Lasso, 정규화
개요
Ridge와 Lasso는 선형 회귀에 정규화를 추가한 알고리즘입니다. 과적합을 방지하고 다중공선성 문제를 해결합니다.
실습 환경
- Python 버전: 3.11 권장
- 필요 패키지:
pycaret[full]>=3.0
정규화란?
모델 복잡도에 패널티를 부여하여 과적합 방지:
손실 = RSS + λ × 패널티
= Σ(yᵢ - ŷᵢ)² + λ × 정규화항
- λ (alpha): 정규화 강도
- λ = 0: 일반 선형 회귀
- λ → ∞: 모든 계수가 0에 가까워짐
Ridge (L2 정규화)
계수 제곱합에 패널티:
손실 = RSS + λ × Σβᵢ²
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
# 046 Ridge 회귀
ridge = create_model('ridge')
특징:
- 계수를 0에 가깝게 축소 (0은 아님)
- 모든 특성 유지
- 다중공선성에 효과적
Lasso (L1 정규화)
계수 절댓값 합에 패널티:
손실 = RSS + λ × Σ|βᵢ|
# 046 Lasso 회귀
lasso = create_model('lasso')
특징:
- 일부 계수를 정확히 0으로 만듦
- 자동 특성 선택 효과
- 희소 모델 (Sparse Model)
Elastic Net
Ridge와 Lasso의 조합:
손실 = RSS + λ₁ × Σ|βᵢ| + λ₂ × Σβᵢ²
# 046 Elastic Net
en = create_model('en')
비교 실험
from pycaret.regression import *
from pycaret.datasets import get_data
import pandas as pd
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
# 046 모델 비교
models = {
'Linear': create_model('lr', verbose=False),
'Ridge': create_model('ridge', verbose=False),
'Lasso': create_model('lasso', verbose=False),
'ElasticNet': create_model('en', verbose=False)
}
# 046 계수 비교
feature_names = get_config('X_train').columns
coef_comparison = pd.DataFrame({'Feature': feature_names})
for name, model in models.items():
coef_comparison[name] = model.coef_
print("계수 비교:")
print(coef_comparison.round(4))
# 046 Lasso에서 0이 된 계수 확인
lasso_zero = coef_comparison[coef_comparison['Lasso'].abs() < 0.001]['Feature'].tolist()
print(f"\nLasso에서 제거된 특성: {lasso_zero}")
Alpha 튜닝
from pycaret.regression import *
from pycaret.datasets import get_data
data = get_data('boston')
reg = setup(data, target='medv', session_id=42, verbose=False)
# 046 Ridge 기본 모델
ridge = create_model('ridge', verbose=False)
# 046 자동 튜닝
tuned_ridge = tune_model(ridge, optimize='RMSE')
# 046 커스텀 그리드
custom_grid = {'alpha': [0.001, 0.01, 0.1, 1, 10, 100]}
tuned_ridge = tune_model(ridge, custom_grid=custom_grid, optimize='RMSE')
Alpha 영향 시각화
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Ridge, Lasso
X = get_config('X_train').values
y = get_config('y_train').values
# 046 Alpha에 따른 계수 변화
alphas = np.logspace(-3, 3, 100)
# 046 Ridge 계수
ridge_coefs = []
for alpha in alphas:
ridge = Ridge(alpha=alpha)
ridge.fit(X, y)
ridge_coefs.append(ridge.coef_)
# 046 Lasso 계수
lasso_coefs = []
for alpha in alphas:
lasso = Lasso(alpha=alpha, max_iter=10000)
lasso.fit(X, y)
lasso_coefs.append(lasso.coef_)
# 046 시각화
fig, axes = plt.subplots(1, 2, figsize=(14, 5))
# 046 Ridge
ax = axes[0]
ax.semilogx(alphas, ridge_coefs)
ax.set_xlabel('Alpha')
ax.set_ylabel('Coefficients')
ax.set_title('Ridge: Coefficients vs Alpha')
ax.axhline(y=0, color='k', linestyle='--', linewidth=0.5)
# 046 Lasso
ax = axes[1]
ax.semilogx(alphas, lasso_coefs)
ax.set_xlabel('Alpha')
ax.set_ylabel('Coefficients')
ax.set_title('Lasso: Coefficients vs Alpha')
ax.axhline(y=0, color='k', linestyle='--', linewidth=0.5)
plt.tight_layout()
plt.savefig('ridge_lasso_path.png', dpi=150)
언제 어떤 것을 사용?
| 상황 | 권장 |
|---|---|
| 다중공선성 | Ridge |
| 특성 선택 필요 | Lasso |
| 많은 특성 | Lasso, Elastic Net |
| 특성이 모두 중요 | Ridge |
| 불확실할 때 | Elastic Net |
고차원 데이터에서 Lasso
# 046 특성이 많은 경우 Lasso의 특성 선택 효과
from sklearn.datasets import make_regression
import pandas as pd
# 046 고차원 데이터 생성 (100 특성, 10개만 중요)
X, y = make_regression(
n_samples=200,
n_features=100,
n_informative=10,
noise=10,
random_state=42
)
df = pd.DataFrame(X, columns=[f'feature_{i}' for i in range(100)])
df['target'] = y
# 046 PyCaret으로 분석
from pycaret.regression import *
reg = setup(df, target='target', session_id=42, verbose=False)
# 046 Lasso로 특성 선택
lasso = create_model('lasso', verbose=False)
# 0이 아닌 계수 개수
non_zero = np.sum(np.abs(lasso.coef_) > 0.01)
print(f"Lasso가 선택한 특성 수: {non_zero} / 100")
장단점 비교
| 항목 | Ridge | Lasso | Elastic Net |
|---|---|---|---|
| 계수 축소 | 0에 가깝게 | 정확히 0 | 둘 다 |
| 특성 선택 | X | O | O |
| 다중공선성 | 효과적 | 불안정 | 효과적 |
| 해석 | 모든 특성 | 선택된 특성만 | 혼합 |
정리
- Ridge (L2): 계수 축소, 다중공선성 해결
- Lasso (L1): 계수를 0으로, 자동 특성 선택
- Elastic Net: Ridge + Lasso 조합
- Alpha가 클수록 강한 정규화
- 고차원 데이터에서 Lasso 효과적
- 불확실하면 Elastic Net 추천
다음 글 예고
다음 글에서는 결정 트리 회귀 상세를 다룹니다.
PyCaret 머신러닝 마스터 시리즈 #046