Data Analysis & ML/Machine Learning

[Machine Learning][머신러닝] 릿지/라쏘/엘라스틱넷 (정규화 회귀분석)

YSY^ 2024. 5. 15. 22:10

릿지/라쏘/엘라스틱넷 (정규화 회귀분석)

모델링을 하다보면 과적합될때가 많은데 이때 과적합을 막는 방법은 모델에 규제를 가하는 것이다.

보통 선형회귀 모델링에서는 모델의 가중치를 제한함으로써 규제를 하는데, 이번 포스팅에서는 모델의 가중치를 제한하는 회귀분석인 릿지, 라쏘, 엘라스틱넷에 대해 알아본다. 

 

정규화 방법론

  • Regularized Method, Penalized Method, Contrained Least Squares
  • 선형회귀 계수(Weight)에 대한 제약 조건을 추가함으로써 모형이 과도하게 최적화되는 현상, 즉 과최적화를 막는 방법
  • 과최적화는 계수 크기를 과도하게 증가하는 경향이 있기에, 정규화 방법에서의 제약 조건은 일반적으로 계수의 크기를 제한하는 방법

규제 (Regularization)

  • 선형 회귀 모델에서 과적합 문제를 해결하기 위해 가중치(회귀계수)에 페널티 값을 적용하는 것.
  • 입력데이터의 Feature들이 너무 많은 경우 과적합이 발생.
    • Feature수에 비해 관측치 수가 적은 경우 모델이 복잡해 지면서 과적합이 발생
  • 해결방법
    • 데이터를 더 수집한다.
    • Feature selection
      • 불필요한 Features들을 제거한다.
    • 규제 (Regularization) 을 통해 Feature들에 곱해지는 가중치가 커지지 않도록 제한한다.
      • "커지지 않는다"는  0에 가깝게 만들겠다는 의미(X가 y에 미치는 영향력이 커지지 않겠다.)

L1 Norm VS L2 Norm

L1 Norm

  • 실제값과 예측값의 오차의 절대값의 합

L2 Loss

  • 실제값과 예측값의 오차의 제곱의 합

L1과 L2 비교

  • L1과 L2 규제의 손실함수의 최적해 위치는 위 그림과 같이 표현 가능함
  • 위 그림에서 도형(마름모, 원 등)은 규제영역이며, L1은 절대값이기에 마름모꼴로 표현되고 L2는 제곱이기에 원형으로 표현
  • 위 식에서 람다( λ)가 커질수록 규제영역은 작아져 편차는 더 커치고 분산은 줄어들기에 Overfitting의 가능성이 낮아짐
  • L1과 L2 규제를 추가한 Loss Function은 규제영역에서 가장 최적값과 가까운지점(녹색점)이라고 할 수 있음 
  • 또한 L1에서는 θ1의 값이 0이기에(녹색점), L1을 적용하면 특정 변수를 삭제할 수 있다. (Feature Selection)
  • 여기서 L2 norm을 적용한 것이 Ridge Regression(릿지), L1 norm을 적용한 것이 Lasso Regression (라쏘), L1과 L2를 적절히 조합하는 것이 Elastic Net(엘라스틱넷)이다.

 

Ridge Regression

  • 베타 스케일을 조정해서 현실성 있는 베타를 추정하는 회귀분석
    • 추정할 계수( β )의 제곱(양수)를 더한 값이 최소가 되는 값, 따라서 β도 값이 작아져야함,
    • 제곱을 취하다 보니 큰숫자에 더 민감해지기에 큰 숫자를 줄이는 것에 초점
    • 가중치 계수를 전체적으로 감소시킴.
  • 규제조건(정규화조건/패널티): 가중치들의 제곱합을 최소화  (L2 Norm)
    • 손실함수(loss function)4에 규제항으로 L2 Norm을 더해준다.

  • 하이퍼파라미터(α)로 모델을 얼마나 많이 규제할지 조절한다.
    • 기존의 잔차 제곱합과 추가 제약 조건의 비중을 조절
    • α=0: 일반적인 선형 회귀모형(OLS)
    • α 를 크게 하면 규제(패널티) 정도가 커지기 때문에 가중치( β )의 값들이 작아짐
    • α 를 작게 하면 규제 (패널티) 정도가 작아 지기 때문에 가중치( β )의 값들의 자유도가 높아져 커짐
  • 특징
    • 모든 변수들을 포함하기에, 계수의 크기가 작아지고 모형의 복잡도가 줄어듬
    • 변수의 수가 많은 경우 효과가 좋지 않으나 과적합(Overfitting)을 방지하는데 효과적
    • 다중공선성이 존재할 경우, 변수 간 상관관계에 따라 계수로 다중공선성이 분산되기에 효과가 높음

