Programing/R- programming

Lasso, Ridge regularization - 회귀에서 selection과 shrinkage

sosal 2019. 1. 18. 20:24
반응형


Ridge regression과 Lasso regression은 선형회귀 기법에서 사용되는 Regularization이다.


그럼 Regularization은 무엇인가? 를 이해하기 위해, Bias와 Variance, 그리고 Overfitting부터 이해하도록 한다.



1. Bias vs Variance


1) Bias and Variance in Linear model


Bias는 학습된 모델이 Training data에 대해 만들어낸 예측값과, Training data값과의 Error를 말한다.

Variance는 학습된 모델이 Test data에 대한 예측값과, 정답과의 Error를 말한다.



따라서 위와같이 선형함수의 경우, Training data를 완벽하게 맞추지 못하며 Bias가 어느정도 있다는 것을 알 수 있다.

하지만 Variance 역시 적당히 Bias만큼 틀리는 것을 확인할 수 있다.


2) Bias and Variance in Non-linear model


비선형 모델같은 경우 Training data를 완벽하게 학습하여 Bias를 최소로 줄일 수 있다.


하지만 예제데이터의 경우, 비선형 모델로 학습하였을 때 Bias는 낮지만,

Variance가 굉장히 커짐을 알 수 있다.


이것이 바로 Overfitting이다.



따라서, 1-2) 예제의 비선형 함수의 경우는

Training dataset과, Validation dataset, Test dataset 3가지로 나누어

Training data 학습에 있어서 Validation dataset을 가장 잘맞추는 학습시점에서 학습을 멈춰야

Overfitting을 피할 수 있음을 알 수 있다.



Validation data set을 가장 잘 맞추는 시점에서 학습을 종료하여 과적합을 피한다!

위 말은 오직 Non-linear model에 대한 학습에 있어서, Overfit을 피하는 방법을 말한다.


그럼 선형함수도 Overfit이 있으며, 이를 피해야할까? 라는 질문을 할 수 있는데,

당연히 선형함수도 overfitting이 존재하며, 이를 피하는 방법론이 바로 Regularization이다.


(과거의 점진석 선택, 후진적 선택 등에 대한 고전적인 메소드는 설명하지 않습니다.)






2. Overfit in Linear model


당연히 선형함수도 overfitting이 존재한다고 설명했는데,

다음과 같은 극단적인 예를 들어보자.


주황색 점은 Training data이며,

회색 점은 Test data로 가정하자.


주황색 점에 대해서 mean Squared error (최소제곱 추정) 값을 통해 완벽하게 fitting하였기 때문에,

Bias = Low 임을 알 수 있고,

이는 Test data에 대해서 큰 Error를 만들어내며 Variance = High 임을 알 수 있다.

따라서 Training data에 대해 mean squared error (최소제곱 추정)가 Overfitting을 일으키는 요소가 된다.


즉, Bias가 너무 낮기 때문에 발생하는 문제이기 때문에, 

기존의 mean squared error로 정의된 object function에 penalty를 주게되면 이를 방지할 수 있다.



2-1) Ridge regularization



Linear regression은 Training data에 대해서 mean squared error값이 최소가 되는 것을 Object function으로 한다.

하지만 Ridge regression은 'Mean squared error' + lambda*coef^2 을 object function으로 한다.


그리고 ridge 선형방정식은 y = coef * lambda * x + intercept로 정의한다.


lambda가 0이면, y = intercept로 상수함수가 되며,

lambda가 1이면 선형regression과 동일한 모델을 만들것이다.


'Mean squared error' + lambda*coef^2 가 최소가 되는 lambda, coefficient, mean squared error를 구한다면

mean squared error 만으로 fitting된 모델보다 Bias가 클것이다.


위 예제에서만 보더라도, mean squared error로 fitting한 모델의 Bias는 0임을 알 수 있지만,

Ridge regression으로 fitting한 모델은 Bias가 생긴것을 확인할 수 있다.


하지만 Bias가 커짐으로써, Variance가 줄어듬을 알 수 있다.

이것이 바로 Ridge regularization이다.


결국 Bias를 포기하면서, Variance를 줄이는 것이다.





Ridge regression의 이해를 위해, 아래 그림이 가장 중요하다.



y = ax1 + bx2 + ..... + n

라고 가정할 때, y축은 x변수의 기울기에 해당하는 coefficient (a, b) 를 의미한다.

