Un critère de sélection de la valeur optimale de avec un filet élastique ou une régression pénalisée similaire consiste à examiner un tracé de la déviance par rapport à la plage de et à sélectionner lorsque la déviance est minimisée (ou dans une erreur standard de la le minimum).
Cependant, j'ai du mal à comprendre avec quoi exactement glmnet
s'affiche plot.cv.glmnet
, car le tracé affiché ne ressemble pas du tout aux résultats du tracé de la déviance contre .
set.seed(4567)
N <- 500
P <- 100
coefs <- NULL
for(p in 1:P){
coefs[p] <- (-1)^p*100*2^(-p)
}
inv.logit <- function(x) exp(x)/(1+exp(x))
X <- matrix(rnorm(N*P), ncol=P, nrow=N)
Y <- rbinom(N, size=1, p=inv.logit(cbind(1, X)%*%c(-4, coefs)))
plot(test <- cv.glmnet(x=X, y=Y, family="binomial", nfolds=10, alpha=0.8))
plot(log(test$lambda), deviance(test$glmnet.fit))
Il semble que le deuxième tracé n'incorpore pas la pénalité nette élastique et est également incorrectement mis à l'échelle verticalement. Je fonde l'affirmation sur la base que la forme de la courbe pour des valeurs plus élevées de ressemble à celle de la sortie. Cependant, lorsque j'ai tenté de calculer la pénalité par moi-même, ma tentative semble également extrêmement inexacte.glmnet
penalized.dev.fn <- function(lambda, alpha=0.2, data, cv.model.obj){
dev <- deviance(cv.model.obj$glmnet.fit)[seq_along(cv.model.obj$lambda)[cv.model.obj$lambda==lambda]]
beta <- coef(cv.model.obj, s=lambda)[rownames(coef(cv.model.obj))!="(Intercept)"]
penalty <- lambda * ( (1-alpha)/2*(beta%*%beta) + alpha*sum(abs(beta)) )
penalized.dev <- penalty+dev
return(penalized.dev)
}
out <- sapply(test$lambda, alpha=0.2, cv.model.obj=test, FUN=penalized.dev.fn)
plot(log(test$lambda), out)
Ma question est: comment calculer manuellement la déviance signalée dans le plot.cv.glmnet
diagramme par défaut ? Quelle est sa formule et qu'ai-je fait de mal dans ma tentative de calcul?
cv.glmnet
validation croisée est multipliée par 10, non? Donc, il trace la moyenne de l'erreur standard +/- 1 de la déviance sur les données de maintien de 10%?