Sembra esserci molta confusione nel confronto tra l'uso di glmnet
inside caret
per cercare un lambda ottimale e l'utilizzo cv.glmnet
per fare lo stesso compito.
Sono state poste molte domande, ad esempio:
Modello di classificazione train.glmnet vs. cv.glmnet?
Qual è il modo corretto di usare glmnet con il cursore?
Convalida incrociata di `glmnet` usando` caret`
ma nessuna risposta è stata data, il che potrebbe essere dovuto alla riproducibilità della domanda. Seguendo la prima domanda, faccio un esempio abbastanza simile ma ho la stessa domanda: perché le lambda stimate sono così diverse?
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)
Riassumendo, le lambda ottimali sono date come:
0.055 usando
cv.glmnet()
0,001 utilizzando
train()
So che l'uso di standardize=FALSE
in cv.glmnet()
non è consigliabile, ma voglio davvero confrontare entrambi i metodi usando gli stessi prerequisiti. Come spiegazione principale, penso che l'approccio di campionamento per ogni piega possa essere un problema, ma uso gli stessi semi e i risultati sono abbastanza diversi.
Quindi sono davvero bloccato sul perché i due approcci sono così diversi, mentre dovrebbero essere abbastanza simili? - Spero che la comunità abbia qualche idea su quale sia il problema qui