当前位置: 首页 > 面试题库 >

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

颛孙铭
2023-03-14
问题内容

运行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,该怎么办?


问题答案:

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

  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方法)在那里发挥了不同的作用,并且有证据表明,与一阶方法相比,有时它们可​​以找到更好的解决方案。订购方法。不过那是另一回事了。



 类似资料:
  • 2.8.1. 基本收敛 尽管是协方差矩阵的无偏估计, 最大似然估计不是协方差矩阵的特征值的一个很好的估计, 所以从反演得到的精度矩阵是不准确的。 有时,甚至出现数学原因,经验协方差矩阵不能反转。 为了避免这样的反演问题,引入了经验协方差矩阵的一种变换方式:shrinkage 。 在 scikit-learn 中,该变换(具有用户定义的收缩系数) 可以直接应用于使用 shrunk_covarianc

  • 在过去的两周里,我读了很多关于NN的文章,我想我在网上看到了几乎所有的“XOR”方法教程。但是,我无法使工作成为我自己的工作。我从一个简单的“OR”神经元方法开始。给出良好的结果。我认为我的问题是反向传播的实现。我做了一个对象方法,所以这里是主线。 三类: 神经元 前馈层(包含神经元) 前馈网络(包含前馈层) 所以我通过给网络赋予异或表xor表的历元来训练网络 网络将在千历元后输出约0.5…有趣的

  • 我一直在看一些关于深度学习/卷积神经网络的视频,比如这里和这里,我试图用C语言实现我自己的。在我第一次尝试时,我试图保持输入数据相当简单,所以我的想法是区分十字和圆,我有一个大约25个的小数据集(64*64个图像),它们如下所示: 网络本身有五层: 我的问题是我的网络没有收敛到任何东西上。权重似乎都没有改变。如果我运行它,预测基本保持不变,除了偶尔出现的异常值,它会在下一次迭代返回之前跳起来。 卷

  • 我实现了以下神经网络来解决Python中的异或问题。我的神经网络由2个神经元的输入层、1个2个神经元的隐藏层和1个神经元的输出层组成。我使用Sigmoid函数作为隐藏层的激活函数,使用线性(恒等式)函数作为输出层的激活函数: 反向传播似乎都是正确的;我想到的唯一问题是我在实现偏差单位时遇到的一些问题。无论哪种方式,每次运行代码时,每个输入的所有谓词都会收敛到大约0.5。我仔细检查了代码,似乎找不到

  • 我有一个奇怪的问题,我不知道是什么问题。 我有一个多模块java maven项目,其结构如下: 我在父pom(A)中添加了一个依赖项: 注:除 在模块C和D中,有必要使用版本2.3.0,因此我使用此依赖项重写父pom A的版本1.8.5: 我在模块C和D的pom中添加了这个依赖项。C也是D的依赖项。所以当我尝试构建项目时,我得到以下错误: 因此,maven认为模块C的quartz版本是1.8.5,

  • 我用JavaScript实现了一个非常简单的线性回归和梯度下降算法,但是在查阅了多个源代码并尝试了几件事情之后,我无法使它收敛。 数据是绝对线性的,只是数字0到30作为输入,x*3作为正确的输出来学习。 这就是梯度下降背后的逻辑: 我从不同的地方取了公式,包括: 乌达城深度学习基金会纳米学位的练习 吴恩达的线性回归梯度下降课程(也在这里) 斯坦福CS229讲义 我从卡内基梅隆大学找到的其他PDF幻