在R语言中,glmnet()和cv.glmnet()有什么区别?

16

我正在开发一个项目,旨在展示一组事件对结果的潜在影响。我正在使用glmnet()包,具体使用泊松特征。这是我的代码:

# de <- data imported from sql connection        
x <- model.matrix(~.,data = de[,2:7])
y <- (de[,1])
reg <- cv.glmnet(x,y, family = "poisson", alpha = 1)
reg1 <- glmnet(x,y, family = "poisson", alpha = 1)

**Co <- coef(?reg or reg1?,s=???)**

summ <- summary(Co)
c <- data.frame(Name= rownames(Co)[summ$i],
       Lambda= summ$x)
c2 <- c[with(c, order(-Lambda)), ]

一开始我从我的SQL数据库中导入了大量数据。然后我将其以矩阵格式放置并将响应与预测变量分开。

这就是我困惑的地方:我无法确定glmnet()函数和cv.glmnet()函数之间的确切区别。我知道cv.glmnet()函数是对glmnet()函数进行 k 折交叉验证,但在实际操作中这意味着什么呢?它们为 lambda 提供相同的值,但我想确保我没有错过两者之间的重要差异。

我还不清楚为什么当我指定alpha=1(默认值)时可以正常运行,但是如果不加就会出问题?

提前感谢!


尝试查看 plot(reg) - Roland
3
永远不要依赖glmnet的默认lambda序列!这是一个臭名昭著的问题。总是提供自己的序列,然后从fit$lambda.min获取最优lambda值,并在所有调用predict()coef()等函数时使用s=lambda.min参数。 - smci
2
@smci 为什么不使用 lambda.1se?predict() 函数确切地使用了它。 - Alina
2
请您说明一些为什么不使用预定义的lambda以及如何选择更好的序列。 - pikachu
3
@smci你能证明默认的lambda序列是垃圾吗?除了我相信glmnet的作者知道他们在做什么之外,这个序列从最大的lambda开始,该lambda保证所有系数为零,到一个非常小的lambda,在这里通常所有系数都会进入模型(当然这取决于您矩阵的形状),这在我看来非常有意义。在我的情况下,它完美地工作了。是否有某些模型类型不适用此方法? - Elmar Zander
显示剩余4条评论
2个回答

22

glmnet()是一个R包,可用于拟合回归模型、套索模型和其他模型。alpha参数确定拟合的模型类型。当alpha=0时,拟合岭回归模型;当alpha=1时,拟合套索模型。

cv.glmnet()执行交叉验证,默认为10折,可以使用nfolds进行调整。10折交叉验证将随机将观察值分成大约相等大小的10个非重叠组/折。第一个折将用作验证集,模型在9个折上进行拟合。偏差方差优势通常是使用这种模型验证方法的动机。对于套索和岭回归模型,CV有助于选择调整参数lambda的值。

在你的示例中,你可以执行plot(reg)或reg$lambda.min,以查看导致最小CV误差的lambda值。然后,您可以针对该lambda值推导出测试MSE。默认情况下,glmnet()将自动选择lambda范围进行岭回归或套索回归,这可能不会给出最低的测试MSE。希望这能帮到您!

希望这能帮到您!


1
更明确地说:永远不要依赖glmnet的默认lambda序列!始终提供自己的序列。 - smci
1
如果我理解正确的话,cv.glmnetglmnet都会优化lambda。cv.glmnet使用交叉验证,而glmnet则仅依赖于成本函数。这是正确的吗? - Jeff Bezos
@smci,您非常坚定地认为不应使用默认的lambda序列,而应该提供自己的序列。对于第一个观点,您有任何来源或证据吗?如果有的话,您能指出一个经验法则或确定最适合您数据的lambda序列的经验方法吗? - Calen
@Calen,不,我并不坚定,我接触过的每个博士级别的机器学习教授、老师和专家都不是。这是一个非常明显的原因,即可能会错过最优的lambda值。你可以使用两步策略:首先尝试一个粗略的lambda范围(每十年2个值)从非常高到非常低(对数),然后放大到最优值,并在更接近的范围内进行第二次运行,例如每十年3/4/5个点。这就是我以前做的。为什么glmnet包中从未实现更强大的默认lambda,我不知道。我更愿意看到测试用例和补丁,而不是辩论。 - smci
@smci 谢谢,我会尝试的。我现在正在寻找一个好的模型,但是实际实现方面并没有找到太多好的资源,因此欢迎任何其他来源或建议。 - Calen

2
在reg$lambda.min和reg$lambda.1se之间选择;显然,lambda.min将为您提供最低的MSE,但是,取决于您对误差有多么灵活,您可能希望选择 reg$lambda.1se,因为这个值会进一步减少预测变量的数量。您也可以选择reg$lambda.min和reg$lambda.1se的平均值作为lambda值。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接