Ridge Regression 사용 예시 (Python Code)

타이타닉 데이터 세팅 및 전처리

import pandas as pd
import numpy as np
from sklearn.datasets import load_boston
from sklearn.preprocessing import StandardScaler, MinMaxScaler
from sklearn.model_selection import train_test_split

# boston data load
boston = load_boston()
X, y = boston.data, boston.target

chas_df = pd.get_dummies(df['CHAS'])
chas_df.columns = ['CHAS_0', 'CHAS_1']

y = df['MEDV']
X = df.drop(columns='MEDV')

# train & test set split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

# scaling
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
## 성능 평가 지표 함수
from sklearn.metrics import mean_squared_error, r2_score
def print_metrics(y, pred_y, title):
    mse = mean_squared_error(y, pred_y)
    rmse = np.sqrt(mse)
    r2 = r2_score(y, pred_y)
    print(f'{title} - MSE: {np.round(mse,3)}, RMSE: {np.round(rmse,3)}, R square: {np.round(r2,3)}')

Ridge Regression 모델링

  • alpha가 1일때와 10일때 비교
from sklearn.linear_model import Ridge

# ridge = Ridge() #알파 기본값 1
### 0.1->10 (강한 규제. w가 0에 더 가깝게 된다.)->X가 y를 예측하는 영향력을 작게
 
ridge = Ridge(alpha=1, random_state=1)
ridge.fit(X_train_scaled, y_train)
pred_train = ridge.predict(X_train_scaled)
pred_test = ridge.predict(X_test_scaled)
print_metrics(y_train, pred_train, 'alpha 1: Train')
print_metrics(y_test, pred_test, 'alpha 1: Test')

print("\n")

ridge = Ridge(alpha=10, random_state=1) 
ridge.fit(X_train_scaled, y_train)
pred_train = ridge.predict(X_train_scaled)
pred_test = ridge.predict(X_test_scaled)
print_metrics(y_train, pred_train, 'alpha 10: Train')
print_metrics(y_test, pred_test, 'alpha 10: Test')

Test셋에서 alpha가 10일때 오차가 1일때보다 약간 낮다

규제 Alpha에 따른 가중치 변화

import matplotlib.pyplot as plt
alphas = [0.01, 0.1, 1, 10, 20, 100]
ridge_coef_df = pd.DataFrame()

plt.figure(figsize=(10, 25))

for index, alpha in enumerate(alphas, start=1):
    #모델 생성
    ridge = Ridge(alpha = alpha)
    #학습
    ridge.fit(X_train_scaled, y_train)
    #예측
    pred_train = ridge.predict(X_train_scaled)
    pred_test = ridge.predict(X_test_scaled)
    
    w_series = pd.Series(ridge.coef_, index=X_train.columns)
    ridge_coef_df[f'Alpha-{alpha}'] = w_series

alpha가 커질 수록 가중치가 대체로 점점 감소한다.

CF) Ridge 모델의 parameter

  • solver="cholesky"
    • 숄레스키 분해라고 하는 행렬분해를 이용해 정규방정식으로 모델 학습
