收敛警告:lbfgs收敛失败(状态= 1):停止:总计。已达到ITERATIONS个上限

时间:2020-06-30 13:08:20

标签: python machine-learning scikit-learn logistic-regression

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


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

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

收敛警告:lbfgs收敛失败(状态= 1): 停止:总计已达到ITERATIONS个上限。 增加迭代次数(max_iter)或缩放数据,如下所示: https://scikit-learn.org/stable/modules/preprocessing.html 另请参阅文档以了解其他求解器选项: https://scikit-learn.org/stable/modules/linear_model.html#logistic-regression extra_warning_msg = _LOGISTIC_SOLVER_CONVERGENCE_MSG)

model score: 0.988

有人可以向我解释此警告的含义吗?我是机器学习的新手,因此我对改进预测模型所能做的工作有些困惑。正如您从numeric_transformer中看到的那样,我通过标准化对数据进行了缩放。我还对模型得分如何很高感到困惑,无论这是好事还是坏事。

谢谢!

2 个答案:

答案 0 :(得分:10)

警告的意思是它的主要含义:试图使规划求解(算法)收敛的建议。


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

术语“有限内存”仅表示它仅存储几个向量,这些向量隐式表示梯度近似值。

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


但是什么是算法收敛?

简单来说。如果求解误差在很小的范围内(即几乎没有变化),则表示算法已达到求解(不一定是最佳解决方案,因为它可能会卡在所谓的“本地最优” )。另一方面,如果错误是 明显变化 ,即使错误相对较小[如您的情况,得分很好],但差异每次迭代之间的误差大于某个容差),那么我们说该算法没有收敛。

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

LogisticRegression(... solver='lbfgs', max_iter=100 ...)

如您所见,LogisticRegression中的默认求解器为'lbfgs',默认最大迭代次数为100。

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


更新:

根据下面的评论,尝试一些可能有助于算法收敛的提示(很多):

  • 增加迭代次数:如本答案所述;
  • 尝试使用其他优化程序:外观Here;
  • 扩展数据:查看Here;
  • 添加工程功能:外观Here;
  • 数据预处理:外观Here - UseCaseHere;
  • 添加更多数据:查看Here

答案 1 :(得分:9)

如果您在任何机器学习算法中遇到以下错误,

<块引用>

收敛警告:

lbfgs 未能收敛(状态=1):
停止:总共没有。达到限制的迭代次数。

增加迭代次数 (max_iter) 或缩放数据,如6.3. Preprocessing data

另请参阅文档以了解替代求解器选项:LogisticRegression()

那么在这种情况下,您可以使用像

这样的算法
from sklearn.linear_model import LogisticRegression
log_model = LogisticRegression(solver='lbfgs', max_iter=1000)

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