Ein Kriterium für die Auswahl des optimalen Wertes von mit einem elastischen Netz oder einer ähnlichen bestraften Regression besteht darin, eine Auftragung der Abweichung gegen den Bereich von und auszuwählen, wenn die Abweichung minimiert ist (oder innerhalb eines Standardfehlers von Minimum).λ λ λ
Aber ich habe Schwierigkeiten zu verstehen , was genau glmnet
Displays mit plot.cv.glmnet
, weil die Handlung angezeigt überhaupt nicht die Ergebnisse der Auftragung die Devianz gegen ähnelt .
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))
Es scheint, dass das zweite Diagramm die elastische Nettostrafe nicht enthält und auch vertikal falsch skaliert ist. Ich begründe die Behauptung damit, dass die Form der Kurve für größere Werte von der der Ausgabe ähnelt . Wenn ich jedoch versucht habe, die Strafe selbst zu berechnen, scheint mein Versuch ebenfalls äußerst ungenau zu sein.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)
Meine Frage ist: Wie berechnet man die im Standarddiagramm angegebene Abweichung manuell plot.cv.glmnet
? Wie lautet die Formel und was habe ich bei meinem Versuch, sie zu berechnen, falsch gemacht?
cv.glmnet
eine 10-fache Kreuzvalidierung durchgeführt wird, oder? Es wird also der mittlere +/- 1 Standardfehler der Abweichung auf die 10% Hold-Out-Daten aufgetragen?