18 votos

Símbolo de intercalación glmnet vs vc.glmnet

Parece ser que hay una gran confusión en la comparación del uso de glmnet dentro caret a la búsqueda de un óptimo lambda y el uso de cv.glmnet para realizar la misma tarea.

Muchas preguntas se plantean, por ejemplo:

El modelo de clasificación de tren.glmnet vs cv.glmnet?

¿Cuál es la forma correcta de usar glmnet con el símbolo de intercalación?

La validación cruzada `glmnet` usando `cursor`

pero la respuesta no ha sido determinada, que podría ser debido a la reproducibilidad de la pregunta. Después de la primera pregunta, quiero dar una muy similares ejemplo, pero no tienen la misma pregunta: ¿por Qué la estimación de las lambdas tan diferentes?

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)

Para resumir, el óptimo de lambdas está dada como:

  • 0.055 mediante cv.glmnet()

  • 0.001 mediante train()

Sé que el uso de standardize=FALSE en cv.glmnet() no es recomendable, pero lo que realmente quiero comparar ambos métodos de uso de los mismos requisitos. Como principal explanaition, creo que el enfoque de muestreo para cada una de las veces puede ser un problema - pero yo uso las mismas semillas y los resultados son bastante diferentes.

Así que estoy muy pegado sobre el por qué de los dos enfoques son muy diferentes, mientras que ellos deben ser bastante similares? - Espero que la comunidad tiene alguna idea de cuál es el problema aquí

22voto

user71500 Puntos 31

Veo a dos de la cuestión aquí. Primero, el conjunto de entrenamiento es demasiado pequeña en relación con su conjunto de pruebas. Normalmente, nos gustaría que un conjunto de entrenamiento, que es al menos comparable en tamaño a la del conjunto de pruebas. Otra nota es que para la Validación Cruzada, usted no está utilizando el conjunto de pruebas a todos, porque el algoritmo básicamente crea conjuntos de prueba para usted, utilizando el "conjunto de entrenamiento". Así que sería mejor utilizar a más de los datos como su inicial conjunto de entrenamiento.

Segundo, 3 pliegues es demasiado pequeño para su CV para ser confiable. Normalmente, 5-10 veces se recomienda (nfolds = 5 para cv.glmnet y number=5 para caret). Con estos cambios, tengo el mismo lambda valores a través de los dos métodos y casi idéntico estimaciones:

set.seed(849)
training <- twoClassSim(500, linearVars = 2)
set.seed(849)
testing <- twoClassSim(50, 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 = 5, lambda = seq(0.001,0.1,by = 0.001),
                standardize=FALSE)

cbind(cvob1$lambda,cvob1$cvm)

# best parameter
cvob1$lambda.min

# best coefficient
coef(cvob1, s = "lambda.min")


# Using caret to perform CV
cctrl1 <- trainControl(method="cv", number=5, 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)

Resultado:

> cvob1$lambda.min
[1] 0.001

> coef(cvob1, s = "lambda.min")
8 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.781015706
TwoFactor1  -1.793387005
TwoFactor2   1.850588656
Linear1      0.009341356
Linear2     -1.213777391
Nonlinear1   1.158009360
Nonlinear2   0.609911748
Nonlinear3   0.246029667

> test_class_cv_model$bestTune
alpha lambda
1     1  0.001

> coef(test_class_cv_model$finalModel, test_class_cv_model$bestTune$lambda)
8 x 1 sparse Matrix of class "dgCMatrix"
1
(Intercept) -0.845792624
TwoFactor1  -1.786976586
TwoFactor2   1.844767690
Linear1      0.008308165
Linear2     -1.212285068
Nonlinear1   1.159933335
Nonlinear2   0.676803555
Nonlinear3   0.309947442

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X