Regresión cruzada de validación de lazo en R

9

La función R cv.glm (biblioteca: arranque) calcula el error estimado de predicción de validación cruzada K-fold para modelos lineales generalizados y devuelve delta. ¿Tiene sentido usar esta función para una regresión de lazo (biblioteca: glmnet) y, de ser así, ¿cómo se puede llevar a cabo? La biblioteca glmnet utiliza una validación cruzada para obtener el mejor parámetro de giro, pero no encontré ningún ejemplo que valide la ecuación glmnet final.

kalakaru
fuente
2
Ciertamente tiene sentido, y aunque LASSO solo optimiza más de un (hiper) parámetro, si desea obtener la mejor estimación posible del rendimiento fuera de la muestra, necesita un bucle externo de validación cruzada. Consulte ¿Puede sobreajustar entrenando algoritmos de aprendizaje automático utilizando CV / Bootstrap? y los documentos citados.
Scortchi - Restablece a Monica
Se recomienda usar glmnet en lugar de glm esp. Si estás haciendo CV. Si recuerdo, el paquete glm se vuelve doloroso de usar. Además, cv.glmnet expone más parámetros que cv.glm.
smci 01 de

Respuestas:

9

Un ejemplo sobre cómo hacer una validación cruzada simple para el lazo en glmnetel mtcars conjunto de datos.

  1. Cargar conjunto de datos.

  2. Preparar características (variables independientes). Deberían ser de matrixclase. La forma más fácil de convertir que dfcontiene variables categóricas matrixes a través de model.matrix. Eso sí, por defecto se glmnetajusta a la intercepción, por lo que será mejor que elimine la intercepción de la matriz del modelo.

  3. Preparar respuesta (variable dependiente). Codifiquemos los automóviles con un promedio superior mpgal eficiente ('1') y el resto como ineficiente ('0'). Convierta esta variable en factor.

  4. Ejecute la validación cruzada a través de cv.glmnet. Se recogerá alpha=1de los glmnetparámetros predeterminados , que es lo que solicitó: regresión de lazo.

  5. Al examinar el resultado de la validación cruzada, puede estar interesado en al menos 2 piezas de información:

    • lambda, que minimiza el error de validación cruzada. glmneten realidad proporciona 2 lambdas: lambda.miny lambda.1se. Es su criterio, como estadístico en ejercicio, cuál usar.

    • coeficientes regularizados resultantes.

Consulte el código R según las instrucciones anteriores:

# Load data set
data("mtcars")

# Prepare data set 
x   <- model.matrix(~.-1, data= mtcars[,-1])
mpg <- ifelse( mtcars$mpg < mean(mtcars$mpg), 0, 1)
y   <- factor(mpg, labels = c('notEfficient', 'efficient'))

library(glmnet)

# Run cross-validation
mod_cv <- cv.glmnet(x=x, y=y, family='binomial')

mod_cv$lambda.1se
[1] 0.108442

coef(mod_cv, mod_cv$lambda.1se)
                     1
(Intercept)  5.6971598
cyl         -0.9822704
disp         .        
hp           .        
drat         .        
wt           .        
qsec         .        
vs           .        
am           .        
gear         .        
carb         .  

mod_cv$lambda.min
[1] 0.01537137

coef(mod_cv, mod_cv$lambda.min)
                      1
(Intercept)  6.04249733
cyl         -0.95867199
disp         .         
hp          -0.01962924
drat         0.83578090
wt           .         
qsec         .         
vs           .         
am           2.65798203
gear         .         
carb        -0.67974620

Comentarios finales:

  • tenga en cuenta que la salida del modelo no dice nada sobre la significación estadística de los coeficientes, solo valores.

  • l1 penalizer (lazo), que solicitó, es notorio por la inestabilidad como se evidencia en esta publicación de blog y esta pregunta de intercambio de pila . Una mejor manera podría ser la validación cruzada alphatambién, lo que le permitiría decidir sobre la combinación adecuada de penalizadores l1 y l2.

  • una forma alternativa de hacer una validación cruzada podría ser recurrir a caret's train( ... method='glmnet')

  • y finalmente, la mejor manera de aprender más cv.glmnety sus valores predeterminados provienen, por glmnetsupuesto, ?glmnetde la consola de R)))

Sergey Bushmanov
fuente
Buena respuesta. .. también vale la pena ejecutar el CV varias veces y promediar la curva de error (ver? cv.glmnet) para tener en cuenta el muestreo.
user20650
@SergeyBushmanov ¡MUY ÚTIL!
theforestecologist
Hola, sé que esta es una publicación antigua, pero quería hacerte una pregunta. Usted menciona que el resultado del modelo no dice nada sobre la significación estadística de los coeficientes, entonces, ¿cómo determina que son significativos o no?
Jun Jang
@JunJang "No hay significación estadística para los coeficientes" es la declaración de los autores del paquete, no de mí. Esta declaración se da, no recuerdo exactamente, ni en uno de los libros de los autores del paquete ni en la viñeta del paquete. En tal caso, en lugar de decir coeficientes significativos o no, preferiría decir que son "útiles" o no para explicar el objetivo a través de la validación cruzada.
Sergey Bushmanov