正在为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,我该怎么办?
5条答案
按热度按时间ecfdbz9o1#
通常情况下,当优化算法不收敛时,通常是因为问题的条件不好,可能是由于决策变量的尺度不好。您可以尝试以下几种方法。
1.规范化训练数据,以便问题有望得到更好的处理,从而加快收敛速度。一种可能性是使用Scikit-Learn's StandardScaler将数据缩放为0平均值,单位标准差。请注意,必须将训练数据上拟合的StandardScaler应用于测试数据。此外,如果具有离散要素,确保它们被适当地变换,以便缩放它们是有意义的。
1.与1)相关,请确保其他参数(如正则化权重
C
)设置正确。C
必须〉0。通常,您会尝试对数标度中C
的各种值(1e-5、1e-4、1e-3、...、1、10、100、...),然后在特定间隔内以更精细的粒度对其进行微调。如今,使用以下参数来微调参数可能更有意义,例如:使用Scikit-Optimize等包的贝叶斯优化。1.将
max_iter
设置为更大的值。默认值为1000。这应该是您最后的手段。如果优化过程在前1000次迭代中没有收敛,通过设置较大的max_iter
使其收敛通常掩盖了诸如1)和2)中所述的其它问题。它甚至可能表明你有一些合适的特性或者特性之间有很强的相关性。在采取这个简单的方法之前,先调试那些特性。1.如果特征数〉示例数,则设置
dual = True
,反之亦然。这使用对偶公式解决了SVM优化问题。感谢@Nino van Hooff指出这一点,并感谢@JamesKo指出我的错误。1.使用不同的解算器,例如,如果你使用逻辑回归,使用L-BFGS解算器。参见@5ervant的答案。
发出这一警告是因为
1.求解线性SVM只是求解二次优化问题。求解器通常是保持解的运行估计值(即SVM的权重和偏差)的迭代算法。当解对应于对此凸优化问题最优的目标值时,或者当它达到最大迭代次数集时,它停止运行。
1.如果算法不收敛,则不能保证SVM参数的当前估计是好的,因此预测也可能是完全无用的。
此外,考虑@Nino van Hooff和@5ervant关于使用SVM的对偶公式的评论。如果您拥有的特征数D大于训练样本数N,这一点尤其重要。这就是SVM的对偶公式特别设计的目的,有助于优化问题的条件化。@5ervant注意到并指出了这一点。
此外,@5ervant还指出了改变求解器的可能性,特别是L-BFGS求解器的使用。这要归功于他(即,支持他的答案,而不是我的)。
我想为那些感兴趣的人(我是:)提供一个快速粗略的解释,为什么这在这种情况下很重要。二阶方法,特别是近似二阶方法,如L-BFGS解算器,将有助于病态问题,因为它在每次迭代时近似Hessian,并使用它来缩放梯度方向。这使它能够获得更好的收敛 * 速率 *,但每次迭代的计算成本可能更高。也就是说,它需要更少的迭代来完成,但每次迭代将比典型的一阶方法(如梯度下降或其变体)慢。
例如,典型的一阶方法可能在每次迭代时更新解,如下所示
其中α(k)是迭代k处的步长,取决于算法或学习速率调度的特定选择。
二阶方法,例如牛顿法,将具有更新方程
也就是说,它使用Hessian中编码的局部曲率信息来相应地缩放梯度。如果问题是病态的,梯度将指向不理想的方向,逆Hessian缩放将有助于纠正这一点。
特别是,在@5ervant的答案中提到的L-BFGS是一种近似Hessian逆的方法,因为计算它可能是一个昂贵的操作。
然而,二阶方法可能比一阶方法收敛得更快(即需要更少的迭代),比如常见的基于梯度下降的求解器,正如你们所知,一阶方法有时甚至无法收敛,这可以补偿每次迭代所花费的时间。
总而言之,如果你有一个条件良好的问题,或者你可以通过其他方法使它条件良好,比如使用正则化和/或特征缩放和/或确保你的例子比特征多,你可能不必使用二阶方法。(例如,DL模型中的那些),二阶方法如L-BFGS方法在其中扮演了不同的角色,有证据表明,与一阶方法相比,它们有时可以找到更好的解决方案。
ycl3bljg2#
我达到了我设置的点,直到
LinearSVC
分类器上的max_iter=1200000
,但仍然存在 “ConvergenceWarning”。我通过设置dual=False
并将max_iter
保留为默认值来修复此问题。使用
LogisticRegression(solver='lbfgs')
分类器时,应增加max_iter
。使用大数据集特征训练时,在 “ConvergenceWarning” 消失之前,我的分类器已达到max_iter=7600
。ylamdve63#
显式指定
max_iter
可解决警告问题,因为默认max_iter
为100。[适用于Logistic回归]。eivnm1vs4#
请将max_iter增加到10000,因为默认值是1000。可能,增加迭代次数将有助于算法收敛。对我来说,它收敛了,求解器是-'lbfgs'
8gsdolmq5#
以下示例说明如何增加最大迭代次数并更改LogisticRegression对象中的求解器:
附加事项:
如果有人在传递GridSearchCV对象时遇到错误,请按照示例代码增加最大迭代次数并更改求解器,