簡體   English   中英

ConvergenceWarning: Liblinear收斂失敗,增加迭代次數

[英]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,我該怎么辦?

通常,當優化算法不收斂時,通常是因為問題條件不佳,可能是由於決策變量的縮放不當。 您可以嘗試一些方法。

  1. 規范化您的訓練數據,以便問題有望變得更好,從而可以加快收斂速度​​。 一種可能性是使用Scikit-Learn 的 StandardScaler示例將數據縮放到 0 均值、單位標准偏差。 請注意,您必須將在訓練數據上擬合的 StandardScaler 應用於測試數據。 此外,如果您有離散特征,請確保它們被正確轉換,以便縮放它們有意義。
  2. 與 1) 相關,確保其他參數(例如正則化權重C )設置適當。 C必須 > 0。通常,人們會在對數刻度(1e-5, 1e-4, 1e-3, ..., 1, 10, 100, ...)中嘗試各種C值,然后再對其進行微調特定間隔內的更細粒度。 如今,使用諸如Scikit-Optimize 之類的包進行貝葉斯優化來調整參數可能更有意義。
  3. max_iter設置為更大的值。 默認值為 1000。這應該是您的最后手段。 如果優化過程在前 1000 次迭代中沒有收斂,則通過設置更大的max_iter使其收斂通常會掩蓋其他問題,例如 1) 和 2) 中描述的問題。 它甚至可能表明您有一些適當的特征或特征中有很強的相關性。 在采取這種簡單的方法之前先調試那些。
  4. 如果特征數 > 示例數,則設置dual = True ,反之亦然。 這使用對偶公式解決了 SVM 優化問題。 感謝@Nino van Hooff指出這一點,感謝@JamesKo發現我的錯誤。
  5. 如果您使用的是 Logistic 回歸,請使用不同的求解器,例如 L-BFGS 求解器。 請參閱@5ervant的回答。

注意:不應忽略此警告。

這個警告是因為

  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) * 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM