Il semble y avoir beaucoup de confusion dans la comparaison de l'utilisation à l' glmnet
intérieur caret
pour rechercher un lambda optimal et à utiliser cv.glmnet
pour faire la même tâche.
De nombreuses questions ont été posées, par exemple:
Modèle de classification train.glmnet vs cv.glmnet?
Quelle est la bonne façon d'utiliser glmnet avec caret?
Validation croisée de `glmnet` à l'aide de` caret`
mais aucune réponse n'a été donnée, ce qui pourrait être dû à la reproductibilité de la question. Après la première question, je donne un exemple assez similaire mais j'ai la même question: pourquoi les lambdas estimés sont-ils si différents?
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)
Pour résumer, les lambdas optimales sont données comme:
0,055 en utilisant
cv.glmnet()
0,001 en utilisant
train()
Je sais que l' utilisation standardize=FALSE
danscv.glmnet()
n'est pas recommandée, mais je veux vraiment comparer les deux méthodes en utilisant les mêmes conditions préalables. Comme explication principale, je pense que l'approche d'échantillonnage pour chaque pli pourrait être un problème - mais j'utilise les mêmes graines et les résultats sont assez différents.
Je suis donc vraiment coincé sur la raison pour laquelle les deux approches sont si différentes, alors qu'elles devraient être assez similaires? - J'espère que la communauté a une idée du problème ici
la source