检测过拟合的最佳方法是什么?

人工智能 机器学习 过拟合 交叉验证 搜索引擎 k-fold-cv
2021-10-25 01:38:25

我想问一下针对过度拟合测试 ML 模型的方法。请注意,我不是说任何像正则化这样的过拟合减少方法,只是一种判断模型是否存在过拟合问题的方法。

我目前正在开发一个基于进化算法调整模型(特征、超参数)的框架。而我面临的问题是在使用测试集之前缺乏一个好的方法来判断模型是否过拟合。我遇到了这样的情况,即模型在训练集和验证集上都很好,但在随机和非随机训练和验证拆分的测试集上表现不佳。我使用了 k-fold 交叉验证,另外估计了所有折叠结果的标准偏差(较小的偏差意味着更好的模型),但是,它仍然没有按预期工作。

总而言之,我通常看不到训练、验证和 k 倍错误与测试错误之间的相关性(或非常差的相关性)。换句话说,调整模型以获得上述任何测量值的较低值通常并不意味着降低测试误差。

我可以问你,在实践中你如何测试你的模型?也许还有一些典型的机器学习书籍中没有提到的新方法?

1个回答

tl;博士

我发现最安全的方法是使用交叉验证来选择超参数,并使用保留测试集进行最终评估。

为什么这对你不起作用...

在您的情况下,我怀疑您要么在选择超参数期间运行大量迭代,要么您的数据集相当(甚至两者兼而有之)。如果您找不到更多数据或使用更大的数据集,我建议限制超参数选择阶段的详尽性。如果您运行该过程足够多次,则模型必然会在验证集上过拟合。

请注意,在测试集之前没有保证检测过拟合的安全方法!

为什么我认为这种策略是最安全的

您需要能够检测两种不同类型的过拟合。

第一个是最直接的:在训练集上过拟合这意味着该模型已经记住了训练集,并且无法进行泛化。如果测试集与训练集略有不同(这是大多数现实世界问题的情况),那么模型在它上的表现将比在训练集上更差。这很容易检测,事实上,您唯一需要捕获的就是测试集!

您需要检测的第二种过度拟合是在测试集上想象一下,您有一个模型,并且您使用测试集进行了详尽的超参数选择。然后你在同一个测试集上进行评估。通过这样做,您已经调整了超参数以获得特定测试集的最佳分数。因此,这些超参数过度拟合该测试集,即使该集的样本在训练期间从未见过。这是可能的,因为在迭代超参数选择过程中,您已将有关测试集的信息传递给模型

这更难检测。事实上,这样做的唯一方法是将原始数据分成三部分:训练集、验证集和测试集。第一个用于训练模型,第二个用于超参数选择,最后一个用于最终评估。如果你的模型已经过拟合(即测试性能比训练和验证差),你需要从头开始随机播放您的数据,再次拆分并重复该过程。这通常被称为保持策略

为了使模型更不容易过度拟合,您可以使用交叉验证而不是保留验证集。因为你的模型现在必须接受训练k略有不同的训练集和评估k完全不同的验证集,它很难在验证集上过拟合(因为它需要欺骗 k不同的验证集而不是一个)。

这可能不适用的情况

根据具体情况,应用这两种技术可能不切实际。

  • 交叉验证在过度拟合方面非常稳健,但它给您的过程带来了计算负担,因为它需要对同一模型进行多次训练。这对于计算量大的模型(例如图像分类器)显然是不切实际的。在这种情况下,请使用前面提到的保留策略。

  • 使用保留测试集意味着您正在减少训练集的大小,这实际上可能使您的模型更容易过度拟合(即具有更高的方差)小数据集在这种情况下(如果您的模型由于体积小而实际上无法训练),您可以求助于交叉验证,但您可能会在验证集上过度拟合并且无法检测到它。

如何对抗过拟合

由于它是相当相关的,我将发布一个关于如何对抗过度拟合的答案的链接。