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

时间:2016-03-15 17:51:49

标签: python scikit-learn svm cross-validation grid-search

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

1 个答案:

答案 0 :(得分:3)

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

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

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

使用测试数据,您希望计算在训练数据上计算的相同误差或损失分数。如果训练误差非常低,但测试误差高得令人无法接受,那么你可能会过度拟合。

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

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

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

如果差距很大,您可能会处理过度拟合,并建议使用大型训练集,并尽可能尝试收集更多数据。

如果差距很小,或者训练误差本身已经太大,则表明模型偏差是问题,你应该一起考虑不同的模型类。

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

缺点是CV分数的计算成本已经很高,而且许多不同k值的重复CV会使其更糟糕。

过度拟合的另一个原因可能是特征空间太大。在这种情况下,您可以尝试查看每个功能的重要性分数。如果您删除一些最不重要的功能,然后重新执行上述过度拟合诊断并观察改进,那么也有一些证据表明该问题过度拟合,您可能希望使用更简单的一组功能或不同的功能模特课。

另一方面,如果您仍有较高的偏见,则表明相反:您的模型没有足够的特征空间来充分考虑数据的可变性,因此您可能希望扩充模型具有更多功能。