Shrinkage Method

2021. 1. 23. 11:14머신러닝

반응형

앞선 포스팅(direction-f.tistory.com/75)에서 다루었던 Subset Selection은 Dicrete Process이기 때문에 중요한 변수가 무시 될수도 있고, 중요하지 않은 변수가 중요하게 판단 될 수 도 있습니다. 따라서 이러한 단점을 보완하기 위한 방법은 Shrinkage Method가 있습니다. 이 는 Continuous Process이고 우리가 Control하기 어려운 변동이 클 때 효과적으로 작동하게 됩니다. 

Shrinkage Method에는 대표적으로 Ridge regression과 Lasso Regression이 있습니다.

[Ridge Regression]

Ridge Regression은 least squares와 유사항 형태를 가지고 있습니다. 다만 우리가 추정하고자 하는 Coefficients에 Penalty를 부과함으로써 유사하지만 아래와 같이 다른 형태의 최적화를 수행하게 됩니다.

위 최적화 문제는 아래의 최적화 문제와 같습니다.

Ridge Regression에서는 $\lambda$를 이용하여 shrinkage효과를 조절하게 됩니다. 만약 $\lambda$가 0이라면 ols추정과 동일한 결과를 얻을 것입니다. $\lambda$가 점점 커짐에 따라 shrinkage 효과가 커지게 되고 Ridge Regression 계수들이 0에 가까워 질 것입니다. 

Ridge Regression 추정을 위한 RSS 및 추정 계수를 Matrix form으로 나타내면 아래와 같습니다. Matrix form으로 나타낼 때, Interception은 제외한 후 추정하게 되빈다. 따라서 X는 p개의 columns을 갖게 됩니다.(p+1이 아닙니다.)

Python을 활용하여 Ridge Regression을 추정해보겠습니다.

from sklearn.linear_model import Ridge
from sklearn.linear_model import Lasso
from sklearn.datasets import make_regression
import pandas as pd

## Making sample data 
X, y = make_regression(n_samples=1000, n_features=5, n_informative=2, n_targets=1, random_state=1, noise=0.5)
print(X.shape, y.shape)

## lambda=0.1
ridge_reg = Ridge(alpha = 0.1)
ridge_reg.fit(X,y)
ridge_reg.coef_ 
'''array([-3.35029458e-03,  3.13881953e+01,  7.27206489e+01, -1.97235937e-02,1.91059557e-03])'''

## lambda=1000
ridge_reg2 = Ridge(alpha = 1000)
ridge_reg2.fit(X,y)
ridge_reg2.coef_
'''array([-0.03997483, 15.26863272, 34.74594976,  0.77241542, -0.121535  ])'''

## lambda=1000000
ridge_reg3 = Ridge(alpha = 1000000)
ridge_reg3.fit(X,y)
ridge_reg3.coef_
'''array([-0.00013307,  0.02972212,  0.06652611,  0.00304806, -0.00062704])'''

Ridge Regression은 위에서 확인한 것과 같이 정확히 0의 값을 주지 않습니다. 따라서 우리가 p개의  Feature set을 갖고 있다면 유의한 Feature를 결정하는데 활용기보다는 기본적으로 우리가 보유하고 있는 p개의 Feature set을 모두 활용하게 됩니다. 다만 계수의 크기에 대해 Penalty를 주는 형태로 작동하게 됩니다.

따라서 이러한 점을 보완하기 위해 Lasso Regression을 활용하게 됩니다.

[Lasso Regression]

Lasso Regression도 Ridge Regression과 같이 Coefficients에 Penalty를 부과하게 됩니다. 다만 2차 함수의 형태가 아닌 절대값 형태로 Penalty를 부과한다는 것인 Ridge와 Lasso의 차이점입니다. 

 Lasso의 계수는 아래와 같이 정의 됩니다.

위 최적화 문제는 아래의 최적화 문제와 같습니다.

Python을 활용하여 Lasso Regression을 추정해보겠습니다.

## lambda=0.1
lasso_reg = Lasso(alpha = 0.1)
lasso_reg.fit(X,y)
lasso_reg.coef_
'''array([-0.        , 31.28811084, 72.6175003 , -0.        ,  0.        ])'''

## lambda=1000
lasso_reg2 = Lasso(alpha = 1000)
lasso_reg2.fit(X,y)
lasso_reg2.coef_
'''array([-0.,  0.,  0.,  0., -0.])'''

Lasso로 추정 시 쉽게 0의 값을 주는 것을 확인 할 수 있습니다. 이렇게 Featured의 Coefficienct를 0으로 만들어 유의한 Feature 개수를 정하고 싶을 때는 Lasso를 적용하는 것이 좋은 방안이 될 수 있습니다.

이와 같이 Ridge와 Lasso가 다른 결과를 내는 것은 제약조건의 차이로 볼 수 있습니다. 

An Introudction to Statistical Learning with Application in R

위 그림에서  좌측이 Lasso이고 우측이  Ridge입니다. 제약조건 영역을 확인해보면 Lasso가 Sharp한 점을 가지고 있고  Ridge는 꼭지점을 가지지 않는 원형태를 가지고 있음을 확인 할 수 있습니다. 따라서 Lasso같은 경우는 쉽게 어떤 한 계수를 0으로 만드는 경우가 발생하지만 Ridge같은 경우는 $\lambda$가 엄청 큰 값을 가지지 않을 때는 쉽게 특정 계수가 0이 되지 않습니다.

반응형