R中的glmnet()和cv.glmnet()之间的区别?

时间:2015-03-27 22:38:06

标签: r classification glm cross-validation glmnet

我正在开展一个项目,该项目将显示一组事件对结果的潜在影响。我正在使用glmnet()包,特别是使用Poisson功能。这是我的代码:

# 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-fold交叉验证,但实际上这究竟是什么意思呢?它们为lambda提供了相同的值,但我想确保我不会错过两者之间的重要区别。

当我指定alpha = 1(假设是默认值)时,我也不清楚为什么它运行正常,但是如果我把它留下来的话就不行了?

提前致谢!

2 个答案:

答案 0 :(得分:10)

glmnet()是一个R包,可用于拟合回归模型,套索模型等。 Alpha参数确定适合的模型类型。当alpha = 0时,Ridge模型是合适的,如果alpha = 1,则套索模型是合适的。

cv.glmnet()执行交叉验证,默认为10倍,可以使用nfolds进行调整。 10倍的CV将随机将您的观察分成10个非重叠组/大小相等的折叠。第一个折叠将用于验证集,模型适合9倍。偏差方差优势通常是使用此类模型验证方法的动机。在套索和脊模型的情况下,CV有助于选择调整参数lambda的值。

在您的示例中,您可以执行plot(reg)或reg $ lambda.min来查看lambda的值,该值导致最小的CV错误。然后,您可以为该lambda值派生Test MSE。默认情况下,glmnet()将对自动选择的lambda范围执行Ridge或Lasso回归,这可能不会给出最低的测试MSE。希望这有帮助!

希望这有帮助!

答案 1 :(得分:1)

在reg $ lambda.min和reg $ lambda.1se之间; lambda.min显然会给你最低的MSE,但是,根据你对错误的灵活程度,你可能想选择reg $ lambda.1se,因为这个值会进一步缩小预测变量的数量。您也可以选择reg $ lambda.min和reg $ lambda.1se的平均值作为lambda值。