libsvm 缩小启发式算法

18

我正在使用带有二次多项式核函数的libsvm进行C-SVC模式训练,并且需要训练多个SVM。在训练过程中,对于我训练的某些SVM,我会收到下列警告中的一个或两个:

WARNING: using -h 0 may be faster
*
WARNING: reaching max number of iterations
optimization 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中进行探索。

请解释如何得出Gamma等于1除以特征数和Gamma上限为8的方法。谢谢。 - Cloud Cho
@CloudCho 那时已经过去了好几年,我记不清确切的数值了,但我相信我从默认值开始(1/num_features - 参见这里),然后逐渐增加,直到出现最大迭代次数警告。如果你想获得一些良好的gamma和C的起始值,你需要跟踪这些值是如何被转换的,直到它们被输入到svmtrain中。 - Mihai Todor
@CloudCho 另外,重要的是在尝试训练模型之前对训练数据进行缩放,否则您将遇到数值问题,导致模型表现不佳。libsvm提供了一个名为svm-scale的工具来实现此目的。请参见此处 - Mihai Todor
1个回答

12

缩小启发式算法旨在加速优化过程。正如常见问题解答中所述,它们有时会起到帮助作用,有时则不会。我认为这取决于运行时而非收敛。

然而,优化达到最大迭代次数的事实很有趣。您可能需要调整公差(成本参数),或者查看导致此问题的单个问题。数据集很大吗?


关于最大迭代次数,我的数据集每个有5000个项目。训练时间少于一分钟。成本参数是什么?它是正则化吗?现在我只将其设置为1,这是libsvm中的默认值... - Mihai Todor
1
@MihaiTodor,我认为这对SVM来说不应该是个问题,除非你有许多标签不同但特征向量完全相同的点。在LIBSVM中,成本参数为“-c”,它定义了您惩罚分类错误的程度。如果太高,并且数据集在您的核空间中不是线性可分的,则可能会引起麻烦。 - Qnan
是的,这就是我所拥有的,现在我看到了迭代警告,并将c设置为1(默认值)。我计划通过交叉验证和网格搜索来调整cgamma以获得更好的准确性,但当我收到此警告时应该怎么做? - Mihai Todor
1
为什么不呢?你不必为测试数据调整缩放,只需重新应用从训练数据中确定的给定缩放即可。http://www.csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f407 LIBSVM期望缩放后的数据,至少大致在[-1;1]区间内,并且它似乎可以解决您上面发布的测试数据问题。 - Qnan
@Qnan,对于软间隔支持向量机来说,无论数据是否可分,较高的C值都不会引起问题。训练时间可能会更长,但是优化问题对于任何正有限的C值始终是可行的。 - Marc Claesen
显示剩余9条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接