我在使用 libsvm 的 C-SVC 模式,并使用二次多项式核函数,需要训练多个 SVM。在训练过程中,我发现有些 SVM 会出现以下一个或两个警告:
WARNING: using -h 0 may be faster*WARNING: reaching max number of iterationsoptimization finished, #iter = 10000000
我找到了 h
参数的描述:
-h shrinking : whether to use the shrinking heuristics, 0 or 1 (default 1)
我尝试阅读了 libsvm 文档中的解释,但对我来说有点太高深了。能否请有人用通俗的语言解释一下,并提供一些建议,比如设置这个参数可能会有益,因为…?另外,如果我为所有训练的 SVM 都设置这个参数,是否会对那些没有明确发出此警告的 SVM 的准确性产生负面影响,这一点也希望能知道。
我对另一个警告不太理解。
为了提供更多细节:我的训练集有 10 个属性(特征),包含 5000 个向量。
更新:
如果其他人也遇到了“达到最大迭代次数”的问题,这似乎是由数值稳定性问题引起的。此外,这会导致训练时间非常慢。多项式核函数确实可以从使用交叉验证技术中受益,以确定正则化参数(C 参数)的最佳值,对于多项式核函数来说,我发现将其保持在 8 以下是有帮助的。此外,如果核函数是非均匀的 \sum(\gamma x_i s_i + coef0)^d(抱歉,SO 不支持 LaTeX),其中 coef0 != 0,那么可以使用网格搜索技术对 gamma 和 C 进行交叉验证,因为在这种情况下,gamma 的默认值(1 / 特征数)可能不是最佳选择。尽管如此,从我的实验来看,你可能不希望 gamma 值太大,因为这会导致数值问题(我尝试的最大值为 8)。
关于 gamma 和 C 的可能值的进一步启发,可以尝试查看 grid.py。
回答:
收缩启发式是为了加速优化。正如 FAQ 中所说,它们有时有帮助,有时没有。我认为这更多是运行时间的问题,而不是收敛的问题。
然而,优化达到最大迭代次数这一事实很有趣。你可能需要调整容忍度(成本参数),或者查看导致此问题的具体问题。数据集是否很大?