如何使用cv.glmnet(R中的LASSO回归)进行交叉验证?


10

我想知道如何使用R中的glmnet正确地训练和测试LASSO模型?

  • 具体来说,我想知道如果缺少外部测试数据集该如何使用交叉验证(或其他类似方法)来测试我的LASSO模型,该怎么做。

让我分解一下情况:

我只有一个数据集来通知和训练我的glmnet模型。结果,我将不得不使用交叉验证来拆分数据,以生成一种测试模型的方法。

我已经在使用cv.glmnet,根据软件包的详细信息

对glmnet进行k折交叉验证,生成图并返回lambda的值。

  • 进行交叉验证cv.glmnet只是为了选择最佳的λ,还是作为更通用的交叉验证程序?

    • 换句话说,我还需要执行另一个交叉验证步骤来“测试”我的模型吗?

我正在假设“是的”。

既然如此,如何交叉验证我的cv.glmnet模型?

  • 我是否必须手动执行此caret功能,或者该功能对glmnet模型有用吗?

  • 我是否使用交叉验证的两个同心“循环”?...我是否使用CV的“内循环” cv.glmnet来确定k倍交叉验证处理的“外部循环”的每k的最佳lambda值?

    • 如果我对已经进行交叉验证的cv.glmnet模型进行交叉验证,那么如何cv.glmnet在交叉验证的“外部循环”的每一折中将“最佳”模型(与“最佳” lambda值隔离)与每个模型隔离?

      • 注:我定义“最好”的模式,与产生最小的1 SE内的MSE拉姆达关联的模型......这是$lambda.1secv.glmnet模型。

内容:

我正在尝试根据树木直径(“ D”),D ^ 2和种类(“ factor(SPEC)”)来预测树木年龄(“年龄”)。[结果方程式:Age ~ D + factor(SPEC) + D^2]。我有约5万行数据,但数据是纵向的(通过时间跟踪个体),由约65种组成。


1
对于那些投票关闭而不发表评论的人:这没有帮助...让我知道您的评论中有什么问题,我将尝试解决。
theforestecologist

1
他们没有投票决定关闭,而是投票将其迁移到CrossValidated。我刚刚添加了投票。
Hack-R

@theforestecologist:您应该可以通过单击“关闭”按钮来查看关闭/迁移的原因。
DWin

感谢您的提问,我确实有这个问题。而且我不能使用插入号,因为我有多元Y。但是您是否检查了源代码并确认不需要其他CV?源代码可能很难遵循。
qoheleth

Answers:


3

是在cv.glmnet中执行交叉验证只是为了选择最佳的lambda,还是将其用作更通用的交叉验证程序?

它几乎完成了交叉验证所需的一切。例如,它lambda在数据上拟合可能的值,选择最佳模型,最后使用适当的参数训练模型。

例如,在返回的对象中:

cvm是交叉验证的平均误差。 cvsd是估计的标准偏差。

像其他返回值一样,这些值是在测试集上计算的。最后,

glmnet.fit 为模型提供最佳参数的所有数据训练(训练+测试)。

我是否必须手动执行此操作,或者插入符号功能对glmnet模型有用吗?

您无需手动执行此操作。“ Caret”将非常有用,并且是我最喜欢的软件包之一,因为它适用于具有相同语法的所有其他模型。我自己经常使用caret而不是cv.glmnet。但是,在您的情况下,它基本上是相同的。

是否使用交叉验证的两个同心“循环”?...是否通过cv.glmnet使用CV的“内循环”来确定k折的“外部循环”的k折内的最佳lambda值交叉验证处理?

您可以执行此操作,此概念与用于模型选择的嵌套交叉验证嵌套交叉验证的想法非常相似。

如果我对已经交叉验证的cv.glmnet模型进行交叉验证,那么如何在“外部循环”的每一折内将“最佳”模型(与“最佳” lambda值隔离)与每个cv.glmnet模型隔离交叉验证?

只需运行一个循环,您就可以在其中生成训练数据,并cv.glmnet在训练数据上运行测试数据,并使用模型glmnet.fit对测试数据进行预测。


@discupulus:谢谢。您能为此提供一些证据吗?(即,请逐步引导我)。另外,根据您的回答,这是否意味着无需进一步的交叉验证过程即可报告数据的性能指标?(我可以简单地报告lambda.1se情况下,我最终模型性能的MSE?)
theforestecologist

是的,不需要进一步的交叉验证。作为证据,您可以cv.glmnetR开源一样查看函数的源代码。只需输入cv.glmnet控制台。
discipulus

3
@discipulus。我通过电子邮件发送给Trevor Hastie,询问“ cv.glmnet(R实现)是仅CV选择lambda吗?还是通过外部CV来验证所选的lambda?换句话说,如果我们要对自己的外部CV进行编码,想验证所选的lambda?” 然后他回答(相当快)“是的,只是为了选择lambda”,我解释说这仅是内部CV,我们将不得不编写自己的外部CV。
qoheleth

@theforestecologist我正在尝试学习有关交叉验证的更多信息,并寻找适合您的职位。我不明白cv.glmnet还可以用作更通用的交叉验证程序的意思。我认为唯一可用的参数是lambda-交叉验证的哪个外层存在?如果您能答复将不胜感激。谢谢!
user2450223 '19
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.