交叉验证与训练验证测试

机器算法验证 机器学习 交叉验证
2022-03-17 08:29:22

我对交叉验证方法和训练验证测试方法有疑问。

有人告诉我,我可以将数据集分成 3 个部分:

  1. 训练:我们训练模型。
  2. 验证:我们验证和调整模型参数。
  3. 测试:从未见过的数据。我们得到一个无偏的最终估计。

到目前为止,我们已经分为三个子集。直到这里一切都好。附上一张图片:

在此处输入图像描述

然后我遇到了 K-fold 交叉验证方法,我不明白的是如何将测试子集与上述方法联系起来。意思是,在 5 折交叉验证中,我们将数据分成 5 份,在每次迭代中,非验证子集用作训练子集,验证用作测试集。但是,就上述示例而言,k-fold 交叉验证中的验证部分在哪里?我们要么有验证,要么有测试子集。

当我提到自己训练/验证/测试时,“测试”就是得分:

模型开发通常是一个两阶段的过程。第一阶段是训练和验证,在此期间,您将算法应用于您知道结果的数据,以揭示其特征和目标变量之间的模式。第二阶段是评分,在此阶段您将训练好的模型应用于新数据集。然后,它以分类问题的概率分数和回归问题的估计平均值的形式返回结果。最后,您将经过训练的模型部署到生产应用程序中,或使用它发现的见解来改进业务流程。

谢谢!

我想从https://towardsdatascience.com/train-validation-and-test-sets-72cb40cba9e7

训练数据集 训练数据集:用于拟合模型的数据样本。我们用来训练模型的实际数据集(神经网络中的权重和偏差)。模型会看到这些数据并从中学习。验证数据集验证数据集:用于在调整模型超参数时对模型拟合在训练数据集上的无偏评估的数据样本。随着验证数据集的技能被纳入模型配置,评估变得更加有偏见。验证集用于评估给定模型,但这是用于频繁评估。作为机器学习工程师,我们使用这些数据来微调模型超参数。因此,模型偶尔会看到这些数据,但从未从中“学习”。我们(主要是人类,至少截至 2017 年 😛 )使用验证集结果并更新更高级别的超参数。因此,验证集以某种方式影响模型,但间接影响。

测试数据集 测试数据集:用于对训练数据集拟合的最终模型进行无偏评估的数据样本。

测试数据集提供了用于评估模型的黄金标准。它仅在模型完全训练后使用(使用训练集和验证集)。测试集通常是用来评估竞争模型的(例如在许多 Kaggle 比赛中,验证集最初与训练集一起发布,而实际测试集仅在比赛即将结束时发布,并且是决定获胜者的测试集上的模型的结果)很多时候验证集被用作测试集,但这不是一个好的做法测试集通常是精心策划的。它包含仔细采样的数据,这些数据跨越了模型在现实世界中使用时将面临的各种类。

我想说的是:**考虑到这一点,我们仍然需要 TEST 拆分才能很好地评估我们的模型。否则我们只是在训练和调整参数,而不是把模型带到战场**

4个回答

到目前为止,其他答案中缺少的是交叉验证只是一个更复杂的替代品,它可以替代单个(也称为保留)拆分以拆分数据集的一部分。

您可以描述训练/验证/测试拆分(图表的前 3 行):

解释内部和外部分裂的图表

  1. 拆分原始集:将测试集从外部训练集中拆分出来
  2. 拆分外部训练 st:将验证集从内部训练集中拆分出来。

现在,知道我们想要拆分的内容(图中的蓝色),我们需要指定每个拆分是如何完成的。原则上,我们拥有各种方法来生产(或多或少)独立的拆分,从

  • 各种重采样技术(包括交叉验证)
  • 进行一次随机拆分(又名坚持)
  • 获得真正新的独立数据,即使根据测试设计的实验(这甚至可能是@FransRodenberg 提到的外部验证)

这些拆分方法(如何)具有不同的统计和“数据逻辑”属性,允许在哪些条件下选择什么是好的。

  • 如果没有其他说明,则默认为单个随机拆分,即保留。

  • 例如,您可能决定最终测试不应该只在原始数据之外的随机数据集上进行,而是应该根据允许解释测试结果的实验​​设计以各种方式测试最终模型。混杂因素和仅在模型最终确定(完全训练)且不进行进一步参数调整后获得的案例。
    所以采用这样的数据采集方案进行外拆分。

  • 您还可以决定,对于内部拆分,应该使用交叉验证而不是单个随机/保留拆分,以便您的超参数优化可以从性能估计中较低的方差不确定性和测量模型稳定性的可能性中受益。

  • 等等

