선형 회귀 정규화(Lasso, Ridge)

Ryu Jihoon·2024년 9월 23일
post-thumbnail

선형 회귀의 정규화와 Lasso, Ridge

선형 회귀의 정규화, Lasso, Ridge는 모두 과적합을 방지하고 모델의 성능을 개선하기 위한 기법입니다. 이 방법들은 회귀 모델의 복잡성을 제어함으로써 모델의 일반화 능력을 높이는 데 사용됩니다.

1. 정규화(Regularization)란?

정규화는 회귀 계수들의 크기를 제한하여 모델의 복잡도를 낮추고, 이를 통해 과적합을 방지하는 기법입니다.

기본 선형 회귀 모델

기본 선형 회귀 모델은 다음과 같은 형태를 가집니다:

y^=β0+β1x1+β2x2++βpxp\hat{y} = \beta_0 + \beta_1 x_1 + \beta_2 x_2 + \cdots + \beta_p x_p

여기서 정규화는 패널티 항(규제항)을 추가하여 회귀 계수들이 너무 커지는 것을 방지합니다. 주로 두 가지 방식의 정규화가 있습니다: L1 규제(Lasso)L2 규제(Ridge).


2. Ridge 회귀 (L2 정규화)

Ridge 회귀L2 정규화라고도 불리며, 회귀 계수들의 제곱합에 패널티를 부과하여 모델을 규제합니다.

Ridge 회귀 목적 함수

J(β)=i=1n(yiy^i)2+λj=1pβj2J(\beta) = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} \beta_j^2
  • λ\lambda는 정규화 강도를 조절하는 하이퍼파라미터입니다. λ\lambda가 클수록 규제가 강해집니다.
  • Ridge는 모든 피처의 가중치를 줄이는 경향이 있으며, 계수가 0이 되지 않고 작아질 뿐입니다.

Ridge의 장점

  • 데이터에 노이즈가 있더라도 강건하게 동작합니다.
  • 모든 피처를 고려하지만 그 영향력을 최소화합니다.

3. Lasso 회귀 (L1 정규화)

Lasso 회귀L1 정규화라고 불리며, 회귀 계수들의 절대값 합에 패널티를 부과합니다. 이를 통해 일부 계수는 정확히 0이 됩니다.

Lasso 회귀 목적 함수

J(β)=i=1n(yiy^i)2+λj=1pβjJ(\beta) = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \lambda \sum_{j=1}^{p} |\beta_j|
  • λ\lambda는 정규화 강도를 조절하는 하이퍼파라미터로, 값이 커질수록 더 많은 계수가 0이 됩니다.
  • Lasso는 특성 선택(feature selection) 기능을 내재하고 있어 불필요한 피처를 제거할 수 있습니다.

Lasso의 장점

  • 피처 선택이 가능하여, 고차원 데이터에서 유용합니다.
  • 모델을 단순화하고 해석 가능성을 높여줍니다.

4. Ridge vs Lasso 비교

특징Ridge (L2 정규화)Lasso (L1 정규화)
패널티 항λj=1pβj2\lambda \sum_{j=1}^{p} \beta_j^2λj=1pβj\lambda \sum_{j=1}^{p} \mid\beta_j\mid
목적모든 피처의 가중치를 줄이기중요하지 않은 피처의 가중치를 0으로 만듦
사용 사례피처가 많고, 모두가 중요할 가능성이 있을 때피처가 많고, 그중 일부만 중요할 때
회귀 계수계수가 0에 가까워짐, 절대 0이 되지 않음일부 계수가 0이 되어 특성 선택 가능

5. Elastic Net

Elastic Net은 Ridge와 Lasso를 혼합한 기법으로, L1L2 규제를 동시에 사용합니다.

Elastic Net 목적 함수

J(β)=i=1n(yiy^i)2+α(λ1j=1pβj+λ2j=1pβj2)J(\beta) = \sum_{i=1}^{n} (y_i - \hat{y}_i)^2 + \alpha \left( \lambda_1 \sum_{j=1}^{p} |\beta_j| + \lambda_2 \sum_{j=1}^{p} \beta_j^2 \right)

Elastic Net은 Lasso와 Ridge의 장점을 결합하여, 불필요한 피처는 제거하고 나머지 피처는 적절하게 규제할 수 있습니다.


6. Ridge와 Lasso 회귀 예시 코드

from sklearn.linear_model import Ridge, Lasso
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error

# 데이터셋 분할
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# Ridge 회귀
ridge_model = Ridge(alpha=1.0)  # alpha = lambda
ridge_model.fit(X_train, y_train)
ridge_pred = ridge_model.predict(X_test)
ridge_mse = mean_squared_error(y_test, ridge_pred)
print(f'Ridge MSE: {ridge_mse}')

# Lasso 회귀
lasso_model = Lasso(alpha=1.0)  # alpha = lambda
lasso_model.fit(X_train, y_train)
lasso_pred = lasso_model.predict(X_test)
lasso_mse = mean_squared_error(y_test, lasso_pred)
print(f'Lasso MSE: {lasso_mse}')
profile
CSE Junior

0개의 댓글