본문 바로가기

데이터 다루기/Base of R

[R] Ridge, Lasso, ElasticNet Regression

728x90
반응형
#ridge, lasso, elastic
install.packages("glmnet"); install.packages('dplyr');
library(glmnet)
library('dplyr')

glmnet 패키지는 Ridge, Lasso, ElasticNet Regression에 대한 함수를 제공하는 패키지입니다.

dplyr 패키지는 데이터 전처리에 자주 사용되는 패키지구요.

prostate<-read.csv("Prostate_Cancer_data.csv")
head(prostate)

      lcavol  lweight age      lbph svi       lcp gleason pgg45       lpsa
1 -0.5798185 2.769459  50 -1.386294   0 -1.386294       6     0 -0.4307829
2 -0.9942523 3.319626  58 -1.386294   0 -1.386294       6     0 -0.1625189
3 -0.5108256 2.691243  74 -1.386294   0 -1.386294       7    20 -0.1625189
4 -1.2039728 3.282789  58 -1.386294   0 -1.386294       6     0 -0.1625189
5  0.7514161 3.432373  62 -1.386294   0 -1.386294       6     0  0.3715636
6 -1.0498221 3.228826  50 -1.386294   0 -1.386294       6     0  0.7654678

Prostate_Cancer_data 데이터를 사용합니다.

Regression으로 8개의 x변수로 lpsa를 예측하는 문제입니다.

y <- prostate$lpsa
x <- prostate %>% select(lcavol, lweight, age, lbph, svi, lcp, gleason, pgg45) %>% data.matrix()
lambdas <- seq(0, 0.3, by = .05)

y 와 x를 정의하고, Ridge, Lasso, ElasticNet Regression의 hyperparameter인 lambda 값을 0~0.3까지 0.05 간격으로 지정해줄게요.

 

cv_fit <- cv.glmnet(x, y, alpha = 0, lambda = lambdas)
#alpha =0 ridge, =1, lasso, =0.5 elasticnet
#cv.glmnet() uses cross-validation to work out how well each model generalises, which we can visualise as:

cv.glmnet 함수는 Ridge, Lasso, ElasticNet Regression를 cross validation 방법을 사용해 적합합니다.

그리고, alpha 변수를 통해, 어떠한 방법을 사용할지 지정할 수 있습니다.

plot(cv_fit)
#그려지는 그림에서 가장 낮은 점이 최적의 람다이다
#CV에서 오차를 가장 최소화하는 로그 람다값

cv_fit 변수를 그래프로 그림으로써, 최적의 lambda값을 정할 수 있습니다.

빨간 점이 가장 낮은 지점이 Cross validation MSE 를 가장 작게하는 lambda입니다.

opt_lambda <- cv_fit$lambda.min
opt_lambda #테스트 set이 시행할때마다 바뀔수 있어 값이 바뀐다.

[1] 0.1

lambda = 0.1 이 최적의 값으로 선택됩니다.

Cross validation의 특징상 같은 코드를 사용하더라도, 결과는 약간 차이가 생길 수 있어요.

fin<-glmnet(x,y,alpha=0, lambda = opt_lambda)
coef(fin)

9 x 1 sparse Matrix of class "dgCMatrix"
                      s0
(Intercept)  0.454881479
lcavol       0.500694281
lweight      0.439764444
age         -0.014561128
lbph         0.093398369
svi          0.680311397
lcp         -0.029527289
gleason      0.063336914
pgg45        0.003345245

최적의 lambda값을 활용하여, 최종 모델의 coefficient를 출력할 수 있습니다.

반응형