为什么同时使用验证集和测试集?

数据挖掘 机器学习 神经网络 交叉验证
2021-09-17 21:36:48

考虑一个神经网络:

对于给定的数据集,我们将其分为训练集、验证集和测试集。假设我们以经典的 60:20:20 比例进行操作,然后我们通过在验证集上检查网络来验证网络来防止过度拟合。那么需要在测试集上测试它来检查它的性能呢?

测试集上的错误会不会与验证集有些相同,因为对于网络来说,它是一个看不见的数据,就像验证集一样,而且它们的数量也相同?

相反,我们不能通过合并测试集来增加训练集,以便我们有更多的训练数据并且网络训练得更好,然后使用验证集来防止过拟合吗?我们为什么不这样做?

2个回答

假设您正在训练一个模型,其性能取决于一组超参数。在神经网络的情况下,这些参数可以是例如学习率或训练迭代次数。

给定超参数值的选择,您可以使用训练集来训练模型。但是,如何设置超参数的值?这就是验证集的用途。您可以使用它来评估模型在超参数值的不同组合下的性能(例如,通过网格搜索过程)并保持最佳训练模型。

但是,您选择的模型与其他不同模型相比如何?您的神经网络是否比使用相同的训练/测试数据组合训练的随机森林表现更好?您无法根据验证集进行比较,因为该验证集是模型拟合的一部分。你用它来选择超参数值!

测试集允许您以不偏不倚的方式比较不同的模型,方法是将您的比较基于在训练/超参数选择过程的任何部分中未使用的数据

测试集和交叉验证集有不同的用途。如果你放弃任何一个,你就会失去它的好处:

  • 交叉验证集用于帮助检测过拟合并协助超参数搜索。

  • 测试集用于衡量模型的性能。

您不能使用交叉验证集来准确测量模型的性能,因为您会故意调整结果以获得最佳指标,可能超过数百种参数变化。因此,交叉验证结果可能过于乐观。

出于同样的原因,你不能放弃交叉验证集并使用测试集来选择超参数,因为这样你几乎肯定会高估你的模型有多好。在理想情况下,您只使用一次测试集,或者以“中性”方式使用它来比较不同的实验。

如果您交叉验证,找到最佳模型,然后添加测试数据进行训练,则有可能(在某些情况下可能很有可能)您的模型会得到改进。但是,您无法确定这是否真的发生了,即使发生了,您也没有任何公正的估计新性能是什么。

从目睹了许多 Kaggle 比赛中,我的经验是,通过过度使用来调整测试集是真实的,它会在很大程度上影响这些比赛。经常有一群竞争者爬上了公共排行榜并在测试中选择了他们最好的模型(公共排行榜实际上是一个测试集),但对他们的交叉验证并不那么彻底。. . 当最后引入新的测试集时,这些竞争对手的排行榜会下降。

一种合理的方法是在测试之前重新使用 (train + cv) 数据以使用您找到的超参数重新训练。这样你就可以训练更多的数据,最后你仍然可以获得一个独立的性能衡量标准。

如果您想从交叉验证中获得更多收益,通常的方法是k-fold cross validationKaggle 比赛中的一个常见技巧是使用 k 折交叉验证,而不是将数据重新组合成更大的(训练 + cv)训练集,而是将 cv 结果集成或堆叠到元模型中。

最后,始终检查您的验证和测试拆分对于数据集中可能存在的相关性是否稳健。