본문 바로가기
Book Review/[혼공머신] 리뷰

다중회귀 & 릿지, 라쏘회귀

by 3n952 2022. 12. 8.

 

이전 포스팅에서 선형 회귀에 대해 알아보았습니다.

이번 포스팅에서는 다중 회귀와 릿지, 라쏘 회귀를 알아보겠습니다.

 

이전 포스팅에서의 선형 회귀는 하나의 특성(feature)를 사용하여 모델에 학습시켰습니다.

하나의 특성만을 통해 회귀 모델을 만들어내는 것은 과소적합의 문제가 발생할 수 있습니다.

즉, 모델이 적절하게 학습하지 못한 것을 의미합니다.

이를 해결하기 위한 하나의 방법으로 다중회귀가 있습니다.


 

1. 다중 회귀

다중회귀는 여러 개의 특성을 사용한 선형 회귀를 의미합니다.

특성이 하나면 직선을 학습하고, 특성이 두개면 평면을 학습합니다.

그림1을 보면 더욱 쉽게 이해할 수 있습니다.

 

그림1) 다중회귀 예시

 

오른쪽 그림처럼 특성이 2개이면 타깃값을 기준으로 3차원 공간을 형성하고 선형 회귀 방정식은 직선이 아닌 

평면이 됩니다. 특성이 3개인 경우는 4차원의 공간이므로 그리기 어렵습니다. 수학적 계산을 통해 이해하고 상상하는 수 밖에 없습니다.

따라서, 다중회귀를 사용하면 특성이 많은 고차원에서 매우 복잡한 모델을 표현할 수 있다는 장점이 있습니다.

 

주어진 데이터에서 다양한 특성을 추가하고 만드는 과정을 특성 공학(feature engineering)이라고 합니다.

다중회귀에서 꼭 필요한 작업이라고 할  수 있습니다.

사람이 직접 특성을 곱하고 제곱하는 등의 계산을 통해 특성 공학을 직접할 수 있지만,

다행히도 사이킷런(scikit-learn)에서 이를 대신해주는 편리한 기능을 제공합니다.

 

바로, 사이킷런의 변환기(transformer)입니다.

우리가 다중회귀에서 사용할 변환기는 PolynomialFeatures클래스입니다.

이를 사용하기 위해 간단한 코드로 예시를 들어보겠습니다.

#사이킷런의 preprocessing패키지에 포함
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree = 5) #클래스 객체 생성, degree는 최고차항 지정 매개변수
poly.fit(train_input) #fit()#메서드로 특성 조합 찾기
poly.transform(train_input) #transform()메서드로 실제로 데이터를 변환하기

poly.fit_transform(train_input) #두가지 한번에 하기

poly.transform(test_input) #테스트세트 변환

다중회귀를 위한 특성 공학을 하려면 fit()을하고 transform()을 해야합니다.

이를 한번에 하기위해서는 fit_transform()을 사용하면 됩니다.

또한 주의해야 할 점은 테스트 세트를 변환 할 때도 훈련세트로 학습한 변환기(예제에서는 poly를 의미)를 사용해야 한다는 점입니다.

 

PolynomialFeature클래스로 특성이 어떻게 만들어졌는지 확인하고 싶으면, get_feature_names_out()메서드를 호출하면 됩니다.

예시 코드는 다음과 같습니다.

poly.get_feature_names_out()

 

 

 

하지만 다중회귀에서 특성을 너무 많이 사용하면 과대적합이 되는 문제를 일으킬 수 있습니다.

샘플에 비해 특성이 많아지면 과대적합이 되는 경우가 많습니다.

머신러닝에서 훈련 세트를 과도하게 학습하여 테스트 세트에 대해 잘 예측하지 못하는 경우를 과대적합(overfitting)되었다고 합니다.

 

 

이를 해결하기 위해서는 규제(regularization)이 필요합니다.

선형 회귀에서 규제가 이뤄지는 방식은 특성의 계수(기울기)의 크기를 작게 만드는 것입니다.

선형 회귀에서 규제를 추가한 모델에는 릿지(Ridge), 라쏘가(Lasso) 있습니다.

 

2.릿지 & 라쏘 회귀

 

릿지(Ridge)는 계수를 제곱한 값을 기준으로 규제를 적용하고,

라쏘(Lasso)는 계수의 절댓값을 기준으로 규제를 적용합니다.

 

이를 적용하는 방식에 대해서는 예제 코드를 통해 보여드리겠습니다.

릿지 예제 코드는 다음과 같습니다.

from sklearn.linear_model import Ridge

ridge = Ridge(alpha = 0.1) #alpha는 예시 값
ridge.fit(train_input, train_target) 
ridge.score(train_input, train_target) #R2값

여기서 하이퍼파라미터는 alpha로 이 값이 크면 규제 강도가 세져 계수값을 더욱 줄이게 되고, 이 값이 작으면 규제강도도 작아져 계수값을 덜 줄이게 될 것입니다.

 

 

라쏘도 릿지와 매우 유사하게 사용됩니다.

코드는 다음과 같습니다.

from sklearn.linear_model import Lasso

lasso = Lasso(alpha = 10)
lasso.fit(train_input, train_target)
lasso.score(train_input, train_target)

여기서 알아둬야할 점은 라쏘모델은 계수 값을 아예 0으로 가질 수 있다는 것 입니다.

따라서 계수가 0이 아닌 값을 가지는 계수는 유용한 특성으로 판단 될 수 있습니다.

이를 파악하기 위해 예제 코드로 설명하겠습니다.

 

print(np.sum(lasso.coef_ == 0))

lasso는 라쏘회귀 클래스의 객체입니다. coef_를 사용하면 각 특성의 계수가 나오는데 '== 0'의 비교연산자를 사용해서

True면 1, False면 0의 값을 반환하게 합니다.

그 이후 np.sum()을 통해 0의 값을 갖는 특성이 몇 개가 있는지 파악 할 수 있습니다.

 

 

이번 포스팅에서는 다중회귀를 통해 데이터에 적합한 모델을 만들어 보았습니다.

이 때 생길 수 있는 과대적합의 문제를 해결하기 위해  규제를 적용한 회귀 모델인 릿지와 라쏘를 알아보았습니다.