본문 바로가기

Programming/R

Shrinkage Methods using R

<Shrinkage Methods>

Shrinkage Methods 로 대표적인 방법은 ridge regression 과 lasso이다. 이들은 각각 선형다중회귀식에 각각의 제약을 부과하여 비교적 영향력이 약한 변수들의 효과를 약화시키는 효과를 준다. 이때 이러한 제약의 정도를 대표하는 값을 lambda라고 두었다.

이를 R에서 구현한 함수들을 알아보자.

 

먼저 사전작업이 필요하다. 입력데이터 행렬을 만들어 줘야한다.

x <- model.matrix(y~., data)[,-1]

* x 행렬의 1열은 모든 값이 1로 된 벡터이다. (intercept산출을 위한) 이 열은 회귀함수의 인자로 넣을 때 제외한다.

 

 ridge, lasso를 적용할 때 이용하는 함수는 glmnet 라이브러리의 glmnet 함수이다.

 

grid = 10^seq(10,-2, length = 100)

ridge.mod <- glmnet(x,y, alpha = 0, lambda = grid) # alpha = 0이면 ridge regression시행

lasso <- glmnet(x,y, alpha = 1, lambda = grid) # alpha = 1이면 lasso 시행

이 때 lambda = grid는 glmnet 함수가 lambda 탐색을 grid 수열 값 중에서만 탐색하도록 한다. 이 인자를 설정하지 않아도 default 범위 내에서 함수가 작동은 되지만, 대부분의 경우를 cover 하는 grid라는 범위를 새로 설정하였다.

 

in:
names(ridge.mod)

out: 
[1] "a0"        "beta"      "df"        "dim"       "lambda"    "dev.ratio" "nulldev"  
[8] "npasses"   "jerr"      "offset"    "call"      "nobs" 



in:
coef(ridge.mod)
#예시이다
out:

20 x 100 sparse Matrix of class "dgCMatrix"
   [[ suppressing 41 column names ‘s0’, ‘s1’, ‘s2’ ... ]]
                                                                                 
(Intercept)  5.359257e+02  5.359256e+02  5.359256e+02  5.359254e+02  5.359253e+02
AtBat        5.443467e-08  7.195940e-08  9.512609e-08  1.257511e-07  1.662355e-07
Hits         1.974589e-07  2.610289e-07  3.450649e-07  4.561554e-07  6.030105e-07
HmRun        7.956523e-07  1.051805e-06  1.390424e-06  1.838059e-06  2.429805e-06
Runs         3.339178e-07  4.414196e-07  5.835307e-07  7.713931e-07  1.019736e-06
RBI          3.527222e-07  4.662778e-07  6.163918e-07  8.148335e-07  1.077162e-06
Walks        4.151323e-07  5.487803e-07  7.254552e-07  9.590089e-07  1.267753e-06
Years        1.697711e-06  2.244274e-06  2.966798e-06  3.921931e-06  5.184561e-06
CAtBat       4.673743e-09  6.178412e-09  8.167496e-09  1.079695e-08  1.427293e-08
CHits        1.720071e-08  2.273832e-08  3.005872e-08  3.973585e-08  5.252844e-08
CHmRun       1.297171e-07  1.714783e-07  2.266842e-07  2.996631e-07  3.961369e-07
CRuns        3.450846e-08  4.561814e-08  6.030449e-08  7.971898e-08  1.053838e-07
CRBI         3.561348e-08  4.707892e-08  6.223556e-08  8.227173e-08  1.087584e-07
CWalks       3.767877e-08  4.980911e-08  6.584471e-08  8.704281e-08  1.150654e-07
LeagueN     -5.800263e-07 -7.667601e-07 -1.013611e-06 -1.339933e-06 -1.771310e-06
DivisionW   -7.807263e-06 -1.032074e-05 -1.364341e-05 -1.803579e-05 -2.384225e-05
PutOuts      2.180288e-08  2.882212e-08  3.810115e-08  5.036747e-08  6.658282e-08
Assists      3.561198e-09  4.707694e-09  6.223294e-09  8.226828e-09  1.087538e-08
Errors      -1.660460e-08 -2.195031e-08 -2.901702e-08 -3.835881e-08 -5.070811e-08
NewLeagueN  -1.152288e-07 -1.523253e-07 -2.013646e-07 -2.661912e-07 -3.518874e-07

#coef(ridge.mod)는 각 lmabda 값에 따른 회귀계수를 산출한다.

 

그럼 우리의 궁금증은 이것이다.

 

test error 값을 최소로 하는 lambda 의 값은 무엇인가? 


이때 다시 등장하는 개념이 이전에 배웠던 cross validation 이다.

cross validation으로 test error을 최소화하는 lambda를 찾아보자.

 

cv.out <- cv.glmnet(x_train,y_train, alpha = 0) #각 lambda에 따른 cv error 값 측정
bestlam <- cv.out$lambda.min #cv error 가 최소인 lambda 산출

# 이 bestlam 값을 가지고 최적의 ridge regression 모델을 찾자.
ridge.pred <- predict(ridge.mod, s = bestlam , newx = testset)
# 각 예측변수에 대한 결과 예측값 산출
ridge.pred <- predict(ridge.mod, s = bestlam , newx = testset, type = 'coefficients')
#모델의 계수를 반환

간단히 이러한 문법으로 lasso, ridge regression 적합을 수행할 수 있다

'Programming > R' 카테고리의 다른 글

Subset selection using R : regsubsets()  (0) 2022.05.08
Resampling using R : Cross-validation / Bootstrap  (0) 2022.05.08
R을 이용한 Classifiers : LDA, QDA, NaiveBayes  (0) 2022.05.08
R : lm() / glm()  (0) 2022.05.07