glmnet
within caret
을 사용하여 최적의 람다를 검색 cv.glmnet
하고 동일한 작업을 수행하는 것을 비교하는 데 많은 혼란이있는 것 같습니다 .
다음과 같은 많은 질문이 제기되었습니다.
분류 모델 train.glmnet 대 cv.glmnet?
캐럿과 함께 glmnet을 사용하는 올바른 방법은 무엇입니까?
`caret`를 사용한 교차 유효성 검사`glmnet`
그러나 질문의 재현 가능성으로 인한 답변이 없습니다. 첫 번째 질문에 이어 비슷한 예를 들지만 같은 질문이 있습니다. 추정 된 람다는 왜 다른가?
library(caret)
library(glmnet)
set.seed(849)
training <- twoClassSim(50, linearVars = 2)
set.seed(849)
testing <- twoClassSim(500, linearVars = 2)
trainX <- training[, -ncol(training)]
testX <- testing[, -ncol(testing)]
trainY <- training$Class
# Using glmnet to directly perform CV
set.seed(849)
cvob1=cv.glmnet(x=as.matrix(trainX),y=trainY,family="binomial",alpha=1, type.measure="auc", nfolds = 3,lambda = seq(0.001,0.1,by = 0.001),standardize=FALSE)
cbind(cvob1$lambda,cvob1$cvm)
# best parameter
cvob1$lambda.mi
# best coefficient
coef(cvob1, s = "lambda.min")
# Using caret to perform CV
cctrl1 <- trainControl(method="cv", number=3, returnResamp="all",classProbs=TRUE,summaryFunction=twoClassSummary)
set.seed(849)
test_class_cv_model <- train(trainX, trainY, method = "glmnet", trControl = cctrl1,metric = "ROC",
tuneGrid = expand.grid(alpha = 1,lambda = seq(0.001,0.1,by = 0.001)))
test_class_cv_model
# best parameter
test_class_cv_model$bestTune
# best coefficient
coef(test_class_cv_model$finalModel, test_class_cv_model$bestTune$lambda)
요약하면 최적의 람다는 다음과 같이 제공됩니다.
를 사용하여 0.055
cv.glmnet()
사용하여 0.001
train()
standardize=FALSE
in 을 사용 하는 cv.glmnet()
것이 바람직하지 않다는 것을 알고 있지만 동일한 전제 조건을 사용하여 두 방법을 비교하고 싶습니다. 주요 설명으로, 각 폴드에 대한 샘플링 접근법이 문제가 될 수 있다고 생각합니다. 그러나 동일한 시드를 사용하고 결과는 상당히 다릅니다.
그래서 나는 두 접근법이 왜 그렇게 다른지에 여전히 붙어 있지만 그것들은 상당히 유사해야합니까? -커뮤니티에 문제가 무엇인지 알기를 바랍니다.