Définition exacte de la mesure de déviance dans le package glmnet, avec validation croisée?

12

Pour ma recherche actuelle, j'utilise la méthode Lasso via le package glmnet dans R sur une variable dépendante binomiale.

Dans glmnet, le lambda optimal est trouvé par validation croisée et les modèles résultants peuvent être comparés à diverses mesures, par exemple erreur de classification erronée ou déviance.

Ma question: comment la déviance est-elle définie exactement dans glmnet? Comment est-il calculé?

(Dans l'article correspondant "Chemins de régularisation pour les modèles linéaires généralisés via la descente de coordonnées" par Friedman et al. données) "(p. 17)).

Jo Wmann
la source
C'est la même chose que la déviance utilisée glm(ou du moins, elle devrait l'être - il n'y a qu'une seule définition de la déviance à ma connaissance).
Hong Ooi du
Oui, mais je pense qu'ils l'étendent d'une certaine manière comme indiqué par la citation dans mon premier post. Si je comprends bien, la déviance peut comparer les performances de deux modèles, mais comment les auteurs incluent-ils alors les données laissées de côté pour la validation croisée? Comment le «moins deux fois la probabilité logarithmique sur les données laissées de côté» est-il logique?
Jo Wmann
1
Très bien, merci, maintenant je pense que je l'ai compris: la déviance est définie comme -2 * log-vraisemblance ou plutôt (2 * log-vraisemblance) / (log-vraisemblance du modèle nul). Cela explique également pourquoi leur mesure de déviance pour les différentes valeurs de lambda ne dépasse pas l'intervalle 0,2. Le modèle est estimé sur les plis k-1 de la validation croisée et appliqué au pli restant. Pour l'application sur le pli restant, le score de log-vraisemblance est calculé. Ceci est répété k fois et la moyenne des k résultats pour chaque lambda de la mesure de déviation définie ci-dessus est renvoyée.
Jo Wmann
1
Oui, il est toujours moyen sur tous les plis pour chaque lambda. Je pense que vous pouvez utiliser soit la déviance directement, soit le rapport wrt au modèle nul, qui est probablement le seul modèle d'interception. Il y a deux écueils: a) les plis peuvent ne pas avoir exactement le même nombre de points de données b) chaque pli contient des données différentes (naturellement). pour corriger (a), vous pouvez simplement diviser la déviance par le nombre de points de données dans le pli sélectionné. pour fixer (a) et (b) en même temps, utilisez l'approche par rapport. le modèle de déviance suppose que l'ensemble de données est le même dans chaque modèle (la même idée dans l'estimation MAP où ils ignorent le dénominateur).
Cagdas Ozgenc
1
Cependant, une fois que les plis apparaissent dans l'image, le dénominateur n'est pas le même entre les plis. Donc, ratio s'en occupe en annulant les dénominateurs. Mais je ne sais pas à quel point c'est un problème lorsque vous faites la moyenne des plis.
Cagdas Ozgenc

Réponses:

9

Dans Friedman, Hastie et Tibshirani (2010) , la déviance d'un modèle binomial, à des fins de validation croisée, est calculée comme suit:

moins deux fois la log-vraisemblance sur les données laissées de côté (p. 17)

Étant donné qu'il s'agit du document cité dans la documentation deglmnet (p. 2 et 5), c'est probablement la formule utilisée dans le package.

Et en effet, dans le code source de la fonction cvlognet, les résidus de déviance pour la réponse sont calculés comme

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

predmatest simplement

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

et est passé de la cv.glmnetfonction d' encollage . J'ai utilisé le code source disponible sur la page JStatSoft pour le papier , et je ne sais pas comment ce code est à jour. Le code de ce paquet est étonnamment simple et lisible; vous pouvez toujours vérifier par vous-même en tapant glmnet:::cv.glmnet.

shadowtalker
la source
1

En plus de la réponse de @shadowtalker, lorsque j'utilisais le paquet glmnet, j'ai l'impression que la déviance dans la validation croisée est en quelque sorte normalisée.

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

Réf: deviance R document

parce que si je fais la division,

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

le résultat est

[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637

qui est très proche de l'ajustement $ cvm.

C'est peut-être ce que le commentaire de @Hong Ooi a dit sur cette question:

/programming/43468665/poisson-deviance-glmnet

vtshen
la source