본문 바로가기
ADP로ML정리

4-1. 회귀 모델 - 규제가 있는 선형 회귀

by hits_gold 2024. 2. 19.
반응형

1. 다중 회귀(Multiple Regression)

 종속변수에 영향을 미치는 다중의 독립변수가 있는 경우의 회귀분석을 말한다. 다중 회귀에서는 최적모델 결정을 위해 다양한 방법으로 변수를 선정하고, 모델이 복잡해지면  과적합의 가능성이 있어 이를 방지하고자 다양한 규제를 적용해 모델의 가중치를 제한한다.

 

1.1.릿지 Ridge

  • 최소 제곱 적합식에 L2 페널티를 추가한 것이다.
  • L2인 두 번째 항은 θ의 추정치를 0으로 수축하는 효과를 준다.
    • 이 규제는 학습에만 사용되며 모델의 성능은 페널티가 없는 지표로 평가한다.
  • α=0일 때 페널티항이 없어져 선형 회귀와 같아진다.
  • α가 커질수록 규제항의 영향이 커져 릿지 회귀계수 추정치는 0에 가까워지므로 데이터의 평균을 지나는 선을 만든다.
  • α가 증가하면 편향은 증가하지만 분산은 감소해 데이터의 작은 변화에 회귀계수 추정치가 크게 변하는 문제를 극복할 수 있다.
from sklearn.datasets import load_diabetes
import pandas as pd
import numpy as np

diabetes = load_diabetes()
x = pd.DataFrame(diabetes.data, columns = diabetes.feature_names)
y = diabetes.target

from sklearn.linear_model import Ridge
alpha = np.logspace(-3, 1, 5)

data = []
for i, a in enumerate(alpha):
    ridge = Ridge(alpha=a)
    ridge.fit(x, y)
    data.append(pd.Series(np.hstack([ridge.coef_]))) # 회귀계수 출력
    
df_ridge = pd.DataFrame(data, index=alpha)
df_ridge.columns = x.columns
df_ridge # 각 회귀계수가 alpha가 커질 수록 0에 수렴 중

 

2.2. 라쏘 Lasso

Ridge는 모든 회귀계수를 0으로 수렴시키지만 0으로 만들지 않는다. 변수의 개수가 매우 많은 데이터셋으로 Ridge를 사용한다면, 결과 해석에 어려움이 발생할 수 있어 이러한 문제르 ㄹ해결하기 위해 Lasso를 사용한다.

  • Lasso는 최소 제곱 적합에 L1 페널티항의 추가한다.
  • 이 L1 페널티는 α가 충분히 클 때 계수 추정치들의 일부를 0이 되게 한다.
  • 덜 중요한 특징은 특성의 가중치를 제거할 수 있다.
from sklearn.linear_model import Lasso

alpha = np.logspace(-3, 1, 5)

data = []
for i, a in enumerate(alpha):
    lasso = Lasso(alpha=a)
    lasso.fit(x, y)
    data.append(pd.Series(np.hstack([lasso.coef_]))) # 회귀계수 출력
    
df_lasso = pd.DataFrame(data, index=alpha)
df_lasso.columns = x.columns
df_lasso # 각 회귀계수가 alpha가 커질 수록 0에 수렴 중
         # 규제가 강해질 수록(alpha가 커질 수록) 제외되는 변수가 많아짐

 

import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression

plt.figure(figsize = (20, 12))

plt.axhline(y=0, linestyle = '--', color = 'black', linewidth=2)

plt.plot(df_lasso.loc[0.001], '^-', label='Lasso alpha = 0.001')
plt.plot(df_lasso.loc[1], 'd-', label='Lasso alpha = 1')
plt.plot(df_lasso.loc[10.000], 's-', label='Lasso alpha = 10')

plt.plot(df_ridge.loc[0.001], '*-', label='Ridge alpha = 0.001')
plt.plot(df_ridge.loc[1], 'd-', label='Ridge alpha = 1')
plt.plot(df_ridge.loc[10.000], 'o-', label='Ridge alpha = 10')

lr = LinearRegression()
lr.fit(x, y)

plt.plot(lr.coef_, label = 'LinearRegression')
plt.xlabel('Feature names')
plt.ylabel('Coefficient size')
plt.legend(bbox_to_anchor=(1, 1))

 

3.3. 엘라스틱넷 Elastic Net

엘라스틱넷은 릿지와 라쏘를 절충한 알고리즘이다. 두 알고리즘의 페널티항을 단순히 더하고, 하이퍼파라미터를 사용해 두 페널티항을 조절한다.

  • 일반적으로 규제가 약간이라도 있는 것이 대부분의 경우에 좋아 평범한 선형 회귀는 피하는 것이 좋음
  • 기본적으로는 Ridge 사용
  • 특성이 몇 개뿐이라고 의심될 떄는 -> Lasso or ElasticNet
  • 특성 수가 훈련 샘플 수보다 많거나 특성 몇 개가 강하게 연관되어 있을 때는 -> Lasso < ElasticNet
from sklearn.linear_model import ElasticNet

alpha = np.logspace(-3, 1, 5)

data = []
for i, a in enumerate(alpha):
    ela = ElasticNet(alpha=a, l1_ratio=0.5)
    ela.fit(x, y)
    data.append(pd.Series(np.hstack([ela.coef_]))) # 회귀계수 출력
    
df_ela = pd.DataFrame(data, index=alpha)
df_ela.columns = x.columns
df_ela # 각 회귀계수가 alpha가 커질 수록 0에 수렴 중
         # 규제가 강해질 수록(alpha가 커질 수록) 제외되는 변수가 많아짐

 

반응형