glmnet 包中偏差度量的确切定义,带有交叉验证?

机器算法验证 交叉验证 套索 网络 越轨 拉尔斯
2022-03-05 07:24:39

对于我目前的研究,我通过 R 中的 glmnet 包对二项式因变量使用 Lasso 方法。

在 glmnet 中,通过交叉验证找到最佳 lambda,并且可以将生成的模型与各种度量进行比较,例如错误分类错误或偏差。

我的问题:glmnet 中的偏差究竟是如何定义的?它是如何计算的?

(在弗里德曼等人的相应论文“通过坐标下降的广义线性模型的正则化路径”中。我只发现关于 cv.glmnet 中使用的偏差的评论:“平均偏差(减去左侧的对数似然的两倍)数据)”(第 17 页))。

2个回答

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