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

Difference between glmnet() and cv.glmnet() in R?

我正在进行一个项目,该项目将显示一组事件对结果的潜在影响。我正在使用 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(应该是默认值)时它运行良好,但如果我不指定它就不能正常运行?

提前致谢!

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

cv.glmnet() 执行交叉验证,默认为 10 倍,可以使用 nfolds 进行调整。 10 倍 CV 会将您的观察结果随机分成 10 个大小大致相等的不重叠 groups/folds。第一折将用于验证集,模型适合 9 折。偏差方差优势通常是使用此类模型验证方法的动机。对于 lasso 和 ridge 模型,CV 有助于选择调整参数 lambda 的值。

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

希望对您有所帮助!

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