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


17

考虑一个神经网络:

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

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

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


4
您希望它是相同的,但是不能确定,因为您已触摸它以进行超参数优化和提前停止,因此您需要一个原始测试集。
Emre

@Emre但是权重将根据训练集而不是验证集进行调整,因此测试和验证集上的结果不应有差异。
user1825567 '17

不,他们没有(根据培训情况进行调整)。这是常规参数。
Emre'4

Answers:


23

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

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

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

测试集使您的比较基于在训练/超参数选择过程的任何部分中都没有使用的数据,从而可以无偏颇地比较不同的模型。


11

测试集和交叉验证集具有不同的用途。如果您放弃其中任何一个,则会失去其优势:

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

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

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

出于同样的原因,您不能删除交叉验证集,也不能使用测试集来选择超级参数,因为那样就可以保证您高估了模型的质量。在理想情况下,您只需使用测试集一次,或者以“中立”方式使用它来比较不同的实验。

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

从目睹许多Kaggle比赛开始,我的经验是,过度使用它来调整测试集是一件实事,并且在很大程度上影响着这些比赛。通常会有一群竞争者爬上公共排行榜,并选择了他们的最佳测试模型(公共排行榜实际上是一个测试集),同时他们的交叉验证还不够彻底。。。当最后引入新的测试集时,这些竞争者将跌倒排行榜。

一种合理的方法是在测试之前重新使用(训练+ cv)数据使用发现的超参数重新训练。这样一来,您就可以训练更多的数据,并且最终仍然可以独立地衡量性能。

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

最后,请始终检查用于验证和测试的拆分是否可靠,以防止数据集中可能存在的相关性。


1
“对数据集中可能存在的相关性进行鲁棒性”是什么意思?
user6903745 '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.