对于我目前的研究,我通过 R 中的 glmnet 包对二项式因变量使用 Lasso 方法。
在 glmnet 中,通过交叉验证找到最佳 lambda,并且可以将生成的模型与各种度量进行比较,例如错误分类错误或偏差。
我的问题:glmnet 中的偏差究竟是如何定义的?它是如何计算的?
(在弗里德曼等人的相应论文“通过坐标下降的广义线性模型的正则化路径”中。我只发现关于 cv.glmnet 中使用的偏差的评论:“平均偏差(减去左侧的对数似然的两倍)数据)”(第 17 页))。
对于我目前的研究,我通过 R 中的 glmnet 包对二项式因变量使用 Lasso 方法。
在 glmnet 中,通过交叉验证找到最佳 lambda,并且可以将生成的模型与各种度量进行比较,例如错误分类错误或偏差。
我的问题:glmnet 中的偏差究竟是如何定义的?它是如何计算的?
(在弗里德曼等人的相应论文“通过坐标下降的广义线性模型的正则化路径”中。我只发现关于 cv.glmnet 中使用的偏差的评论:“平均偏差(减去左侧的对数似然的两倍)数据)”(第 17 页))。
在Friedman、Hastie 和 Tibshirani (2010)中,出于交叉验证的目的,二项式模型的偏差计算为
减去遗漏数据的对数似然的两倍(第 17 页)
鉴于这是(第 2 页和第 5 页)文档中引用的论文,这可能是包中使用的公式。glmnet
实际上,在函数的源代码中cvlognet
,响应的偏差残差计算为
-2*((y==2)*log(predmat)+(y==1)*log(1-predmat))
predmat
简单的在哪里
predict(glmnet.object,x,lambda=lambda)
并从 encolsingcv.glmnet
函数传入。我使用了JStatSoft 页面上提供的源代码作为论文,但我不知道该代码的最新程度。这个包的代码非常简单易读;您可以随时通过键入来检查自己glmnet:::cv.glmnet
。
除了@shadowtalker 的回答,当我使用包 glmnet 时,我觉得交叉验证中的偏差在某种程度上被规范化了。
library(glmnet)
data(BinomialExample)
fit = cv.glmnet(x,y, family = c("binomial"), intercept = FALSE)
head(fit$cvm) # deviance from test samples at lambda value
# >[1] 1.383916 1.359782 1.324954 1.289653 1.255509 1.223706
# deviance from (test samples? all samples?) at lambda value
head(deviance(fit$glmnet.fit))
# >[1] 138.6294 134.5861 131.1912 127.1832 122.8676 119.1637
参考:偏差 R 文件
因为如果我做除法,
head(deviance(fit$glmnet.fit)) / length(y))
结果是
[1] 1.386294 1.345861 1.311912 1.271832 1.228676 1.191637
这非常接近 fit$cvm。
这可能是@Hong Ooi 对这个问题的评论:
https://stackoverflow.com/questions/43468665/poisson-deviance-glmnet