glmnet
在比较使用withincaret
搜索最佳 lambda 和 usingcv.glmnet
执行相同任务时,似乎存在很多混淆。
提出了许多问题,例如:
分类模型 train.glmnet 与 cv.glmnet?
但没有给出答案,这可能是由于问题的可重复性。在第一个问题之后,我给出了一个非常相似的例子,但确实有同样的问题:为什么估计的 lambdas 如此不同?
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)
总而言之,最佳 lambda 表达式如下:
0.055 通过使用
cv.glmnet()
0.001 通过使用
train()
我知道使用standardize=FALSE
incv.glmnet()
是不可取的,但我真的想使用相同的先决条件比较这两种方法。作为主要解释,我认为每个折叠的抽样方法可能是一个问题——但我使用相同的种子,结果却大不相同。
所以我真的很困惑为什么这两种方法如此不同,而它们应该非常相似?- 我希望社区对这里的问题有所了解