为了有用,一个测试集不是经常成为第二个开发集吗?

数据挖掘 机器学习
2021-10-14 13:26:57

我对机器学习中测试集的预期用途/价值有点不清楚。假设您使用的是训练/开发/测试拆分,这是一个解释我的困惑的故事:

您使用您的开发集来选择最佳超参数并进行各种调整,当您最终“完成”时,您可以在测试集上对其进行评估。您的测试性能比您的开发性能差得多。

所以现在你得出结论,“我的开发集一定太小了,导致我的超参数过拟合。” 所以你让你的开发集更大,找到新的超参数,并再次评估你的测试集。现在您的开发和测试性能彼此接近。

但请注意,在这种情况下,您使用了两次测试集。所以从某种意义上说,你正在将你的超参数拟合到你的测试集,它成为了第二个开发集。

尝试回答我自己的问题:我想您可以说测试集的价值在于,如果没有它,您永远不会知道自己过度拟合了超参数。只要我们没有以上述方式“过多”地使用测试集(一次又一次地增加开发集大小),它仍然是“大部分”无偏见的。然而,我们不得不承认,测试集只有在我们只需要一次的情况下才是真正无偏的。

你认为这是一个准确的看法吗?

顺便说一句,如果您的测试性能变得更糟,我不确定您是否可以做任何其他事情(除了增加开发集大小)。好吧,我想你可以哭了;)。但是还有其他选择吗?

2个回答

您是绝对正确的,是的,如果您不小心,实际上可能会过度拟合您的验证数据。谷歌的一些研究人员发表了一篇关于这个问题的有趣文章以及一种解决它的方法,称为Reusable Holdout一般的想法是您只能通过特殊的中介算法访问测试集。显然这不是大多数人的工作方式。在实践中,我认为一种常见的方法是使用多个保留:在您的大部分原型设计中使用一个,然后一旦您满意,您可以将评估扩展到一个或多个额外的保留。

实际上你是对的,你必须尽可能少地使用测试集,如果你想确定它会保留一个测试集,而不是另一个开发集。

也就是说,当您看到测试集上的性能比开发集差得多时,除了触摸开发集的大小之外,您还有其他选择:

1)在模型中添加更多的惩罚,如正则化形式(L1、L2等);

2) 降低模型的自由度,例如在 NN 的情况下层/节点的数量,或在决策树等类似情况下的树数;

3)减少学习时期;

4)尝试一些(更积极的)数据增强技术;

您还可以在测试集中使用数据增强:对于测试集的每个样本,您可以使用您在训练集上使用的相同形式的数据增强,最后将各种单个结果的平均值作为结果。即使这种技术不能解决开发集和测试集的非常大的性能差异,它也可以使您的模型可以接受。在最后一种情况下,您当然还必须在部署模型时在真实数据上使用它。

一般来说,如果你需要多次访问测试集,为了得到一个更少偏差的模型,你可以重新洗牌所有数据,然后在训练/开发/测试中再次划分。当然,尽可能少地访问测试集的规则仍然适用。