Python/Sklearn for ML

5 - LASSO Regression & Parameters(라소 회귀분석에 대하여 및 파라미터 선택) using Python

MINSU KANG 2020. 3. 29. 11:43

지난번 포스팅까지를 통해서 Ridge Regression 및 Penalty를 통해서 단순 다중 선형회귀분석 뿐만 아니라 이러한 회귀분석이 왜 필요한지에 대해서 살펴보았다

 

이번 포스팅에서는 Ridge Regression이 아닌 LASSO(Least absolute shrinkage and selection operator) Regression을 살표보고 파라미터 선택방법에 대해서 어떻게 하는지 파이썬을 활용하여 살펴보겠다

 

LASSO Regression의 경우 Cost Function이 L1 Regularization으로 Penerlty가 절대값으로 되어있는 것을 알 수 있다. 절대값함수는 제곱의 함수와는 다르게 0을 선택값으로 가질 수 있기 때문에(4 - Penalty 포스팅 참조) Cost의 최소화를 위해서라면 Wj(독립변수의 계수)가 0이 될 수 있다는것을 참고하기 바란다.

 

단순히 Ridge Regression의 경우 Cost Function의 최소화를 위해서라면 매우 작은 값을 Wj에 설정했지만, LASSO의 경우 0으로 만들 수 있기에 독립변수를 선택하는 과정에서 많이 사용되는 방법이라고 할 수 있다.

 

왼쪽 그림은 LASSO의 Cost Function이고 오른쪽 그림은 Ridge의 Cost Function을 나타냄

위 그림을 살펴보면 빨강색 선이 패널티가 제외된 Cost가 일정한 부분을 나타내며 초록색 부분은 '람다'를 반영한 패널티가 포홤되 RSS를 나타낸다. 위의 그림을 보면 알 수 있듯이 LASSO의 경우 최적값이 모서리에 나타날 확률이 Ridge에 비해 높기 때문에 몇몇 유의미하지 않는 변수들에 대해 계수를 0에 가깞게 추정해주어 종속변수를 설명하는데 있어 독립변수를 효과적으로 선택하는 기능을 제공한다.

 

이제 파이썬을 통해 LASSO REgression 구현 및 람다를 설정하는 방법을 살펴보자. 참고러 람다를 구하는 방법은 Cross Validation이며 Ridge Regression 포스팅에서 보여줬던 방식과 유사하다. 그리고 Cross Validation은 다음번 포스팅에서 제대로 살펴보겠다

 


import numpy as np
from sklearn.datasets import make_regression

reg_data, reg_target = make_regression(n_samples=200, n_features=500, n_informative=5, noise=5) #임의의 데이터를 만든다

from sklearn.linear_model import Lasso

lasso=Lasso() # LASSO 모형 설정
lasso.fit(reg_data, reg_target)
#%%
np.sum(lasso.coef_ !=0)

'''
np.sum의 결과값은 '11'이다. 즉, 실제 500개의 독립변수 중에서 계수가 0인 갯수가 아닌것이 11개임을
의미한다
'''

#%%

lasso_0 = Lasso(0) #여기서 LASSO 함수에 input값을 0으로 하면, 람다가 0이 된다
lasso_0.fit(reg_data, reg_target)
np.sum(lasso_0.coef_ !=0 )
'''
LASSO 함수에 람다를 0으로 설정했으니 당연히 np.sum의 결과값은 위에와는 다르게 500으로 나타난다
'''

#%%

from sklearn.linear_model import LassoCV
lassocv = LassoCV() #Cross Validation을 통해서 lambda값을 설정한다
lassocv.fit(reg_data, reg_target)
#%%

lassocv.alpha_ #Cross Validation을 통해 추출한 lambda값
#%%
lassocv.coef_[:5]
np.sum(lassocv.coef_ !=0)
'''
실제 위에서 추출된 람다값은 0.64정도이며 이에 따라 독립변수의 계수가 0이 될 확률은
더욱 높아졌다. 위의 np.sum의 값은 34개이며, 이는 독립변수의 계수가 0인 아닌것은 것은 총 34개라는
의미
'''

#%%

mask = lassocv.coef_ != 0
new_reg_data = reg_data[:, mask]
new_reg_data.shape