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

机器算法验证 r 交叉验证 网络 套索
2022-03-11 23:21:02

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

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

让我分解一下我的场景:

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

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

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

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

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

我正在假设“是的,我愿意”。

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

  • 我必须手动执行此操作,还是该caret功能对 glmnet 模型有用?

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

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

      • 注意:我将“最佳”模型定义为与 lambda 相关的模型,该模型在最小值的 1 SE 内产生 MSE……这是模型$lambda.1se中的。cv.glmnet

语境:

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

1个回答

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

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

例如,在返回的对象中::

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

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

glmnet.fit给出在所有数据(训练 + 测试)上训练的模型,并具有最佳参数。

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

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

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

你可以这样做,这个概念非常类似于 Nested Cross-Validation Nested cross validation for model selection的想法。

如果我对我已经交叉验证的 cv.glmnet 模型进行交叉验证,我如何将“最佳”模型(从“最佳”lambda 值)与我原本“外部循环”的每个折叠中的每个 cv.glmnet 模型隔离开来”的交叉验证?

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