libsvm“达到最大迭代次数”警告和交叉验证

机器算法验证 机器学习 交叉验证 支持向量机 正则化 libsvm
2022-02-13 23:54:43

我在 C-SVC 模式下使用带有 2 次多项式内核的 libsvm,我需要训练多个 SVM。每个训练集有 10 个特征和 5000 个向量。在训练期间,对于我训练的大多数 SVM,我都会收到以下警告:

WARNING: reaching max number of iterations
optimization finished, #iter = 10000000

有人可以解释一下这个警告意味着什么,也许,如何避免它?

我还想对我的模型应用交叉验证,以确定 gamma 和 C(正则化)的最佳选择。我的计划是尝试这 10 个值的每种组合:0.00001、0.0001、0.001、0.01、0.1、1、10、100、1000、10000 的两个参数,并查看哪种组合在交叉验证期间产生最佳精度。这够了吗?我应该在这个区间内使用更多的值,还是应该选择更宽的区间?

1个回答

此警告意味着 LIBSVM 使用迭代例程解决二次优化问题以找到最大边距超平面(即参数wb) 分离数据达到最大迭代次数,将不得不停止,而当前的近似值w可以进一步增强(即,w可以改变以使目标函数的值更极端)。简而言之,这意味着 LIBSVM 认为它未能找到最大边距超平面,这可能是真的,也可能不是。

发生这种情况的原因有很多,我建议您执行以下操作:

  • 规范化您的数据。
  • 确保您的班级或多或少是平衡的(具有相似的规模)。如果没有,请使用参数 -w 为它们分配不同的权重。
  • 尝试不同Cγ. LIBSVM 中的多项式内核也有参数“coef0”,因为内核是
    γuv+coeff0 degree

搜索最优是个好主意C在对数刻度上,就像你一样。我认为对于标准化数据的搜索范围C你建议的应该没问题。一个有用的检查:分类器的准确性在该范围的边界上和您的集合的两个值之间不应有太大变化。如果是,请扩大范围或添加中间值。

请注意,用于 Windows 的 LIBSVM 分发包应该包含一个名为 grid.py 的 Python 脚本,它可以为您进行参数选择(基于交叉验证和指定的搜索范围)。它还可以为 SVM 的准确性生成等高线图。这个工具可能很有帮助。

StackOverflow 上的以下问题及其相关问题也可能有所帮助: libsvm Shrinking Heuristics