Programing/R- programming

다중회귀 LASSO regression, selection과 shrinkage

sosal 2015. 4. 25. 18:28
반응형

 

/*

 http://sosal.kr/
 * made by so_Sal
 */

 


 


 

이 글은 제가 공부하며 썼던 내용이라, 지금 보니 너무 허접해서

새롭게 포스팅해봤습니다.


Ridge, Lasso regularization을 공부하고 싶으신 분은 아래 링크를 보시길 추천드립니다.

http://sosal.kr/1104


---------------------------------------------------------



연구나 실험 등, 다양한 분야에 걸쳐서 '모형의 단순화'는 매우 중요하다.

간결함의 원리(principle of parsimony)는 어떤 실험 결과나 현상에 대해 설명할 수 있는 변수들이 많은 경우,

그것을 가장 잘 설명할 수 있는 변수는 결국 '간단한 설명' 혹은 '최소한의 설명'이 된다는 것이다. 

 

이는 14세기 초기 영국 철학자 윌리엄 오캄이 주장했다.

간결함의 원칙은 여러 설명변수를 면도날로 정리하여 최소한의 설명변수만 남겼기 때문에, 오캄의 면도날이라고 한다.

 

이는 바로, 어떤 현상을 설명하는 데 있어, 불필요하게 복잡한 가정을 세워서는 안된다는 것이 핵심이다.

 

 

 통계 모델링에서 간결함의 원리

- 복잡한 설명보다 단순하고 간단한 설명이 좋다.

- 모형에 있어서 모수는 가능한 적게 가지고 있어야 한다.

- 선형 모델이 비선형 모델보다 좋다.

- 적은 수의 가정을 가진 실험은 많은 가정을 가진 실험보다 좋다.

- 데이터로부터 회귀모델을 구할 때는 위해선 최소적합이 될 때까지 축소해야한다.

 

 

 

다중회귀에서 변수를 설정하는 기준은, 하나의 변수를 제거했을 때 편차가 유의하게 증가하는 경우에 유지하는 방법이 있다.

단순함을 추구하되, 맹목으로 추구하게 된다면 중요한 설명변수를 잃을 수 있다.

 

다중회귀의 최대모델을 적합한 다음, 아래의 모델링 단순화 작업중 1개 이상의 항목을 실행해야한다.

 

 단순화 작업 목록

- 유의하지 않은 교호작용 항목을 제거한다.

- 유의하지 않은 2차 또는 비선형 항목을 제거한다.

- 유의하지 않은 설명 변수를 제거한다.

- 유사한 모수값을 갖는 설명 변수를 통합한다.

 

 

이러한 오캄의 원칙에 관련된 회귀 방법론은 Subset selectionShrinkage가 있다.

 

위 방법론을 설명하기 전에 기본적인 회귀가 무엇인지 다 알겠지만, 간단히 짚고 넘어가고자 한다.








Linear regression


회귀의 기본 원리는 다음과 같이 선형 회귀모델의 직선과 실제 값 사이의 차를 뜻하는 residual error를 최소화 시키는 것이다.

 

 

 

 

단순 선형회귀라고 가정하고 얘기를 하자면, 결국 y값은 y = f(x) = ax + b 형태로 구해지는데,

선형모델과 실제 데이터와의 차이를 나타내는 residual error가 최소가 되는 error를 구하는 것이

일반적인 선형회귀 모델의 목표라고 할 수 있다.


전형적인 공식은 다음과 같다.

Linear regression: y= 1β0+Xβ+e


여기서 residual error를 최소로 하는 공식은 아래와 같이 나타낼 수 있다.


즉 위 값을 이 최소로 하는 β, β0를 구하는 것이 바로 선형회귀모델 y, f(x)를 구하는 것이고,

이를 RSS(Residual sum of squares) 라고 한다.

 

하지만 실제로 회귀모델을 만드는 경우에, 단일변수로 회귀모델링을 하는 경우보다는

다중회귀모델을 만드는 경우가 훨씬 흔하다.

 

예를 들어 커피숍에서 오늘의 아이스커피가 판매될 양(종속변수)을 구한다고 가정하면 그에 따른 독립변수는 아주 다양하다.

날씨, 기온, 요일, 계절부터 시작해서 오늘 TV 프로그램이 어떤것을 하는지, 재밌는 영화가 개봉되었는지, 하다 못해 오늘의 커피숍 알바생이 누구인지 까지 정말 다양한 독립변수를 둘 수 있다.

 

여기서 중요한 변수를 선정하고 중요하지 않은 변수를 버리는 작업이 바로 subset selection이다.

machine learning에 있어서는 Feature selection이라고 할 수 있다.

중요하지 않은 변수에 해당하는 coefficient의 절대값을 낮추는 방법은 shrinkage다.

 

- A개의 독립변수로부터 RSS(Residual sum of squares) 값이 최소가 되는 k개의 독립변수를 선정하는것.

- Forward stepwise selection: Intercept (y절편) 에서 부터 독립변수를 점차 늘려 모델의 성능을 향상시키는 방식

- Backward stepwise selection: 모든 독립변수를 사용하는 모델에서 독립변수를 줄여가며 모델의 성능을 향상시키는 방식

- k 선택방법: Forward, 혹은 Backward stepise selection을 진행하면서 모델로부터 구해진 F-ratio가 threshold이상 좋아지는 설명변수가 더이상 존재하지 않을 때가 최상의 k이다.

 

대표적인 회귀모델로는 lasso regression, ridge regression 이 있다.

1 (lasso) - 1-norm penalized least-squares criterion를 통해, linear regression coefficient를 조절한다.

The regularization parameter λ에 의해 shrinkage 정도가 조절되는데, 이때 0이 되는 변수들이 존재하기 때문에, subset selection이 된다고 할 수 있다.


2 (ridge regression) - 2-norm penalized least-squares criterion

λ에 의해 coefficient가 조절되지만, coefficient를 0으로 만들지는 않는다.

 

 

 

- LASSO Regression

 

LASSO(The least absolute shrinkage and selection operator)는 아래 공식에서 보듯 s라는 threshold보다 작다는 조건으로 최소제곱값이 구해진다.

 

 

결국 s가 클 경우에는 일반적인 linear regression과 비슷하거나 같은 모델을 만들것이다.

하지만 s가 작아질 경우에 (s>=0) 'shrunken' 된 최소제곱적합 모델이 만들어 질 것이다.

(또한 중요하지 않은 독립변수의  coefficient가 0이 되어 사라질 것이다. )

 

s를 결정하는것은 결국 regression model에 있어서 몇개의 predictor (독립변수)를 쓸 것이냐와 같은 문제이며,

cross validation 기법으로 최고로 좋은 s를 선택하는 방법이 있다.

 

s의 값이 연속적으로 변함에 따라 최소제곱적합 모델이 달라지기 때문에 coefficient 값들이 달라질 것이다.

그리고 유의할 점은 s가 정수단위로 값이 늘어날수록 독립변수의 개수가 늘어나게 된다는 것이다.

 

 

ridge regression은 역시 비슷한 개념이지만 자세한 설명은 링크로 남긴다.

 

http://statweb.stanford.edu/~tibs/lasso/simple.html

http://cran.r-project.org/web/packages/ridge/ridge.pdf

http://cran.r-project.org/web/packages/lars/lars.pdf

 


 

- 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)

 

> 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.