Python:逻辑回归 max_iter 参数正在降低准确性

问题描述 投票:0回答:2

我正在做多类/多标签文本分类。我试图摆脱“ConvergenceWarning”。

当我将 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 未能收敛。增加迭代次数。“迭代次数。”,ConvergenceWarning)”*

python logistic-regression cross-validation multiclass-classification
2个回答
7
投票

它缺少问题中使用的数据,因此无法重现问题,只能猜测。

需要检查的一些事项:

  1. 许多估算器(例如

    LogisticRegression
    )喜欢(并不是说需要)缩放数据。根据您的数据,您可能需要使用
    MaxAbsScaler
    MinMaxScaler
    StandardScaler
    RobustAScaler
    进行缩放。最佳选择取决于您要解决的问题类型、稀疏性等数据属性、下游估计器是否欢迎负值等。缩放数据通常会加速收敛,甚至可能不需要增加
    max_iter

  2. 根据我的经验,给定相同的输入数据,

    solver
    而不是
    "liblinear"
    需要更多的
    max_iter
    迭代才能收敛。

  3. 我没有在您的代码片段中看到任何

    max_iter
    设置。目前默认为
    100
    (sklearn 0.22)。

  4. 我看到你设置了正则化参数

    C=100000
    。它大大减少了正则化,因为 C 是正则化强度的倒数。预计会消耗更多迭代次数,并可能导致模型过度拟合。

  5. 我没想到更高的

    max_iter
    会让你的准确率更低。求解器是发散而不是收敛。数据可能未缩放或随机状态未固定或容差
    tol
    (默认1e-4)变得很高。

  6. 检查您

    cross_val_score
    交叉验证参数
    cv
    。如果我没记错的话,默认行为不会设置随机状态,从而导致可变的平均精度。


0
投票

就我而言,我将

max_iter
小幅增加(首先从默认的 100 增加到 400,然后间隔 400),直到消除警告。而且,有趣的是,它增加了模型性能参数(准确度、精确度、召回率、F1 分数)。直观上来说,这是有道理的,因为现在发生了收敛并且您达到了最佳解决方案,而在之前的情况下则没有。

© www.soinside.com 2019 - 2024. All rights reserved.