아래에 있는 x축은 penalty에 해당되는 lambda값이며, 상단의 9라고 적한것은 x변수의 종류 (feature의 수) 를 말한다.


Lambda penalty가 0으로 가까워질수록, penalty가 크다는 뜻이며

penalty가 커짐에 따라서 변수의 기울기 (coefficient)가 줄어듬을 알 수 있다.


Object function인 [ 'Mean squared error' + lambda*coef^2 ] 을 통해 최적의 lambda 값이 결정될 것이므로,

위 그래프 어딘가 아래 x축이 선택 됐을때, 모든 변수의 coefficient는 결정될 것이다.


다시한번 강조하면, Regularization에 의해서 기존에 Bias라고 할 수 있었던 mean squared error 값은 커진다.

하지만 Bias가 커짐으로써 Variance를 줄이는 효과를 가져다 줄 것이다.





2-2) Lasso regularization


보통 방향성을 고려하기 위해, 제곱의 합이 최소가 되는것을 통해 추정해나가는 것들이 많았다.

따라서 Ridge regression은 mean squared error + lambda*coef^2 값이 최소가 되도록 하는 lambda penalty를 통해

모든 변수의 coef (coefficient)를 구하는 것이 목표였다.


Lasso는 object function의 lambda*coef^2를 단순히 lambda*|coef| 로 바꾼 것이다.


* Object function

Ridge regression: mean squared error + lambda*coef^2 

Lasso regression: mean squared error + lambda*|coef|


차이점은 아주 간단하다.

Coef^2를 |coef|로 바꿔준 것 뿐이다.

두 모델 모두, 위 Object function이 최소가 되는 lambda, coef를 구하면 되는 것이다.


그럼 Ridge와 Lasso는 어떤 차이를 만들어낼까?

바로 아래의 그림을 보면, lambda에 따라 Lasso가 각 변수의 coefficient에 대해 어떤 영향을 끼치는지 알 수 있다.



Ridge regression과 동일하게, y축은 각 변수별 coefficient이다.

아래 x축의 값은 Lambda의 값이며, 역시 0에 가까워질수록 큰 penalty를 갖는다.

위의 x축은 coef값이 0이 아닌 변수의 수이다.


penalty값이 클수록 (lambda값이 작을수록) 모든 변수의 coefficient가 줄어드는 것은 ridge와 동일하다.

하지만 ridge는 공산주의처럼 lambda값이 0이 됐을때, 모두 동시에 coefficient가 0이 되지만,

Lasso는 lambda값이 0이 되기전에 이미 몇몇 feature의 coefficient가 0이 됨을 알 수 있다.


이는 Feature의 selection으로 표현할 수 있다.




기존 고전적인 방법론을 데이터분석에 적용해보면,

샘플에 비해 너무 많은 feature가 존재할 때, Feature selection step과 modeling step을 분리하여, 독립적으로 수행했다.


하지만 Ridge, Lasso 기법은 Modeling 과정에서 penalty를 줌으로써 coefficient의 값을 낮추며,

Bias값에 대해 손해를 보는 대신, Variance를 줄이기 위한 노력을 수행하는 것이다.


즉, Lasso는 Feature selection, Coefficient의 shrinkage를 modeling하는 과정에서 동시에 수행하는 모델이며,

Ridge는 coefficient shrinkage와 modeling을 동시에 수행하는 모델로 해석할 수 있다.












- LASSO regression vs linear regression 비교 실습

 

> install.packages("lars")

> library(lars)

> data(diabetes)

> attach(diabetes)

 

- 종속변수 목록 

> colnames(x)
 [1] "age" "sex" "bmi" "map" "tc"  "ldl" "hdl" "tch" "ltg" "glu"

# 이 변수들에 따라 당뇨 y값이 바뀝니다.

 

# 일반적인 linear regression model에 의한 coefficient
> coef_lm <- lm(y~x)
> coef_lm

Call:
lm(formula = y ~ x)

Coefficients:
(Intercept)         xage         xsex         xbmi        xmap          xtc         xldl         xhdl         xtch         xltg         xglu  
     152.13       -10.01      -239.82       519.84       324.39    -792.18     476.75       101.04      177.06      751.28       67.63  

 

# Lasso regression으로 s에 따른 coefficient 보기
> object <- lars(x,y,type="lasso")
> plot(object)




# 색이 있는 선들은 각각 독립변수의 regression coefficients를 뜻한다.

