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

mm5n2pyu  于 2023-01-26  发布在  其他
关注(0)|答案(5)|浏览(278)

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

ecfdbz9o

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,并使用它来缩放梯度方向。这使它能够获得更好的收敛 * 速率 *,但每次迭代的计算成本可能更高。也就是说,它需要更少的迭代来完成,但每次迭代将比典型的一阶方法(如梯度下降或其变体)慢。
例如,典型的一阶方法可能在每次迭代时更新解,如下所示

x(k + 1) = x(k) - alpha(k) * gradient(f(x(k)))

其中α(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方法在其中扮演了不同的角色,有证据表明,与一阶方法相比,它们有时可以找到更好的解决方案。

ycl3bljg

ycl3bljg2#

我达到了我设置的点,直到LinearSVC分类器上的max_iter=1200000,但仍然存在 “ConvergenceWarning”。我通过设置dual=False并将max_iter保留为默认值来修复此问题。
使用LogisticRegression(solver='lbfgs')分类器时,应增加max_iter。使用大数据集特征训练时,在 “ConvergenceWarning” 消失之前,我的分类器已达到max_iter=7600

ylamdve6

ylamdve63#

显式指定max_iter可解决警告问题,因为默认max_iter为100。[适用于Logistic回归]。

logreg = LogisticRegression(max_iter=1000)
eivnm1vs

eivnm1vs4#

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

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

8gsdolmq5#

以下示例说明如何增加最大迭代次数并更改LogisticRegression对象中的求解器:

from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler

# Scale the data
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# Create the LogisticRegression object and set the solver and maximum number of iterations
logreg = LogisticRegression(solver='lbfgs', max_iter=10000)

# Fit the model to the data
logreg.fit(X_scaled, y)

附加事项:
如果有人在传递GridSearchCV对象时遇到错误,请按照示例代码增加最大迭代次数并更改求解器,

from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import GridSearchCV

lr = LogisticRegression(solver='lbfgs',max_iter=10000)
parameters = {
    'C': [0.001,0.01,0.1,1,10,100,1000],
}

cv = GridSearchCV(lr, parameters, cv=5)
cv.fit(tr_features, tr_labels.values.ravel())

相关问题