본문 바로가기

파이썬/파이썬 기초

릿지 회귀, 오버피팅 방지를 위한 선형회귀 모델 규제

통상적으로 모델의 복잡도가 커지면 분산은 커지고 편향은 작아진다. 반대로 모델이 단순해지면 분산은 작아지고 편향은 커진다. 이렇게 분산과 편향은 서로 트레이드 오프 관계에 있다.

 

 

★먼저 읽어보면 좋은 글

편향-분산 트레이드오프 개념과 MSE

그리드 서치로 최적의 하이퍼파라미터 찾기

 

 

머신러닝에서 경계해야 할 것 중 하나가 바로 오버피팅이다.

train data에 지나치게 훈련이 되면 과대적합이 발생해 새로운 test data를 잘 예측하지 못하게 된다.

 

 

이러한 오버피팅을 방지하기 위한 방법 중 하나가 바로 모델을 규제하는 것이다. 선형 회귀 모델에서는 모델의 가중치를 제한함으로써 규제한다. 규제 방법에는 릿지, 라쏘, 엘라스틱넷 3가지가 있다.

 

 

오늘은 그 첫번째인 릿지에 대해 살펴보자.

 


 

릿지 회귀의 규제는 L2규제라고도 한다. 가중치의 절대값을 최대한 작게 만들어 모든 특성이 출력에 주는 영향을 최소화하는 방식이다.

 

 

위는 릿지 회귀의 비용함수이다. 규제항이 비용함수에 추가되었으며 규제항은 훈련하는 동안에만 비용 함수에 추가 되고 훈련이 끝난 후 모델의 성능을 평가할 때는 규제가 없는 성능 지표로 평가한다. 

 

 

출처: 핸즈온머신러닝

 

하이퍼파라미터 α는 모델을 얼마나 규제할지를 조절하는 것으로 α=0이면 선형 회귀와 동일하다. (규제가 없음)

보다시피 알파가 커질수록 회귀모델이 직선에 가까워진다. 알파가 너무 크면 모델이 너무 단순해 과소적합 문제가 발생할 수 있다.

 

 

즉, α가 커질수록 모델의 분산은 줄어들고 편향은 커진다.

 

 

 

릿지 회귀는 입력 특성의 스케일에 매우 민감하기 때문에 수행 전에 StandardScaler, RobustScaler 등을 이용해 꼭 스케일링 작업을 해주는 것이 필요하다. (라쏘, 엘라스틱넷도 마찬가지)

 

 

전처리를 완료한 heart 데이터로 릿지를 실습해봤다.

적절한 알파값을 찾기 위해 그리드 서치를 사용했다.

from sklearn.linear_model import Ridge
from sklearn.model_selection import GridSearchCV

ridge = Ridge()
params = {'alpha' : [0.5, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] }
gridsearch = GridSearchCV(ridge, param_grid = params)
gridsearch.fit(X_train, y_train)

ridge_estimator = gridsearch.best_estimator_
y_pred = ridge_estimator.predict(X_test)

print(gridsearch.best_params_)
print(ridge_estimator.score(X_test, y_test))
>>>{'alpha': 3}
>>>0.5666196928308294

 

최적의 알파값은 3, R^2 값은 0.56이다.

 

 

그러면 규제가 없는 선형회귀 모델과 성능을 비교해보자.

 

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(X_train, y_train)

lin_reg.score(X_test, y_test)
>>>0.5381802453978968

 

큰 차이는 없지만 릿지가 일반 선형회귀에 비해 성능이 조금 더 나은 것을 확인할 수 있다.