什么是交叉验证?

机器算法验证 自习 交叉验证
2022-04-19 23:19:25

一个非常简单的问题:什么是交叉验证

据我了解,交叉验证用于选择模型而不是模型的参数,但我想检查我是否正确。著名的 k 折叠,如下图所示:

在此处输入图像描述

使用个训练-测试样本组合来训练和测试模型,用于避免过度拟合k

因此,如果我们有一个模型 M,该模型是针对每个训练测试组合从头开始训练的吗?

那么这些步骤正确吗?

repeat k times:
    train M with sample train[i]
    predict test[i] with M
    compute MeanSquaredError[i] for test[i]
    i = i+1
end repeat
compute mean of MeanmumSquaredError

由于每次都重新训练模型,这仅用于检查模型是否选择得当,而不是模型的参数,对吗?


更新:假设模型 M 是一个具有一个隐藏层的神经网络。例如,您是否使用交叉验证来选择隐藏层中的神经元数量?

3个回答

在我看来,交叉验证是一种估计模型及其参数性能的方法。它也是衡量模型及其参数的稳健程度的一个很好的衡量标准。

假设您决定两种方法适合您的数据:普通最小二乘法 (OLS) 和岭回归。

对于岭回归情况,有一个称为 lambda 的参数用于正则化中的系数总和。您如何确定 lambda 的哪个值提供了最佳模型?这就是 CV 的用武之地。您现在可以应用交叉验证来计算具有不同 lambda 的 MSE,并选择进一步增加它不会改善您的模型的 lambda 值。因此,CV 可用于参数优化。

另一个用途是比较模型,即OLS和岭,因此在优化参数后,您可以通过它们的CV误差来比较模型。然而,这是非常冒险的,我不会推荐它,因为即使 CV 提供了有关模型成功的一些见解,也无法确定您的模型到底有多好。一个可能存在风险的例子是选择一个模型参数,该模型参数过度拟合您的训练集并且在新数据上失败。

我没有完全理解你的伪代码,所以这里是一个留一法交叉验证的例子(k-fold CV,其中 k = 样本数):

for i=1:number of samples
   leave ith sample out so that you now have n-1 samples
   build model with remaining samples
   predict the ith sample (left out sample)
   calculate its error
   put the ith sample back in to have the original matrices again
end
calculate total error (MSE,RMSE or whichever measure you think is appropriate)

编辑:评论的答案是否定的。不应使用 CV 模型。相反,应该使用整个训练集构建最终模型。

显然,交叉验证是为了验证。

它可以衡量您的模型有多好(顺便说一句,我会使用MeanSquaredError而不是MinimumSquaredError,无论它是什么)。因此,它使您能够评估模型的未来性能并比较模型。

当然,您可以在没有交叉验证的情况下评估 MSE,但这会产生偏差,因为您必须使用相同的样本来训练和验证您的模型。

由于每次都重新训练模型,这仅用于检查模型是否选择得当,而不是模型的参数,对吗?

正确的。几乎。

想象一下,您的train程序包含一些特征选择方法。然后您不能通过交叉验证将模型与预先选择的特征进行比较(例如,您不能在 和 之间进行选择Y~X+ZY~X+V,因为您的train方法将为不同的折叠选择不同的特征。

另一方面,假设您的train程序估计所有参数而不是一个参数(例如)。然后,您可以通过交叉验证比较具有β0β0=1β0=2

因此,总结一下:您可以比较在方法内部未估计的参数不同的模型train(必须输入它)。

交叉验证是一种验证模型的方法,主要用于可用数据量非常有限的情况。你永远不想训练你正在验证的数据。另一方面,有时完全删除部分训练集(用于验证)的成本很高。交叉验证在这里是一个中间立场。我们使用训练集的一部分进行验证,但从不同时对相同的数据进行训练和验证。交叉验证是实现这一目标的优雅解决方案。