我明白了验证和训练集的意义,但测试集的重要性对我来说并不重要。
假设您训练了一个模型,并且您通过在验证集上测试您的模型来尽力避免过度拟合。
在你确定你有一个你引以为豪的模型之后,你对测试集进行最后的健全性检查,假设性能是垃圾。你真的要从头再来吗?它通知什么决策?在我的工作场所,我们构建时间表的方式,没有时间重新开始。
我明白了验证和训练集的意义,但测试集的重要性对我来说并不重要。
假设您训练了一个模型,并且您通过在验证集上测试您的模型来尽力避免过度拟合。
在你确定你有一个你引以为豪的模型之后,你对测试集进行最后的健全性检查,假设性能是垃圾。你真的要从头再来吗?它通知什么决策?在我的工作场所,我们构建时间表的方式,没有时间重新开始。
测试集的目的是为您提供整个模型构建过程的最终、公正的性能度量。这包括您管道中的所有建模决策,因此任何预处理、算法选择、特征工程、特征选择、超参数调整以及您如何训练您的模型(5 倍?引导程序?等)。所有这些决定都可能导致过度拟合;例如,选择一组超参数,这些超参数恰好对特定验证集是最优的,但对一般人群却不是。如果我们没有测试集,您将无法识别这一点,并且可能会报告高度乐观的分数。
此外,由于上述建模管道可能变得非常复杂,因此泄漏数据和过度拟合的可能性变得非常高。如果您调整到您的验证集,您将如何知道您的整个建模过程是否没有泄漏数据(因此过度拟合?)
你提出了一个很好的观点;当然,如果我们看到测试集的分数很差,那么我们可能会回去再次调整。因此,如果你使用它太多次,这只会将测试集降级为验证集,因为你现在遇到了过度拟合测试集的可能性(参见几乎所有 Kaggle 比赛)。但是,通过重复的测试集评估(训练模型,然后对其进行测试,然后使用不同的分区重复),您至少可以衡量您的模型在帮助缓解此问题方面的可变性。您重复的次数将取决于测试集分数的变化程度以及您愿意接受的不确定性(还有时间限制)。
在我看来,在业务环境中,您应该始终花时间正确测试您的模型。过度拟合的危险太高了,甚至更糟。你甚至不会知道。如果测试集分数最终成为“垃圾”,那么至少您知道该模型是垃圾并且您不使用它和/或您更改了方法。这比基于非严格验证认为模型很棒然后让模型在生产中失败要好得多。科学方法是有原因的吗?
我喜欢你的问题,它本质上有点哲学。
我们知道测试集不应该影响模型,否则它会充当验证集。因此,即使有足够的时间,如果我们对不好的测试结果采取行动并更改模型,测试集就会成为验证集,尽管它不像用于提前停止或参数调整的验证集那样复杂.
换句话说,测试集一定是没用的,就像你描述的那样!当它有用时,它就变成了一个验证集。虽然,更准确地说,测试集并不是没用的,因为它可能会降低您(和您的老板)对模型在生产中的后期性能的期望,从而降低那里发生心力衰竭的风险。
例如,在 Kaggle 比赛中,最终集是“测试集”,因为它不会影响提交的模型,但是一旦宣布最终排行榜,该测试集就会成为验证集;例如,它会影响我们以后选择的算法,即顶级竞争对手的算法。
总而言之,似乎大多数时候我们都在使用较少参与的验证集来仔细检查更多参与的验证集。
PS:在撰写此答案时,@aranglol提出了类似的注释和示例:) (+1)
所以,我从这里的良好反应中收集到,测试集的目的是:
虽然其他答案是完全正确的,但我想给你一个更简单(不是很深奥)的解释。
在机器学习模型中有两组参数:
parameters
模型的(由学习算法拟合,例如梯度下降);hyperparameters
模型(通常通过某种网格搜索选择)现在,您确实需要有单独的数据子集来估计这两个参数集:
train
设置拟合参数(例如线性回归的权重),validation
设置选择超参数(l1/l2 正则化的 alpha);最后,您需要有一个test
集合,以获取和估计模型性能。