为什么我和我的同事对测试集和验证集的定义相反?

机器算法验证 机器学习 神经网络 交叉验证 术语 验证
2022-02-12 13:58:50

在我的硕士课程中,我了解到在构建 ML 模型时:

  1. 在训练集上训练模型
  2. 将其性能与验证集进行比较
  3. 调整设置并重复步骤 1-2
  4. 当您满意时,将最终模型与测试(保留)集进行比较

当我开始作为 DS 工作时,我提出了一个关于测试集和验证集大小的问题,因为看起来好像有人给它们贴错了标签。这引起了混乱,因为显然其他人都使用了第 2 步中的“测试”集,并为第 4 步保留了“验证”集。

我以为我学错了,没有造成任何伤害,因为我只是将术语转换为一致。但是,我在重新研究一些深度学习书籍时发现,根据 Keras 的创建者的说法,我一直都是对的!就在我写这个问题之前,我发现这个问题表明测试/验证集的其他定义是正确的......

这是约定好的事情吗?经典机器学习方法和深度学习从业者之间是否存在关于正确术语的分歧?据我所知,没有人真正讨论过一些统计学家/数据科学家如何对这两个术语使用完全相反的定义。

3个回答

显然,这些术语的使用含糊不清,但我总是看到它们被用作有三组(或更多)数据集:用于训练模型的训练,用于在调整模型时评估模型性能的验证集,并持有-out测试集,您在最后使用来评估模型的性能。这些名称用于 Google 的机器学习速成课程François Chollet 的Python 深度学习书、Aurélien Géron 的使用 Scikit-Learn、Keras 和 TensorFlow 的动手机器学习书、Trevor Hastie的统计学习元素、 Robert Tibshirani 和 Jerome Friedman 以及其他一些书籍。

如果您觉得这个命名约定令人困惑,您可以像 Andrew Ng 一样,使用 train/dev/test命名,其中开发集用于开发

对于机器学习,我主要看到了 OP 描述的用法,但我也遇到了很多来自这种用法的困惑。


从历史上看,我猜发生的事情(至少在我的领域,分析化学)是随着模型变得越来越复杂,在某些时候人们注意到验证和确认需要独立的数据(在我们的术语中,几乎所有的测试都是例行的完成模型将被视为验证的一部分,而验证又是更广泛的方法验证任务的一部分)。输入验证集和方法,例如交叉验证(其最初目的是估计泛化误差)。

后来,人们开始使用我们称之为内部验证/验证的泛化误差估计,例如交叉验证或随机拆分来改进/优化他们的模型。输入超参数调整。
再次,人们意识到估计精化模型的泛化误差需要独立的数据。并且还需要一个新名称,因为已经建立了对用于精炼/优化的数据的“验证集”的使用。输入测试集。

因此,我们遇到了一种情况,即所谓的验证集用于模型开发/优化/细化,因此不再适合用于模型验证和验证的目的。


具有分析化学(或工程)背景的人肯定会将他们为方法验证目的使用/获取的数据称为验证数据* - 这是这些领域中术语的正确用法。

*(除非他们知道机器学习中术语的不同用法,在这种情况下,他们通常会解释他们到底在说什么)。


就个人而言,为了避免由于领域之间的术语冲突而导致的持续混乱,我已经开始使用“优化数据/集”来处理用于超参数调整的数据(Andrew Ng 的开发集也适合我)以及最终独立测试数据的“验证数据/集”(我们通常所做的测试实际上是验证而不是验证,因此避免了另一个常见错误:我们通常所做的测试甚至不接近分析化学中的完整方法验证,很高兴知道这一点)

我发现有助于避免混淆的另一个策略是从拆分为 3 个数据集回到拆分为训练和验证数据,然后将超参数调整描述为训练过程的一部分,其中恰好包括另一个用于拟合模型的数据拆分用于优化超参数的参数和数据。

我被告知您有一个用于调整的训练/测试拆分,然后您有一个验证集来“验证”您没有过度拟合您的测试拆分。如果您有一个小数据集,那么您只有训练/测试拆分,我永远不会将其称为训练/验证拆分,因为我认为验证是“验证”所有结果的最后一步,而测试是“测试” ' 你的模型基于看不见的数据。但是你可以很容易地翻转它们,而且都是一样的!

我注意到来回使用的术语,但只要每个人都在同一页面上,你怎么称呼它并不重要。

一些挖掘后编辑:

您的用法是正确的用法,尽管众所周知,反面经常使用(尽管不正确)。Wiki甚至有一个部分审查这种差异。

纯属猜想,但我认为它很可能源于此: 在此处输入图像描述

如果您只有一个简单的拆分,那就是训练/测试,这种拆分曾经是调整简单模型的标准方法,因此“测试”集就是一切。

更进一步,如果你只做 5 折交叉验证,那么你就是在做 5 个训练集和 5 个测试集。但是,如果您随后添加第三个保留集,那么您现在有 5 个训练集、5 个验证集和 1 个测试集。