是否可以使用测试样本来比较算法?

数据挖掘 机器学习 scikit-学习 采样
2021-09-26 03:28:31

我正在做一个小项目,我的数据集有 6k 行和大约 300 个特征,具有简单的二进制结果。

由于我仍在学习 ML,因此我想尝试所有可以找到并比较结果的算法。

正如我在教程中所读到的,我将我的数据集分为训练样本 (80%) 和测试样本 (20%),然后使用交叉验证 (5 折) 在训练样本上训练我的算法。

我的计划是以这种方式训练我所有的模型,然后在测试样本上测量它们的性能以选择最佳算法。

这会导致过拟合吗?如果是这样,由于我无法比较内部的几个模型model_selection.GridSearchCV,我该如何防止它过度拟合?

2个回答

基本上,每次您使用训练/测试拆分的结果来决定模型时——无论是调整单个模型的超参数,还是选择多个不同模型中最有效的模型,您都无法推断出任何关于性能的信息在做出这些决定之后对模型进行评估,直到您“冻结”您的模型并在尚未触及的部分数据上对其进行评估。

解决此问题的一般概念称为嵌套交叉验证。如果您使用训练/测试拆分来为模型选择最佳参数,那很好。但是如果你想估计它的性能,你需要在第二个保留集上进行评估。

如果您随后对多个模型重复该过程并再次选择性能最佳的模型,那很好,但是通过选择最佳结果,您的性能指标的本质上是有偏差的,您需要在另一个保留的集合上验证整个过程获得对模型在看不见的数据上的表现的无偏估计。

不,这不是测试集的目的。测试集仅用于模型完成后的最终评估。问题是,如果您在决策中包含测试集,您的评估将不再可靠。

为了比较算法,您改为留出另一块称为验证集的数据。

以下是有关根据数据大小进行良好拆分的一些信息:

来自改进深度神经网络的训练/开发/测试集: Andrew Ng 教授的超参数调整、正则化和优化

(安德鲁使用词开发集而不是验证集)