收敛警告:Liblinear无法收敛,增加了迭代次数

问题描述

通常,当优化算法无法收敛时,通常是因为问题条件不佳,可能是由于决策变量的缩放比例不佳。您可以尝试一些方法

  1. 标准化您的训练数据,以使问题有望得到更好解决,从而可以加快收敛速度​​。一种可能是使用Scikit-Learn的StandardScaler将数据缩放为0均值,单位标准差 。请注意,您必须将训练数据上安装的StandardScaler应用于测试数据。
  2. 与1)相关,请确保其他参数(例如正则化权重C)设置正确。
  3. 设置max_iter更大的值。认值为1000。
  4. 设置dual = True特征数量>示例数量,反之亦然。这使用对偶公式解决了SVM优化问题。感谢@Nino van Hooff指出这一点,并感谢@JamesKo发现我的错误
  5. 如果使用的是Logistic回归,请使用其他求解器,例如L-BFGS求解器。

出现此警告是因为

  1. 解决线性SVM只是解决二次优化问题。求解器通常是一种迭代算法,可保持对解决方案的运行估算(即,SVM的权重和偏差)。当解决方案对应于对此凸优化问题最佳的目标值时,或者达到最大设置的迭代次数时,它将停止运行。

  2. 如果算法不收敛,则不能保证SVM参数的当前估计是好的,因此预测也可能是完全的垃圾

另外,请考虑@Nino van Hooff和@5ervant的评论,以使用SVM的双重形式。如果您拥有的功能数D大于训练示例N,那么这一点尤其重要。这是SVM的双重表示法专门设计用于解决优化问题的条件。感谢@ 5ervant]用于察觉并指出了这一点。

此外,@5ervant还指出了更改求解器的可能性,尤其是使用L- BFGS求解器的可能性。归功于他(即支持他的回答,而不是我的)。

对于那些对此感兴趣的人(我是:),我想提供一个简短的粗略解释。二阶方法,特别是近似二阶方法(如L- BFGS求解器)将有助于解决病态问题,因为它在每次迭代时都近似于Hessian,并使用它来缩放梯度方向。这使它可以获得更好的收敛 速度, 但可能会增加每次迭代的计算成本。也就是说,完成迭代所需的次数较少,但是每次迭代都比典型的一阶方法(如梯度下降法或其变体)要慢。

例如,典型的一阶方法可能会在每次迭代时更新解决方案,例如

x(k + 1)= x(k)-alpha(k)*梯度(f(x(k)))

其中alpha(k),即迭代k的步长,取决于算法或学习率计划的特定选择。

例如牛顿的二阶方法将具有更新方程

x(k + 1)= x(k)-alpha(k)粗麻布(x(k))^(-1)梯度(f(x(k)))

也就是说,它使用以Hessian编码的局部曲率信息来相应地缩放梯度。如果问题不佳,则渐变将指向不理想的方向,而反黑森州缩放比例将有助于纠正此问题。

特别地,@ 5ervant)的答案中提到的L- BFGS是一种近似于黑森州的逆的方法,因为计算它可能是一项昂贵的操作。

但是,二阶方法的收敛速度可能比一阶方法(例如,通常基于梯度下降的求解器)要快得多(即,所需迭代次数更少),正如您现在所知道的那样,它们有时甚至无法收敛。这样可以补偿每次迭代花费的时间。

总而言之,如果您遇到了状况良好的问题,或者可以通过其他方法(例如使用正则化和/或特征缩放和/或确保示例数量多于特征)使其状况良好,则可能不会必须使用二阶方法。但是如今,随着许多模型优化了非凸问题(例如DL模型中的模型),二阶方法(例如L- BFGS方法)在那里发挥了不同的作用,并且有证据表明,与一阶方法相比,有时它们可​​以找到更好的解决方案。订购方法。不过那是另一回事了。

解决方法

运行Adrian的线性二进制模式代码。该程序运行,但发出以下警告:

C:\Python27\lib\site-packages\sklearn\svm\base.py:922: ConvergenceWarning: Liblinear failed to converge,increase the number of iterations.
 "the number of iterations.",ConvergenceWarning

我正在使用opencv3.7运行python2.7,该怎么办?