Un ejemplo sobre cómo hacer una validación cruzada simple para el lazo en glmnet
el mtcars
conjunto de datos.
Cargar conjunto de datos.
Preparar características (variables independientes). Deberían ser de matrix
clase. La forma más fácil de convertir que df
contiene variables categóricas matrix
es a través de model.matrix
. Eso sí, por defecto se glmnet
ajusta a la intercepción, por lo que será mejor que elimine la intercepción de la matriz del modelo.
Preparar respuesta (variable dependiente). Codifiquemos los automóviles con un promedio superior mpg
al eficiente ('1') y el resto como ineficiente ('0'). Convierta esta variable en factor.
Ejecute la validación cruzada a través de cv.glmnet
. Se recogerá alpha=1
de los glmnet
parámetros predeterminados , que es lo que solicitó: regresión de lazo.
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. glmnet
en realidad proporciona 2 lambdas: lambda.min
y 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 alpha
tambié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.glmnet
y sus valores predeterminados provienen, por glmnet
supuesto, ?glmnet
de la consola de R)))