执行交叉验证以比较 R 中的 Lasso 和其他回归模型

机器算法验证 r 回归 交叉验证 网络
2022-04-15 12:05:01

我使用标准的 lm 函数以及 rlm 和 lmrob 构建了一些“常规”和稳健的回归模型。虽然我知道有一些关于使用逐步回归的讨论,但我已经使用 stepAIC 函数来修剪我的变量集。在我使用 stepAIC 获得一组减少的变量后,我运行了一些稳健的回归。

cvTools允许我使用交叉验证来比较各种模型的性能。

我显然想在我的数据集上运行套索回归(最好使用glmnet包)。

我的问题是是否有一个已经构建的包/功能允许我使用交叉验证来比较套索回归模型与其他模型。

如果没有,那么我最初的想法是回到第一原则并手动编码 K 折交叉验证以进行 lasso 回归。但是,我现在想知道这在理论上是否是一个好主意。每次我在手动 CV 中运行折叠时,我都会在训练集上运行 cv.glmnet。每个训练集很可能会产生不同的 lambda.min 和 lambda.1se。

我的问题是:考虑到为每个折叠选择的 lambda 将产生不同的套索结果,通过平均每个折叠的误差来确定整体 CV 误差在技术上是否合适?

这是我用来在数据集上创建留一式 CV 以评估套索回归的一些示例代码。我已经使用 lambda.1se 和 labmda.min 计算了每个折叠出现的交叉验证错误。

lassocv<-function() {

len<-length(drx$DR)

errmin<-0
err1se<-0
print(len)

for (i in 1:len) {
    gmer<-data.matrix(drx[-i,])
    yxer<-yx[-i]
    lfit<-cv.glmnet(gmer, yxer)
    newr<-data.matrix(drx[i,])
    pmin<-predict(lfit,newx=newr,s=lfit$lambda.min)[[1]]
	    p1se<-predict(lfit,newx=newr,s=lfit$lambda.1se)[[1]]
    errmin<-errmin+abs(pmin-yx[i])
    err1se<-err1se+abs(p1se-yx[i])
}
print(errmin/len)
print(err1se/len)

}

但是,我得到了不同的简历结果。为我的数据集返回的两个结果是 21.94867 和 23.74074。

1个回答

我不完全确定我完全理解您的问题在分析管道中的哪个位置,但我认为我可以通过您想要采取的步骤来解决它。您问题的软件部分在 CV 上是题外话,但关于 CV 的问题是题外话,所以我会回答这些。

我的问题是:考虑到为每个折叠选择的 lambda 将产生不同的套索结果,通过平均每个折叠的误差来确定整体 CV 误差在技术上是否合适?

基本模型开发过程通常针对整个数据集的三个部分呈现:训练、测试和验证。训练和测试数据一起用于调整模型超参数。验证数据用于根据模型构建中未使用的数据评估替代模型的性能。这个概念是,这代表了模型可能遇到的新数据。

对这个过程稍微复杂一点的阐述是嵌套交叉验证。这是首选,因为在整个过程中,所有数据最终都用于测试和训练模型。除了使用数据的一个分区,您可以对整个数据集(外部分区)进行 CV 分区,然后在保留外部分区之一(内部集)时再次对剩余的数据进行分区。在这里,您在内部集上调整模型超参数,并在外部保持集上评估样本外性能。最终模型是通过在整个数据集上组成最终分区来准备的,使用 CV 选择最终的超参数元组,然后最后在给定所选元组的所有可用数据上估计单个模型。这样,模型构建过程就像望远镜一样,

并不重要您使用样本外性能指标表征的是模型选择过程本身。归根结底,您仍然只会估计一个模型,这就是您关心在前面的步骤中,您不需要知道的特定值,除非作为实现样本外估计的一种手段。λminλminλmin

虽然我知道有一些关于使用逐步回归的讨论,但我已经使用 stepAIC 函数来修剪我的变量集。

这有点轻描淡写:这不是讨论,而是一种共识,即逐步结果是可疑的。如果您无论如何要拟合套索,则可以通过从分析中省略逐步回归步骤来获得统计上有效的模型。此外,由于套索步骤不会“看到”逐步步骤,因此您的结果将具有太窄的误差带,并且交叉验证结果将出现不可挽回的偏差。无论如何,套索使整个逐步步骤毫无意义,因为它们解决了相同的问题!Lasso 解决了逐步尝试解决的所有变量选择问题,同时避免了对逐步策略的大量广泛接受的批评。在这种情况下,单独使用套索没有缺点。我确信 R 中包含逐步方法的唯一原因是出于教学原因,因此如果有人需要证明其危险性,该功能是可用的。