Một tiêu chí để chọn giá trị tối ưu của với mạng đàn hồi hoặc hồi quy bị phạt tương tự là kiểm tra sơ đồ sai lệch so với phạm vi của và chọn khi độ lệch được giảm thiểu (hoặc trong một lỗi tiêu chuẩn của tối thiểu).bước sóng bước sóng bước sóng
Tuy nhiên, tôi đang gặp khó khăn trong việc hiểu chính xác những gì glmnet
hiển thị với plot.cv.glmnet
, bởi vì cốt truyện được hiển thị hoàn toàn không giống với kết quả của âm mưu chống lại .
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))
Có vẻ như âm mưu thứ hai không kết hợp hình phạt ròng đàn hồi, và cũng được chia tỷ lệ không chính xác theo chiều dọc. Tôi dựa trên yêu cầu dựa trên cơ sở rằng hình dạng của đường cong cho các giá trị lớn hơn của giống với đầu ra. Tuy nhiên, khi tôi cố gắng tự mình tính toán hình phạt, nỗ lực của tôi cũng có vẻ không chính xác.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)
Câu hỏi của tôi là: làm thế nào để tính toán thủ công độ lệch được báo cáo trong plot.cv.glmnet
sơ đồ mặc định ? Công thức của nó là gì và tôi đã làm gì sai trong nỗ lực tính toán nó?
cv.glmnet
đang thực hiện xác nhận chéo 10 lần, phải không? Vì vậy, đó là âm mưu trung bình +/- 1 lỗi chuẩn của độ lệch trên dữ liệu giữ 10%?