# x축은 s대신 shrinkage의 비율을 나타내고, 그 비율에 따라서 독립변수들의 coefficient가 달라진다.

# 물론 x축에 따라서 독립변수의 ±가 달라질 수도 있다.

 

# 결국 s에 따라서 coefficient가 변하거나, 혹은 값이 0이 되어 독립변수가 제거되어, subset selection이 되는 모습을 확인할 수 있다.

 

# s=4, 3개의 독립 변수만 사용할 때 coefficients

> coef_lars <- coef(object, s=4)

> coef_lars
      age       sex        bmi         map        tc           ldl          hdl       tch           ltg        glu 
  0.00000   0.00000 434.75796  79.23645   0.00000   0.00000   0.00000   0.00000 374.91584   0.00000 

# s=3, 2개의 독립 변수만 사용할 때 coefficients

> coef_lars <- coef(object, s=3)
> coef_lars
     age      sex       bmi         map       tc        ldl        hdl        tch       ltg         glu 
  0.0000   0.0000  361.8946   0.0000   0.0000   0.0000   0.0000   0.0000 301.7753   0.0000 

 

 

 

 

# CP CP-λ Curve를 이용하여 최적의 regression model 선정하기

Detail: http://mstudioblackboard.tudelft.nl/duwind/Wind%20energy%20online%20reader/Static_pages/Cp_lamda_curve.htm

 

> plot(object, plottype="Cp")





plottype="Cp"를 이용하면 |beta|/max|beta|값에 따른 Coefficint의 power를 알 수 있다.

위 그래프에선 8번째의 Cp가 가장 좋다. 하지만 Cp가 절대적이진 않다고 한다.

 

 

> round(object$beta,4) 



# Cp를 활용한 최적의 coefficient set

> coef(object,s=9)
     age          sex          bmi          map             tc          ldl           hdl           tch            ltg          glu 
0.00000 -226.13366  526.88547  314.38927 -195.10583    0.00000 -152.47726  106.34281  529.91603   64.48742

 

 

---------------- 2016.01.21 추가

 

 

 

Lasso에서 cross validation을 이용하여 최적의 모델 찾아내기

(10 fold - Cross-validation이란, 전체 데이터에서 10개의 샘플로 쪼갠다음, 9개의 셈플로 모델을 만들고, 나머지 1개의 샘플로 모델을 테스트하는 방법이다. 10개의 샘플로 9/1로 나누는 모든 조합에 대해서 테스트를 하여, Error를 도출해낸다.)

 

> cv <- lars::cv.lars(x, y, plot.it = FALSE, mode = "step")
> idx <- which.max(cv$cv - cv$cv.error <= min(cv$cv))
> coef(lars::lars(x, y))[idx,]

> coef(lars::lars(x, y))[idx,]
     age         sex           bmi         map            tc          ldl            hdl         tch            ltg          glu 
0.00000  -74.91651  511.34807  234.15462    0.00000    0.00000 -169.71139    0.00000  450.66745    0.00000

 

 

 

 

 

 

glmnet: Lasso and Elastic-Net Regularized Generalized Linear Models

https://cran.r-project.org/web/packages/glmnet/index.html

 

> install.packages("glmnet")
> library(glmnet)

> data(diabetes)

> attach(diabetes)




> cvfit <- cv.glmnet(x, y)
> coef(cvfit, s = "lambda.1se")

11 x 1 sparse Matrix of class "dgCMatrix"
                     1
(Intercept)  152.13348
age            .      
sex          -51.33499
bmi          509.50955
map          220.64138
tc             .      
ldl            .      
hdl         -152.19412
tch            .      
ltg          447.22918
glu            .     

 

오랜만에 Lasso 써보려고 하다가 glmnet 내용 추가해봅니다.

> coef(cvfit, s = "lambda.1se")

> coef(cvfit, s = "lambda.min")

 

lambda.min은 Cross-validation에서 에러가 최소로 나타나는 람다값을 찾아준다.

 

lambda.1se는 Standard error가 가장 Regularized 된 모델이 되는 람다값을 찾아준다.

(한글로 전달하기 힘들기 때문에, 전체 문장을 인용해드리면 다음과 같습니다.)

 

lambda.min is the value of λ that gives minimum mean cross-validated error. The other λ saved is lambda.1se, which gives the most regularized model such that error is within one standard error of the minimum. To use that, we only need to replace lambda.min with lambda.1se above.