¿Definición exacta de la medida de desviación en el paquete glmnet, con validación cruzada?

12

Para mi investigación actual, estoy usando el método Lasso a través del paquete glmnet en R en una variable dependiente binomial.

En glmnet, el lambda óptimo se encuentra a través de la validación cruzada y los modelos resultantes se pueden comparar con varias medidas, por ejemplo, error de clasificación errónea o desviación.

Mi pregunta: ¿Cómo se define exactamente la desviación en glmnet? ¿Cómo se calcula?

(En el documento correspondiente "Rutas de regularización para modelos lineales generalizados a través del descenso coordinado" de Friedman et al. Solo encuentro este comentario sobre la desviación utilizada en cv.glmnet: "desviación media (menos el doble de la probabilidad de registro a la izquierda) datos) "(p. 17)).

Jo Wmann
fuente
Es lo mismo que la desviación utilizada en glm(o al menos, debería ser, solo hay una definición de desviación que conozco).
Hong Ooi
Sí, pero creo que lo extienden de alguna manera como lo indica la cita en mi primera publicación. Según entiendo, la desviación puede comparar el rendimiento de dos modelos, pero ¿cómo incluyen los autores los datos omitidos de la validación cruzada? ¿Cómo tiene sentido el "menos dos veces la probabilidad de registro en los datos excluidos"?
Jo Wmann
1
Muy bien, gracias, ahora creo que lo tengo: la desviación se define como -2 * log-verosimilitud o más bien (2 * log-verosimilitud) / (log-verosimilitud del modelo nulo). Esto también explica por qué su medida de desviación para los diferentes valores de lambda no excede el intervalo 0,2. El modelo se estima en los pliegues k-1 de la validación cruzada y se aplica al pliegue restante. Para la aplicación en el pliegue restante, se calcula el puntaje log-verosimilitud. Esto se repite k veces y se devuelve la media de los k resultados para cada lambda de la medida de desviación definida anteriormente.
Jo Wmann el
1
Sí, siempre se promedia sobre todos los pliegues para cada lambda. Creo que puede usar la desviación directamente o la relación wrt al modelo nulo, que probablemente sea el único modelo de intercepción. Hay dos trampas: a) los pliegues pueden no tener exactamente el mismo número de puntos de datos b) cada pliegue contiene datos diferentes (naturalmente). para corregir (a) simplemente puede dividir la desviación por el número de puntos de datos en el pliegue seleccionado. para arreglar (a) y (b) al mismo tiempo, utilice el enfoque de relación. El modelo de desviación supone que el conjunto de datos es el mismo en cada modelo (la misma idea en la estimación MAP cuando ignoran el denominador).
Cagdas Ozgenc
1
Sin embargo, una vez que los pliegues entran en la imagen, el denominador no es el mismo en todos los pliegues. Entonces ratio se encarga de eso cancelando los denominadores. Pero no sé qué tan grande es este problema cuando promedias los pliegues.
Cagdas Ozgenc

Respuestas:

9

En Friedman, Hastie y Tibshirani (2010) , la desviación de un modelo binomial, con el propósito de validación cruzada, se calcula como

menos el doble de la probabilidad logarítmica en los datos excluidos (p. 17)

Dado que este es el documento citado en la documentación paraglmnet (en las páginas 2 y 5), esa es probablemente la fórmula utilizada en el paquete.

Y, de hecho, en el código fuente de la función cvlognet, los residuos de desviación para la respuesta se calculan como

-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))

dónde predmat es simplemente

predict(glmnet.object,x,lambda=lambda)

y pasó de la cv.glmnetfunción envolvente . Utilicé el código fuente disponible en la página JStatSoft para el documento , y no sé qué tan actualizado está ese código. El código para este paquete es sorprendentemente simple y legible; siempre puede verificarlo usted mismo escribiendo glmnet:::cv.glmnet.

Shadowtalker
fuente
1

Además de la respuesta de @shadowtalker, cuando estaba usando el paquete glmnet, siento que la desviación en la validación cruzada de alguna manera está normalizada.

library(glmnet)
data(BinomialExample)

fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value

# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706

# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))

# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637

Ref: documento de desviación R

porque si hago la división,

head(deviance(fit$glmnet.fit)) / length(y))

el resultado es

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

que está muy cerca del ajuste $ cvm.

Esto puede ser lo que dijo el comentario de @Hong Ooi sobre esta pregunta:

/programming/43468665/poisson-deviance-glmnet

vtshen
fuente