交叉验证和参数调整

机器算法验证 交叉验证
2022-01-26 21:36:30

谁能告诉我交叉验证分析的结果到底是什么?它只是平均准确度还是提供了任何参数调整的模型?

因为,我在某处听说交叉验证用于参数调整。

4个回答

交叉验证通过将数据的几个随机分区平均到训练和测试样本中来衡量样本外的准确性。它通常用于参数调整,方法是对参数的几个(或多个)可能值进行交叉验证,并选择交叉验证平均误差最低的参数值。

因此,该过程本身不会为您提供模型或参数估计,但您可以使用它来帮助在备选方案之间进行选择。

添加到乔纳森的答案中。

但是,如果您使用交叉验证进行参数调整,那么外样本实际上会成为您模型的一部分。因此,您需要另一个独立样本来正确衡量最终模型的性能。

用于衡量模型性能,交叉验证可以衡量的不仅仅是平均准确度:
您可以通过交叉验证衡量的第二件事是关于更改训练数据的模型稳定性:交叉验证构建了许多经过训练的“代理”模型训练集略有不同。如果模型稳定,则所有这些代理模型都是等价的,如果训练不稳定,则代理模型会有很大差异。您可以量化这种“变化很大”,例如作为同一样本的不同代理模型的预测方差(在迭代/重复交叉验证中),或者例如作为代理模型参数的方差。

要添加到以前的答案,我们将从头开始:

有几种方法可以使模型过度拟合训练数据,有些是显而易见的,有些则不那么明显。首先,最重要的是训练参数(权重)对数据的过度拟合(逻辑回归中的曲线拟合参数、神经网络中的网络权重等)。然后,您将对数据中的噪声进行建模 - 如果您过度拟合,您不仅会捕获潜在的生成函数,而且还会捕获由于样本大小以及样本不是总体的完美表示这一事实而导致的随机性。通过惩罚模型的某些属性(通常是复杂性)可以在一定程度上减轻这种过度拟合。这可以通过在训练样本的性能不再显着改善时停止训练来完成,方法是从神经网络中删除一些神经元(称为 dropout),https://ieeexplore.ieee.org/document/614177/)等)。然而,这些正则化策略本身是参数化的(你什么时候停止?要移除多少神经元?等等)。此外,大多数机器学习模型都有许多需要在训练开始之前设置的超参数。这些超参数在参数调优阶段进行调优。

这给我们带来了第二种更微妙的过拟合类型:超参数过拟合。交叉验证可用于找到“最佳”超参数,方法是从头开始在样本的 k-1 折上反复训练模型并在最后一折上进行测试。

那么具体是怎么做的呢?根据搜索策略(由 tenshi 提供),您设置模型的超参数并训练您的模型 k 次,每次使用不同的测试折叠。您“记住”模型在所有测试折叠中的平均性能,并为另一组超参数重复整个过程。然后,您选择与交叉验证期间的最佳性能相对应的一组超参数。如您所见,此过程的计算成本在很大程度上取决于需要考虑的超参数集的数量。这就是为什么已经制定了一些选择这套策略的原因(这里我将概括一下天师所说的):

  1. 网格搜索:为每个超参数枚举有限数量的可能值。然后对枚举的超参数的所有组合详尽地完成该过程。显然,如果你有连续的超参数,你就不能全部尝试。
  2. 随机网格搜索:类似于正常的网格搜索,但这次您不会详尽地尝试所有组合,而是对所有可能的值进行固定次数的采样。请注意,这里不仅可以枚举超参数的可能值,还可以提供要从中采样的分布。
  3. 贝叶斯搜索 - 选择超参数值的组合以最大限度地提高分数的预期改进。更多信息:http: //papers.nips.cc/paper/4522-practical-bayesian-optimization-of-machine-learning-algorithms.pdf还有一个只处理这个的库:https ://github.com/hyperopt/hyperopt 。由于与 sklearn 结合起来并不像 Tenshi 推荐的那样容易,因此只有在不使用 sklearn 时才使用它。
  4. 超参数空间中引导搜索的其他方法。根据我的经验,它们很少使用,所以我不会在这里介绍它们。

然而,这并不是故事的结局,因为超参数可以(并且将会)过度拟合数据。在大多数情况下,您可以忍受它,但如果您想最大化模型的泛化能力,您可能还想尝试对超参数进行正则化。首先,您可以通过使用嵌套网格搜索更好地评估样本外数据的性能(详情:http ://scikit-learn.org/stable/auto_examples/model_selection/plot_nested_cross_validation_iris.html ,讨论:嵌套交叉验证用于模型选择),或者只使用不用于超参数调整的验证集。至于超参数空间中的正则化,这或多或少是一个悬而未决的问题。一些想法包括不选择最佳的超参数值集,而是选择更接近中间的值;推理如下:最好的超参数值最有可能过度拟合数据,因为它比其他训练数据表现更好,坏参数只是坏参数,但中间的参数可能比最好的参数实现更好的泛化. Andrew Ng 写了一篇关于它的论文。另一种选择是限制您的搜索空间(您通过在此处引入强偏差来进行正则化 - 搜索空间之外的值将永远不会被明显选择)。

旁注:在大多数情况下,使用准确性作为性能指标是一个非常糟糕的主意,请查看 f1 和 f_beta 分数 - 在大多数情况下,这些指标将更好地反映您在二进制分类问题中实际尝试优化的内容。

总结一下:交叉验证本身用于评估模型在样本外数据上的性能,但也可用于结合超参数空间中的一种搜索策略来调整超参数。找到好的超参数可以避免或至少减少过拟合,但请记住,超参数也可以过拟合数据。

如果您来自 scikit-learn 背景,这个答案可能会有所帮助。

k折交叉验证用于将数据拆分为k分区,然后在分区上训练估计器,然后在k-1分区上进行测试kth像这样,选择哪个分区应该是kth分区,是有k可能的。因此,您会得到估算器k所有k可能性的结果。

这些是计算成本很高的方法,但如果您要尝试不同的估计器,您可以尝试这三种方法与 CV 一起进行超参数调整:

一世。GridSearchCV - 所有估计器的超参数的所有可能 P 和 C 的详尽列表。最后,使用该特定估计器 CV 的平均值给出最佳超参数。

ii. RandomizedSearchCV - 不执行所有超参数的 P 和 C,但在随机方法上,提供最接近的可能准确估计器,从而节省更多计算量。

iii. BayesSearchCV - 不是贝叶斯优化的一部分,scikit-learn但用于进行随机搜索和拟合结果。

tl:dr:CV 仅用于避免由于您传递的数据而为您的估计器带来高偏差和高方差。希望对您有所帮助。