¿Cómo hacer la validación cruzada con cv.glmnet (regresión LASSO en R)?

10

Me pregunto cómo abordar adecuadamente el entrenamiento y la prueba de un modelo LASSO usando glmnet en R.

  • Específicamente, me pregunto cómo hacerlo si la falta de un conjunto de datos de prueba externo requiere el uso de validación cruzada (u otro enfoque similar) para probar mi modelo LASSO.

Déjame analizar mi escenario:

Solo tengo un conjunto de datos para informar y entrenar mi modelo glmnet. Como resultado, tendré que usar la validación cruzada para dividir mis datos para generar también una forma de probar mi modelo.

Ya estoy usando cv.glmnet, que de acuerdo con los detalles del paquete :

Hace k-fold validación cruzada para glmnet, produce un gráfico y devuelve un valor para lambda.

  • ¿La validación cruzada se realiza cv.glmnetsimplemente para elegir la mejor lambda, o también sirve como un procedimiento de validación cruzada más general?

    • En otras palabras, ¿todavía necesito hacer otro paso de validación cruzada para "probar" mi modelo?

Estoy trabajando con la suposición de que "sí, lo hago".

Siendo ese el caso, ¿cómo me acerco a la validación cruzada de mi cv.glmnetmodelo?

  • ¿Tengo que hacerlo manualmente o tal vez la caretfunción sea útil para los modelos glmnet?

  • ¿Utilizo dos "bucles" concéntricos de validación cruzada? ... ¿Utilizo un "bucle interno" de CV cv.glmnetpara determinar el mejor valor lambda dentro de cada uno de los k pliegues de un "bucle externo" del proceso de validación cruzada k-fold ?

    • Si hago una validación cruzada de mi cv.glmnetmodelo de validación cruzada , ¿cómo aíslo el "mejor" modelo (del "mejor" valor lambda) de cada cv.glmnetmodelo dentro de cada pliegue de mi "lazo externo" de validación cruzada?

      • Nota: Estoy definiendo el "mejor" modelo como el modelo asociado con una lambda que produce un MSE dentro de 1 SE del mínimo ... este es $lambda.1seel cv.glmnetmodelo.

Contexto:

Estoy tratando de predecir la edad del árbol ("edad") en función del diámetro del árbol ("D"), D ^ 2 y la especie ("factor (SPEC)"). [ecuación resultante: Age ~ D + factor(SPEC) + D^2]. Tengo ~ 50K filas de datos, pero los datos son longitudinales (rastrea individuos a lo largo del tiempo) y consta de ~ 65 especies.

el forestalteólogo
fuente
1
Para aquellos que votaron para cerrar sin comentar: eso no es útil ... hágame saber cuál es su problema en los comentarios e intentaré solucionarlo.
theforestecologist
1
No votan para cerrar, votan para migrarlo a CrossValidated. Acabo de agregar mi voto a eso.
Hack-R
@theforestecologist: Debería poder ver los motivos citados para el cierre / migración haciendo clic en el botón 'cerrar'.
DWin
Gracias por preguntar, tenía exactamente esta pregunta. Y no puedo usar caret porque tengo Y multivariante. ¿Pero ha inspeccionado el código fuente y ha confirmado que no se necesita CV adicional? El código fuente puede ser bastante difícil de seguir.
qoheleth

Respuestas:

3

¿La validación cruzada se realiza en cv.glmnet simplemente para elegir el mejor lambda, o también sirve como un procedimiento de validación cruzada más general?

Hace casi todo lo necesario en una validación cruzada. Por ejemplo, ajusta los lambdavalores posibles en los datos, elige el mejor modelo y finalmente entrena el modelo con los parámetros apropiados.

Por ejemplo, en el objeto devuelto ::

cvmes el error medio de validación cruzada. cvsdes la desviación estándar estimada.

Al igual que otros valores devueltos, estos se calculan en el conjunto de prueba. Finalmente, el

glmnet.fit da el modelo entrenado en todos los datos (entrenamiento + prueba) con los mejores parámetros.

¿Tengo que hacerlo manualmente o tal vez la función de intercalación sea útil para los modelos glmnet?

No necesita hacer esto manualmente. 'Caret' sería muy útil, y es uno de mis paquetes favoritos porque funciona para todos los demás modelos con la misma sintaxis. Yo mismo uso a menudo en caretlugar de cv.glmnet. Sin embargo, en su escenario es esencialmente lo mismo.

¿Utilizo dos "bucles" concéntricos de validación cruzada? ... ¿Utilizo un "bucle interno" de CV a través de cv.glmnet para determinar el mejor valor lambda dentro de cada uno de los k pliegues de un "bucle externo" de k-fold procesamiento de validación cruzada?

Podría hacer esto y este concepto es muy similar a la idea de validación cruzada anidada. Validación cruzada anidada para la selección del modelo .

Si hago la validación cruzada de mi modelo cv.glmnet que ya está validando, ¿cómo aíslo el "mejor" modelo (del "mejor" valor lambda) de cada modelo cv.glmnet dentro de cada pliegue de mi bucle externo? "de validación cruzada?

Simplemente ejecute un bucle donde genere datos de entrenamiento y datos de prueba ejecutados cv.glmneten datos de entrenamiento y use el modelo glmnet.fitpara predecir sobre los datos de prueba.

discipulo
fuente
@discupulus: Gracias. ¿Podría proporcionar algún tipo de evidencia para eso? (es decir, guíame por él, por favor) Además, dada su respuesta, ¿eso significa que no se necesitan más procesos de validación cruzada para informar una métrica de rendimiento para los datos? (¿Podría simplemente informar el MSE del caso lambda.1se como el rendimiento de mi modelo final?)
theorestesologist
Sí, no se necesita más validación cruzada. Para la evidencia, puede mirar el código fuente de la cv.glmnetfunción como Res opensource. Simplemente escriba cv.glmneten la consola.
discipulus
3
@discipulus. Le envié un correo electrónico a Trevor Hastie preguntando "¿cv.glmnet (implementación R) solo hace CV para elegir lambda? O también hace un CV externo para validar el lambda elegido? En otras palabras, ¿tenemos que codificar nuestro propio CV externo si ¿Quieres validar la lambda elegida? y él respondió (bastante rápido) "Sí, solo para elegir lambda", lo que interpreto significa que solo hace el CV interno, y tendremos que codificar nuestro propio CV externo.
qoheleth
@theforestecologist Estoy tratando de aprender más sobre la validación cruzada y encontrar su publicación educativa. No entiendo lo que quiere decir con cv.glmnet que también sirve como un procedimiento de validación cruzada más general. Pensé que el único parámetro disponible para elegir es lambda: ¿qué capa externa de validación cruzada existe? Le agradecería que pudiera responder. ¡Gracias!
user2450223