我可以使用测试数据集来选择模型吗?

数据挖掘 机器学习
2022-02-14 14:26:40

我试图了解测试数据集是否可用于选择最终训练的模型。让我们假设这种情况:

我首先拆分了整个数据集:70% 的训练,30% 的测试。然后我通过交叉验证在训练数据集上拟合几个模型(比如 NN、RandomForest、AdaBoost 等),并调整超参数以获得训练数据的最佳性能。我知道这些分数是有偏差的,因为我正在调整这些数据的超参数。

然后我使用测试数据集在无偏数据上获得真实性能,并选择哪个模型表现最好。

这是使用测试数据集的正确方法吗?一些混淆来自测试数据集的互联网定义:

用于对适合训练数据集的最终模型进行无偏评估的数据样本。

似乎它应该只用于获得最终训练模型的性能。我的老师告诉我,我不能根据测试数据集的分数来选择训练好的模型,并引用了上面的定义。我很难相信她是正确的。那么应该使用哪个数据集来选择模型呢?

3个回答

你的老师是对的。测试数据集是看不见的数据。您无法使用测试集选择最终模型。在比赛中,公平地说,在您提交最终训练好的模型之前,不会显示测试数据集。

要选择最终模型的超参数(例如,激活函数、隐藏层数、单元数、学习率、dropout……),您应该使用验证集。

感谢您的回答。我咨询了更多人,我认为我已经确定了一个对我有意义的解释:

事实是,虽然“测试数据集”可以像我一样用来选择模型,但它并不是真正意义上的“测试数据集”。由于我使用数据集来选择模型,因此分数不再是无偏的,因此它不再代表真实的准确性,而是多个模型之间的无偏相对分数。我不应该把它称为“测试数据集”,因为它没有显示真正的最终准确性。它也许可以称为“验证 2 数据集”。

TLDR:“测试数据集”用于选择模型,但我不应该将其称为“测试数据集”,因为它显示的是相对分数,而不是真正的最终模型准确度。

你的过程没问题。通过使用 k 折交叉验证,您还(反复)将训练集进一步划分为训练集和交叉验证集。测试集可用于估计实际的泛化误差。

据我了解,您没有使用测试数据集来选择模型。

如果您不使用 k 折交叉验证,并使用“测试”集来选择模型,它仍然是正确的,但“测试”集将是您的交叉验证集。你不能做的是估计真正的泛化误差。

顺便说一句,70-30 似乎是一个激进的分裂;“这取决于”,但在这种情况下,90-10 留下了大量的测试数据。