Python ConvergenceWarning:Liblinear无法收敛,请增加迭代次数

Python ConvergenceWarning:Liblinear无法收敛,请增加迭代次数,python,opencv,lbph-algorithm,Python,Opencv,Lbph Algorithm,为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

为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,我该怎么办?

通常,当优化算法不收敛时,这通常是因为问题的条件不好,可能是因为决策变量的伸缩性差。有几件事你可以试试

  • 规范化你的训练数据,这样问题就有希望变得更好 条件反射,这反过来又可以加快收敛速度。一个 可能的情况是,使用 举个例子。请注意,您必须将培训数据上安装的StandardScaler应用于测试数据
  • 与1相关),确保其他参数(如正则化) 适当设置了重量
    C
  • max_iter
    设置为更大的值。默认值为1000
  • 如果特征数量>示例数量,则设置
    dual=True
    ,反之亦然。这解决了使用对偶公式的SVM优化问题。谢谢你指出这一点,@JamesKo发现了我的错误
  • 如果使用逻辑回归,请使用不同的解算器,例如L-BFGS解算器。请看下面的答案
  • 注意:不应忽视此警告。

    这个警告是因为

  • 求解线性支持向量机就是求解一个二次优化问题。解算器通常是一种迭代算法,用于保持对解的运行估计(即SVM的权重和偏差)。 当解决方案对应于此凸优化问题的最优目标值时,或者当它达到最大迭代次数集时,它停止运行

  • 如果算法不收敛,那么当前对支持向量机参数的估计就不能保证是好的,因此预测也可以是完全的

  • 编辑

    此外,考虑评论和使用支持向量机的对偶公式。如果您拥有的特征数D大于训练示例数N,则这一点尤为重要。这是支持向量机对偶公式的特殊设计,有助于调节优化问题。感谢您注意到并指出了这一点

    此外,还指出了更改解算器的可能性,特别是L-BFGS解算器的使用。归功于他(即,对他的答案投赞成票,而不是我的)

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

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

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

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

    二阶方法,例如牛顿,将有一个更新方程

    x(k+1)=x(k)-α(k)*海森(x(k))^(-1)*梯度(f(x(k)))

    也就是说,它使用Hessian中编码的局部曲率信息来相应地缩放梯度。如果问题是病态的,梯度将指向不理想的方向,逆Hessian缩放将有助于纠正这一点

    特别是,在的答案中提到的L-BFGS是一种近似Hessian逆的方法,因为计算它可能是一个昂贵的操作

    然而,二阶方法的收敛速度可能比一阶方法快得多(也就是说,需要更少的迭代次数),比如通常的基于梯度下降的解算器,正如你们现在知道的,它有时甚至无法收敛。这可以补偿每次迭代花费的时间


    总之,如果您有一个条件良好的问题,或者如果您可以通过其他方式(如使用正则化和/或特征缩放)使其条件良好,和/或确保示例多于特征,则可能不必使用二阶方法。但是现在有许多模型优化非凸问题(例如,DL模型中的问题),二阶方法(如L-BFGS方法)在其中发挥着不同的作用,有证据表明它们有时可以找到比一阶方法更好的解决方案。但那是另一回事。

    我达到了我设定的点,在我的
    线性SVC
    分类器上设置的最大值为1200000,但“聚合警告”仍然存在。我只需设置
    dual=False
    并将
    max_iter
    保留为默认值,就可以解决这个问题


    使用
    LogisticRegression(solver='lbfgs')
    分类器,您应该增加
    max\u iter
    。在使用大型数据集的功能进行训练时,“聚合警告”消失之前,我的已达到
    max_iter=7600

    明确指定
    max_iter
    会将警告解析为默认的
    max_iter
    为100。[用于逻辑回归]

     logreg = LogisticRegression(max_iter=1000)
    

    请将最大值增加到10000,因为默认值为1000。增加迭代次数可能有助于算法收敛。对我来说,它收敛了,解算器是--“lbfgs”

    log_reg = LogisticRegression(solver='lbfgs',class_weight='balanced', max_iter=10000)
    

    我在本笔记本中看到了这个警告:注意,似乎所有用于训练和测试的变量都是标准化的,我没有设置任何分类器参数