gpt4 book ai didi

python - ConvergenceWarning : Liblinear failed to converge, 增加迭代次数

转载 作者:太空狗 更新时间:2023-10-29 19:36:20 30 4
gpt4 key购买 nike

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

最佳答案

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

  • 标准化您的训练数据,以便问题有望变得更好
    有条件的,这反过来又可以加速收敛。一
    可能性是使用
    Scikit-Learn'sStandardScaler
    举个例子。请注意,您必须将在训练数据上拟合的 StandardScaler 应用于测试数据。此外,如果您有离散特征,请确保它们被正确转换,以便缩放它们有意义。
  • 与 1) 相关,确保其他参数如正则化
    重量,C , 适当设置。 C必须 > 0。通常人们会尝试各种值 C在对数尺度(1e-5, 1e-4, 1e-3, ..., 1, 10, 100, ...)中,然后在特定间隔内以更细的粒度对其进行微调。现在,使用诸如 Scikit-Optimize 之类的包来调整参数可能更有意义,例如贝叶斯优化。 .
  • 套装max_iter到更大的值。默认值为 1000。这应该是您的最后手段。如果优化过程在前 1000 次迭代内没有收敛,则通过设置更大的 max_iter 使其收敛。通常会掩盖其他问题,例如 1) 和 2) 中描述的问题。它甚至可能表明您有一些适当的特征或特征中有很强的相关性。在采取这种简单的方法之前先调试那些。
  • 套装dual = True如果特征数量> 示例数量,反之亦然。这使用对偶公式解决了 SVM 优化问题。感谢 @Nino van Hooff指出这一点,以及@JamesKo 发现我的错误。
  • 如果您使用的是 Logistic 回归,请使用不同的求解器,例如 L-BFGS 求解器。见 @5ervant的回答。

  • 注意:不应忽略此警告。
    这个警告是因为
  • 求解线性 SVM 只是求解二次优化问题。求解器通常是一种迭代算法,它保持对解的运行估计(即 SVM 的权重和偏差)。
    当解对应于该凸优化问题的最佳目标值时,或者当它达到最大迭代次数集时,它就会停止运行。
  • 如果算法不收敛,则不能保证 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) * Hessian(x(k))^(-1) * gradient(f(x(k)))
    也就是说,它使用 Hessian 中编码的局部曲率信息来相应地缩放梯度。如果问题是病态的,梯度将指向不太理想的方向,而反向 Hessian 缩放将有助于纠正这一点。
    特别是 @5ervant中提到的L-BFGS的答案是一种近似 Hessian 逆的方法,因为计算它可能是一项昂贵的操作。
    然而,二阶方法的收敛速度可能比一阶方法快得多(即需要更少的迭代),比如通常的基于梯度下降的求解器,正如你们现在所知,有时甚至无法收敛。这可以补偿每次迭代所花费的时间。
    总而言之,如果您有一个条件良好的问题,或者如果您可以通过其他方式(例如使用正则化和/或特征缩放和/或确保示例多于特征)使其条件良好,您可能不会必须使用二阶方法。但是如今,随着许多模型优化非凸问题(例如,DL 模型中的模型),L-BFGS 方法等二阶方法在那里发挥了不同的作用,并且有证据表明,与一阶方法相比,它们有时可以找到更好的解决方案订购方法。不过那是另一回事了。

    关于python - ConvergenceWarning : Liblinear failed to converge, 增加迭代次数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52670012/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com