在调整参数时识别交叉验证 SVM 中的过度拟合

Identifying overfitting in a cross validated SVM when tuning parameters

我有一个正在使用 gridsearchcv 调整的 rbf SVM。我如何判断我的好结果实际上是好结果还是它们是否过度拟合?

过度拟合通常与高方差相关,这意味着拟合到某些已实现数据集的模型参数在数据集与数据集之间具有高方差。你收集了一些数据,拟合了一些模型,获得了一些参数......你再次这样做并获得了新数据,现在你的参数完全不同了。

这样做的一个结果是,在存在过度拟合的情况下,通常训练误差(直接在用于训练它的数据上重新 运行 模型的误差)会非常低,或者在与测试误差相比最低(运行 一些以前未使用的测试数据的模型)。

Andrew Ng 建议的一种诊断方法是将您的一些数据分离到测试集中。理想情况下,这应该从一开始就完成,这样碰巧看到包含此​​数据的模型拟合结果就永远不会有机会影响您的决定。但你也可以事后做,只要你在你的模型讨论中这样解释。

对于测试数据,您想要计算与训练数据相同的错误或损失分数。如果训练误差非常低,但测试误差高得令人无法接受,则可能是过度拟合。

此外,您可以改变测试数据的大小并生成诊断图。假设您随机抽取 5% 的数据,然后是 10%,然后是 15% ... 最多 30%。这将为您提供六个不同的数据点,显示由此产生的训练误差和测试误差。

随着训练集大小的增加(测试集大小的减少),两条曲线的形状可以提供一些见解。

测试误差会减少,训练误差会增加。两条曲线应该变平并在它们之间有一些间隙收敛。

如果差距很大,您可能正在处理过度拟合,建议使用较大的训练集并尽可能收集更多数据。

如果差距很小,或者训练误差本身已经太大,则表明模型偏差是问题所在,您应该同时考虑不同的模型class。

请注意,在上述设置中,您还可以用 k 折交叉验证代替测试集方法。然后,要生成类似的诊断曲线,您应该改变折叠的数量(因此改变测试集的大小)。对于给定的 k 值,然后对于用于测试的每个子集,其他 (k-1) 个子集用于训练误差,并在分配折叠的每种方式上取平均值。对于给定的 k 选择,这会为您提供训练误差和测试误差指标。随着 k 变大,训练集大小变大(例如,如果 k=10,则 90% 的数据会报告训练错误),因此您可以再次看到分数如何随训练集大小变化。

缺点是 CV 分数的计算成本已经很高,并且对许多不同的 k 值重复 CV 会使情况变得更糟。

过度拟合的另一个原因可能是某个特征太大 space。在这种情况下,您可以尝试查看每个特征的重要性分数。如果你剪掉一些最不重要的特征,然后重新做上面的过度拟合诊断并观察到改进,这也是问题过度拟合的一些证据,你可能想使用一组更简单的特征或不同的模型 class.

另一方面,如果您的偏差仍然很高,则表明情况恰恰相反:您的模型没有足够的特征 space 来充分说明数据的可变性,因此您可能需要使用更多功能扩充模型。