ConvergenceWarning:lbfgs 未能收敛(状态 = 1):停止:总数迭代次数达到限制

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

我有一个由数字和分类数据组成的数据集,我想根据患者的医疗特征预测患者的不良结果。我为我的数据集定义了一个预测管道,如下所示:

X = dataset.drop(columns=['target'])
y = dataset['target']

# define categorical and numeric transformers
numeric_transformer = Pipeline(steps=[
    ('knnImputer', KNNImputer(n_neighbors=2, weights="uniform")),
    ('scaler', StandardScaler())])

categorical_transformer = Pipeline(steps=[
    ('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
    ('onehot', OneHotEncoder(handle_unknown='ignore'))])

#  dispatch object columns to the categorical_transformer and remaining columns to numerical_transformer
preprocessor = ColumnTransformer(transformers=[
    ('num', numeric_transformer, selector(dtype_exclude="object")),
    ('cat', categorical_transformer, selector(dtype_include="object"))
])

# Append classifier to preprocessing pipeline.
# Now we have a full prediction pipeline.
clf = Pipeline(steps=[('preprocessor', preprocessor),
                      ('classifier', LogisticRegression())])

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

clf.fit(X_train, y_train)
print("model score: %.3f" % clf.score(X_test, y_test))

但是,运行此代码时,我收到以下警告消息:

ConvergenceWarning: lbfgs failed to converge (status=1):
STOP: TOTAL NO. of ITERATIONS REACHED LIMIT.
Increase the number of iterations (max_iter) or scale the data as shown in:
    https://scikit-learn.org/stable/modules/preprocessing.html
Please also refer to the documentation for alternative solver options:
    https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression
  extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)

    model score: 0.988

有人可以向我解释这个警告的含义吗?我是机器学习的新手,所以对于如何改进预测模型有点迷失。正如您从 numeric_transformer 中看到的,我通过标准化缩放了数据。我也很困惑,模型得分为何如此之高,这是好事还是坏事。

python machine-learning scikit-learn logistic-regression
5个回答
191
投票

警告的主要含义是:尝试使求解器(算法)收敛的建议。


lbfgs
代表:“有限内存 Broyden–Fletcher–Goldfarb–Shanno 算法”。它是 Scikit-Learn 库提供的求解器算法之一。

术语有限内存仅仅意味着它存储仅一些隐式表示梯度近似的向量。

它在相对较小的数据集上具有更好的收敛性


但是什么是

算法收敛

简单来说。如果求解误差在很小的范围内(即几乎没有变化),那么这意味着算法达到了解决方案(

不一定是最佳解决方案,因为它可能会陷入所谓的“局部解决方案”)最佳”)。

另一方面,如果错误

变化显着即使错误相对较小[就像在你的情况下得分很好],但每次迭代的错误之间的差异大于某个容差)那么我们说算法没有收敛。

现在,您需要知道 Scikit-Learn API 有时会为用户提供选项来指定算法在以迭代方式搜索解决方案时应进行的最大迭代次数:

LogisticRegression(... solver='lbfgs', max_iter=100 ...)
如您所见,LogisticRegression 中的默认求解器是“lbfgs”,默认最大迭代次数为 100。

最后,请注意,增加最大迭代次数并不一定能保证收敛,但它肯定有帮助!


更新:

根据您下面的评论,尝试(众多)可能有助于算法收敛的一些技巧是:

    增加
  • 迭代次数:如本答案所示;
  • 尝试不同的优化器
  • :看这里 扩展您的数据:查看
  • 此处
  • 添加工程功能:看
  • 这里
  • 数据预处理:看
  • 这里 - 用例
  • 这里 添加更多数据:查看
  • 此处

55
投票

收敛警告:

lbfgs 未能收敛(状态=1):

停止: 总数迭代次数达到限制。


增加迭代次数 (max_iter) 或缩放数据,如

6.3 所示。数据预处理 另请参阅文档以了解替代求解器选项:

LogisticRegression() 那么在这种情况下,你可以使用类似的算法

from sklearn.linear_model import LogisticRegression log_model = LogisticRegression(solver='lbfgs', max_iter=1000)

因为有时会因为迭代而发生。


14
投票
收敛警告

LogisticRegression中的max_iter指定为更高的值: from sklearn.linear_model import LogisticRegression model=LogisticRegression(max_iter=3000) model.fit(X_train,y_train)



3
投票

from sklearn.linear_model import LogisticRegression logReg = LogisticRegression(solver='lbfgs', max_iter=3000)



0
投票

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