Salah satu kriteria untuk memilih nilai optimal dengan jaring elastis atau regresi yang dihukum serupa adalah untuk memeriksa sebidang penyimpangan terhadap rentang dan pilih ketika penyimpangan diminimalkan (atau dalam satu kesalahan standar dari minimum).
Namun, saya mengalami kesulitan memahami apa, tepatnya, glmnet
menampilkan dengan plot.cv.glmnet
, karena plot yang ditampilkan sama sekali tidak menyerupai hasil dari merencanakan penyimpangan terhadap .
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))
Tampaknya plot kedua tidak memasukkan penalti bersih elastis, dan juga diskalakan secara keliru secara vertikal. Saya mendasarkan klaim atas dasar bahwa bentuk kurva untuk nilai yang lebih besar dari menyerupai output. Namun, ketika saya mencoba untuk menghitung penalti sendiri, usaha saya juga tampaknya sangat tidak akurat.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)
Pertanyaan saya adalah: bagaimana cara seseorang menghitung penyimpangan yang dilaporkan dalam plot.cv.glmnet
diagram default ? Apa formulanya, dan apa yang saya lakukan salah dalam upaya saya menghitungnya?
cv.glmnet
sedang melakukan validasi silang 10 kali lipat, bukan? Jadi itu merencanakan rata-rata +/- 1 kesalahan standar penyimpangan pada data penahan 10%?