我正在做多类/多标签文本分类。我试图摆脱"收敛警告"。
当我将max_iter从默认值调整为4000时,警告消失了。但是,我的模型精度从78降低到75。
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score
logreg = Pipeline([('vect', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', LogisticRegression(n_jobs=1, C=1e5, solver='lbfgs',multi_class='ovr' ,random_state=0, class_weight='balanced' )),
])
logreg.fit(X_train, y_train)
y_pred = logreg.predict(X_test)
print('Logistic Regression Accuracy %s' % accuracy_score(y_pred, y_test))
cv_score = cross_val_score(logreg, train_tfidf, y_train, cv=10, scoring='accuracy')
print("CV Score : Mean : %.7g | Std : %.7g | Min : %.7g | Max : %.7g" % (np.mean(cv_score),np.std(cv_score),np.min(cv_score),np.max(cv_score)))
为什么当max_iter=4000时,我的准确性会降低? 有没有其他方法可以解决* "ConvergenceWarning: lbfgs 未能收敛。增加迭代次数。"迭代次数",收敛警告)" *
它缺少问题中使用的数据,因此无法重现问题,而只能猜测。
要检查的一些事项:
1)许多估计器,如LogisticRegression
喜欢(不是说需要)缩放数据。 根据您的数据,您可能希望使用MaxAbsScaler
、MinMaxScaler
、StandardScaler
或RobustAScaler
进行扩展。最佳选择取决于您尝试解决的问题类型、稀疏性等数据属性、下游估计器是否欢迎负值等。 缩放数据通常会加快收敛速度,甚至可能不需要增加max_iter
。
2)根据我的经验,solver
"liblinear"
在给定相同的输入数据的情况下需要更多的max_iter
迭代来收敛。
3)我没有看到任何"max_iterset in your code snippet. It currently defaults to
100"(sklearn 0.22)。
4)我看到您将正则化参数设置为C=100000
. 它大大减少了正则化,因为 C 是正则化强度的倒数。 预计它会消耗更多的迭代,并可能导致模型过度拟合。
5)我没想到更高的max_iter
会让你的精度降低。 求解器是发散的,而不是收敛的。 数据可能未缩放或随机状态不固定或容差tol
(默认值 1e-4)变为高。
6) 检查交叉验证参数cross_val_score
cv
。 如果我没记错的话,默认行为不会设置导致可变平均精度的随机状态。
就我而言,我以小增量增加了max_iter
(首先从默认的 100 增加到 400,然后间隔为 400),直到我摆脱了警告。而且,有趣的是,它增加了模型性能参数(准确性,精度,召回率,F1分数)。直觉上这是有道理的,因为现在收敛发生了,你达到了最佳解决方案,而之前的情况你没有。