ridge = Ridge(alpha=1, solver="cholesky", random_state=1)
  • solver="sag"
    • 확률적 평균 경사하강법(Stochastic Average Gradient Descent)을 이용한 모델 학습
    • 현재 gradient와 이전 단계의 모든 gradient를 합한 평균값으로 모델 파라미터 세팅

 

Lasso Regression

  • 추정할 계수(베타)의 절대값을 더한 값이 최소가 되는 값.
    • 제곱이 아닌 절대값이기 때문에 베타의 크기에 따른 영향이 적음
    • 일부 가중치를 완전히 0으로 바꿔 제거하는 특성이 있음
  • 규제조건(정규화조건/패널티): 가중치의 절대값의 합을 최소화 (L1 Norm)

  • 특징
    • 효과가 없는 독립변수를 먼저 타게팅하여 효과가 없는 변수부터 없애는 것이 목표
    • 최소한의 변수를 포함하여 하기 때문의 나머지 변수들의 계수는 0이됨 (Feature Selection 기능)
    • 변수선택 기능이 있기에 일반적으로 많이 사용되는 이점이 있지만 특정변수에 대한 계수가 커지는 단점이 존재
    • 특정 변수만을 선택하는 방식이라 Ridge에 비해 다중공선성이 존재할 경우, 이에 취약함.

Lasso Regression 모델링

alphas = [0.01, 0.1, 1]

lass_coef_df = pd.DataFrame()

for alpha in alphas:
    lasso = Lasso(alpha = alpha)
    #학습
    lasso.fit(X_train_scaled, y_train)
    #예측
    pred_train = lasso.predict(X_train_scaled)
    pred_test = lasso.predict(X_test_scaled)
    print_metrics(y_train, pred_train, title=f'alpha:{alpha}-Train')
    print_metrics(y_test, pred_test, title=f'alpha:{alpha}-Test')
    print('-'*100)
    w_s = pd.Series(lasso.coef_, index=X_train.columns)
    lass_coef_df[f'alpha-{alpha}'] = w_s

  • alpha가 커질 수록 일부 가중치를 완전히 0으로 바꿔 제거하는 특성이 있음

alpha에 따른 각 변수의 가중치 변화

릿지와 랏소의 경사하강법 경로

라쏘의 경우 경사하강법의 경로가 최적값(빨간 네모)으로 가는 도중에 지그재그로 튀는 경향을 보이는데, 이는 θ2=0에서 기울기가 갑자기 바뀌기 때문이다. 그 이유는 라쏘의 비용함수가 θ1=0에서 미분가능하지 않기 때문인데, 이를 위해 서브그래디언트 벡터 (미분이 불가능한 지점 근방 그래디언트들의 중간값)를 사용할 수 있다.

Elastic Net

  • 추정할 계수(베타)의 제곱과 베타의 절대값을 더하고 그 값을 최소화
  • 릿지와 랏소를 절충한 모델로, 릿지와 랏소의 장점을 두개다 포함
  • 규제조건(정규화조건/패널티): 가중치의 절대값의 합과 제곱의 합을 최소화 (L1 Norm + L2 Norm)
    • 규제항에 릿지, 회귀 규제항을 더해서 추가

  • L1 norm과 L2 norm의 혼합정도를 r로 조정
    • r=0이면 릿지와 같고, r=1이면 라쏘와 같음.
  • 특징
    • 불필요한 변수를 없애주면서 베타의 크기도 조정하는 것이 목표
    • 큰 데이터셋에서 Ridge와 LASSO의 효과를 모두 반영하기에 효과가 좋음 (적은 데이터셋은 효과 낮음)

Elastic Net Regression 모델링

from sklearn.linear_model import ElasticNet

elastic = ElasticNet(alpha=0.1, l1_ratio=0.5)
elastic.fit(X_train_scaled, y_train)
pred_train = elastic.predict(X_train_scaled)
pred_test = elastic.predict(X_test_scaled)
print_metrics(y_train, pred_train, title='Train')
print_metrics(y_test, pred_test, title='Test')

 

 

참고문헌

728x90
반응형