본문으로 건너뛰기

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")

장단점 비교

항목RidgeLassoElastic Net
계수 축소0에 가깝게정확히 0둘 다
특성 선택XOO
다중공선성효과적불안정효과적
해석모든 특성선택된 특성만혼합

정리

  • Ridge (L2): 계수 축소, 다중공선성 해결
  • Lasso (L1): 계수를 0으로, 자동 특성 선택
  • Elastic Net: Ridge + Lasso 조합
  • Alpha가 클수록 강한 정규화
  • 고차원 데이터에서 Lasso 효과적
  • 불확실하면 Elastic Net 추천

다음 글 예고

다음 글에서는 결정 트리 회귀 상세를 다룹니다.


PyCaret 머신러닝 마스터 시리즈 #046