最適値を選択するための一つの基準弾性ネットまたは類似献上回帰では、範囲に対するずれのプロットを調べることである選択し逸脱が最小化される場合(またはの1つの標準誤差以内最小)。λ λ λ
ただし、表示されるプロットはに対する逸脱をプロットした結果にまったく似ていないため、正確に何がglmnet
表示されるかを理解するのは困難です。plot.cv.glmnet
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))
2番目のプロットにはエラスティックネットペナルティが組み込まれておらず、垂直方向に誤ってスケーリングされているようです。値が大きい場合の曲線の形状は出力の形状に似ているという根拠に基づいて、私は主張を基にしています。しかし、自分でペナルティを計算しようとした場合、私の試みも同様に非常に不正確に見えます。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)
私の質問は、デフォルトのplot.cv.glmnet
図で報告された逸脱を手動でどのように計算するのですか?その式は何ですか、そしてそれを計算する私の試みで何が間違っていますか?
cv.glmnet
10分割交差検証を実行していることをご存知でしょうか?それで、それは10%のホールドアウトデータの逸脱の平均+/- 1標準誤差をプロットしていますか?