🌞 Statistics for AI/Regularization

정규화 방법 : 엘라스틱 넷(Elastic Nets)

Data_novice 2024. 2. 16. 17:49

📌 Elastic Nets(엘라스틱 넷)


 

먼저 엘라스틱 넷에 대해 이해하기 위해 아래 내용을 참조해주시길 바랍니다. 이어지는 내용입니다.

엘라스틱 넷은 Ridge regression(릿지 회귀, $L_2$)와 LASSO(라쏘 회귀, $L_1$)을 cobination 한 것입니다.

 

◼️ Elastic nets 접근

 

엘라스틱넷의 solution은 아래와 같습니다.

$$
\frac1{2n} \sum_{i=1^n}(y_i-\beta_0-\sum_{j=1}^p \beta_j x_{ij})^2 + \lambda((1-\alpha)\frac12 \sum_{j=1}^p \beta_j^2 + \alpha \sum_{j=1}^p |\beta_j|)
$$

릿지의 제곱항과 라쏘의 절댓값항 모두를 포함합니다. $\lambda$뿐 아니라 $\alpha$라는 파라미터를 사용합니다.

$\alpha$값으로 릿지와 라쏘 사이의 정도를 조정해줍니다.

  • 만약 $\alpha =0$ 이면, ridge solution과 같아집니다.
  • 만약 $\alpha =1$ 이면, LASSO와 같아집니다.

 

◼️ With R

Auto 데이터를 이용한 mpg 예측

library(ISLR)
x = model.matrix(mpg~.,Auto)[,-1]
y = Auto$mpg

# name 열 제거
Auto = Auto[,!(names(Auto) %in% c('name'))]

Train, Test set 나누기 8:2

train = sample(1:nrow(x), 0.8*nrow(x))

dftrain = Auto[train,]
dftest = Auto[-train,]

Train data를 5-fold로

library(caret)
library(glmnet)

myfolds = createFolds(dftrain$mpg, k=5, returnTrain=T)

# Train set를 5-fold로 
mycontrol = trainControl(method='cv', number=5,
                         index=myfolds,
                         savePredictions = 'final')

model fitting 하기

# 알파와 람다값은 default값으로 지정.
fit = train(mpg~., data=dftrain, method='glmnet',
            trControl=mycontrol,
            tuneLength=3, preProcess=c('center', 'scale'))

fit

image

fit한 결과를 보시면 5-fold의 알파 값, 람다 값 각각 세가지 조합일떄 RMSE값이 나옵니다. 우리는 이 RMSE값이 최저인 것을 봐야겠죠.

best parameter 확인

# best lambda, alpha 값
best = fit$bestTune
best 
>> alpha    lambda
8     1 0.1256238

이는 8번째 조합인 알파 : 1, 람다 : 0.1256238 일때 최저의 RMSE를 갖는다는 의미 입니다.

Test set의 RMSE 확인하기

pred = predict.train(fit, dftest)
mean((dftest$mpg-pred)^2) 
>> 10.18244

최종 test set에 적용하였을 때는 10.18244 RMSE가 나오네요.