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

Posted

技术标签:

【中文标题】在调整参数时识别交叉验证的 SVM 中的过拟合【英文标题】:Identifying overfitting in a cross validated SVM when tuning parameters 【发布时间】:2016-07-01 07:46:36 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

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

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

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

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

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

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

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

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

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

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

【讨论】:

所以要生成诊断曲线,我应该根据验证准确度绘制 k(对于给定的一组参数)?然后我应该分析这些曲线以确定这些参数是否过拟合? 您希望增加沿 x 轴的训练集大小(增加 k 也是增加训练集大小的一种度量)。对于您选择的每个 x 轴值,然后计算训练误差(模型在训练集上运行,或者如果进行 CV,则模型的平均值跨越非遗漏折叠)并将其作为训练误差曲线。然后还计算测试误差(测试集上的模型准确度,或者如果进行 CV,则计算左侧折叠的平均值)并将其作为测试误差曲线。 测试误差曲线应该高于训练误差曲线。测试误差曲线应该从高开始,然后随着训练集的增大而逐渐变小。随着训练集变大,训练误差曲线应该变大。两条曲线都应该达到高原 - 将更多数据转移到训练集不会显着影响事物的平坦部分。在高原地区,如果训练误差已经太大,则意味着模型偏差(错误的模型,特征太少,或者需要更多的数据)。过度拟合是指训练误差可以,但测试误差有很大差距。

以上是关于在调整参数时识别交叉验证的 SVM 中的过拟合的主要内容,如果未能解决你的问题,请参考以下文章

使用交叉验证和 F1 分数选择 SVM 参数

机器学习系列(二十四)——交叉验证与偏方差权衡

模型拟合和交叉验证

交叉验证iris数据集

交叉验证iris数据集

SVM学习笔记:什么是交叉验证