[英]ConvergenceWarning: lbfgs failed to converge (status=1)
[英]ConvergenceWarning: Liblinear failed to converge, increase the number of iterations
為 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,我該怎么辦?
通常,當優化算法不收斂時,通常是因為問題條件不佳,可能是由於決策變量的縮放不當。 您可以嘗試一些方法。
C
)設置適當。 C
必須 > 0。通常,人們會在對數刻度(1e-5, 1e-4, 1e-3, ..., 1, 10, 100, ...)中嘗試各種C
值,然后再對其進行微調特定間隔內的更細粒度。 如今,使用諸如Scikit-Optimize 之類的包進行貝葉斯優化來調整參數可能更有意義。max_iter
設置為更大的值。 默認值為 1000。這應該是您的最后手段。 如果優化過程在前 1000 次迭代中沒有收斂,則通過設置更大的max_iter
使其收斂通常會掩蓋其他問題,例如 1) 和 2) 中描述的問題。 它甚至可能表明您有一些適當的特征或特征中有很強的相關性。 在采取這種簡單的方法之前先調試那些。dual = True
,反之亦然。 這使用對偶公式解決了 SVM 優化問題。 感謝@Nino van Hooff指出這一點,感謝@JamesKo發現我的錯誤。注意:不應忽略此警告。
這個警告是因為
求解線性 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 方法等二階方法在那里扮演着不同的角色,並且有證據表明,與一階方法相比,它們有時可以找到更好的解決方案訂購方法。 不過那是另一回事了。
我達到了我設置的點,在我的LinearSVC
分類器上達到max_iter=1200000
,但仍然存在“ConvergenceWarning” 。 我通過設置dual=False
並將max_iter
為默認值來解決這個問題。
使用LogisticRegression(solver='lbfgs')
分類器,您應該增加max_iter
。 在使用大型數據集的特征進行訓練時,在“ConvergenceWarning”消失之前,我的已達到max_iter=7600
。
顯式指定max_iter
可解決警告,因為默認max_iter
為 100。[對於邏輯回歸]。
logreg = LogisticRegression(max_iter=1000)
請將 max_iter 增加到 10000,因為默認值是 1000。可能,增加 no。 迭代次數將有助於算法收斂。 對我來說它收斂了,求解器是 -'lbfgs'
log_reg = LogisticRegression(solver='lbfgs',class_weight='balanced', max_iter=10000)
以下是如何增加最大迭代次數和更改 LogisticRegression object 中求解器的示例:
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 object 以下示例代碼時出現錯誤,請增加最大迭代次數並更改求解器,
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())
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.