所以:

  • 链接的帖子描述的是对内部拆分使用交叉验证并为外部拆分保留。
    如果调整是手动/交互完成的,这通常使用:您可以在外部训练集中做任何您认为合理的事情。完成后,您可以通过使用迄今为止完全未触及的测试集进行测试来“结账”。

  • 从统计学的角度来看,交叉验证比单个随机分割更好(在相同的偏差下更精确,可能的稳定性信息),但以计算时间为代价。
    因此,您还可以通过第二个(外部)交叉验证替换外部保留拆分。(如果超参数调整是自动的,这很有效,但如果调整是由一个人手动完成的,则不起作用:这将非常乏味,并且人类记忆会记住先前看到的数据,因此会破坏折叠之间的独立性)
    如果你看在生成的代码中,您有 2 个嵌套的交叉验证循环(外部拆分和内部拆分)。这就是为什么这种技术被称为嵌套交叉验证的原因。有时也称为双交叉验证

    训练步骤的嵌套循环而担心计算时间,那么还有其他重采样技术可以让您更自由地选择代理模型的数量独立于被拆分的案例进行评估(它当然不再是嵌套交叉验证,而是实际使用的重采样技术的嵌套名称)。(kinner+1)kouter(+1)

  • 为了完整起见,您还可以决定对内部拆分使用保留,对外部拆分使用交叉验证。虽然这是有效的,但它不会有很好的属性:

    使用内部拆分完成的优化/调整需要高精度的性能估计才能稳定。这清楚地表明对内部拆分也使用重采样技术(例如交叉验证)=> 所以使用嵌套交叉验证。

K折交叉验证(CV)的一般流程是:

  • 洗牌数据集
  • 保留其中的一部分(),它将作为您的无偏见测试集。 20%
  • 选择一组超参数。
  • 将其余数据分成部分。K
  • 使用一部分作为验证集,其余作为训练集。
  • 您的验证性能(给定的超参数)被确定/评估为选择个集合中的每一个作为 CV 集合一次的平均值(数学上(随机选择)。KKP(set(k))(Performance)=K1K(Performance)

用外行的话来说,假设您有一个题库,并且您必须向其他人报告您的知识。你设置了一定数量的问题作为测试(除了最后不要碰它)。剩下的你分成个部分并使用一组问题来训练你的知识(同时查看问题和答案)和最后一组来验证你的知识(解决问题,看不到答案),你对所有集合执行此操作,每次选择一个集合作为验证集。最后,您在测试集上进行测试并报告您的知识。K(K1)

仅当您拥有非常大的数据集时,数据拆分才可靠,但是由于您在评论中提到作为示例,因此您应该没问题。但是,如果您的数据集很小,则可以通过不同的拆分获得非常不同的结果。在这种情况下,请考虑改为进行嵌套交叉验证。n=100,000


但是,您链接的帖子将(正常,非嵌套)交叉验证与单个随机拆分结合在一起。整个过程如下:

  1. 将数据集随机分为训练集和测试集;
  2. 将您的火车组随机分成部分;k
  3. 部分 进行交叉验证来选择您的最佳模型:k
    • 训练零件;k1
    • 评估剩余部分的性能;
    • 重复,直到所有部件都用于评估一次;
  4. 重新训练整个训练集上的最佳模型(或保留步骤 3 中的模型,例如获得多数票);
  5. 评估您的最佳模型(最多只有少数)在测试集上的性能。

您在步骤 5 中获得的方差和偏差估计值是您得出结论的依据。

步骤 1 中的拆分由您决定。许多人使用 80/20 拆分,但如果您的数据足够大,您可以使用较小的测试集。就计算时间而言,步骤 2 中的拆分通常应该尽可能大。10倍CV是常见的选择。您甚至可以多次运行步骤 2-3 并对结果进行平均。这对于您在步骤 2 中可能从不同随机拆分获得的不同结果更加稳健。

最后,请注意,您应该小心使用“无偏见”这个词。交叉验证仍然是内部验证的一种形式,不能解释这个特定数据集的偏差。获得无偏估计的唯一方法是通过外部验证(即多个数据集/研究/来源)。

训练集、验证集和测试集的定义可能会有所不同。此外,并不总是需要您描述的三组。有时,一个训练集和一个验证集就足够了。

在 k-fold CV 中,您将数据集拆分为 k 个不同的折叠。您使用 k-1 折来训练您的模型,然后使用第 k 折来验证它。现在,为了验证它,甚至可以替换为测试它,因为第 k 次折叠没有用于训练。然后再重复该过程 k-1 次,验证(或测试)集将有所不同。