对训练集进行交叉验证后是否需要测试集?

数据挖掘 机器学习 Python 交叉验证 训练 超参数调整
2022-03-09 13:12:52

我想引用Aurelien Geron 在使用 Scikit Learn 和 TensorFlow进行机器学习一书中的一段话,内容是在使用 k 折交叉验证对训练集进行超参数调整后评估最终测试集:

“如果您进行大量超参数调整,性能通常会比您使用交叉验证测量的稍差(因为您的系统最终经过微调以在验证数据上表现良好,并且在未知数据集上可能表现不佳). 在这个例子中不是这样,但是当这种情况发生时,你必须抵制调整超参数以使测试集上的数字看起来不错的诱惑;改进不太可能推广到新数据。

-第 2 章:端到端机器学习项目

我很困惑,因为他说当测试分数比交叉验证分数更差时(在训练集上),你不应该调整超参数来提高测试分数。但这不是拥有最终测试集的目的吗?如果测试分数更差,您无法调整超参数,那么评估最终测试集有什么用?

2个回答

在 Hastie 等人的“统计学习的要素”中,作者描述了关于模型性能测量的两个任务:

模型选择:估计不同模型的性能以选择最佳模型。

模型评估:选择最终模型,估计其对新数据的预测误差(泛化误差)。

CV 验证(或单独的验证集)用于模型选择,而测试集通常用于模型评估。如果您没有单独进行模型评估,您很可能会高估模型在看不见的数据上的性能。

为了让我们在同一页面上,一些先决条件

假设我们只有 2 次拆分训练和测试。现在,当我们使用测试拆分调整超参数时,我们正在尝试提高准确性(或任何其他指标)。虽然我们的模型没有在测试集上训练,但是我们让它在测试集上表现良好,在某种程度上模型获取了关于我们的测试集的信息(就像在测试集上训练一样)。所以现在我们的模型对训练集和测试集有点过拟合。这就是为什么我们将数据分成 3 个部分,即训练-验证-测试。

现在回答你的问题:

我认为本书作者想要提到的场景是,验证集并不完全代表模型正在训练的整个分布,因此执行超参数调整会过度拟合验证集上的模型,从而在验证集上表现不佳测试集。我认为如果验证集完全代表整个分布(或者测试集),如果我们对验证集执行超参数调整,测试集的准确性总是会提高。