ConvergenceWarning: lbfgs 未能收敛 (status=1): STOP: TOTAL NO. 达到限制的迭代次数

sum*_*s22 43 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))
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

有人可以向我解释这个警告是什么意思吗?我是机器学习的新手,所以对我可以做些什么来改进预测模型有点迷茫。正如您从 numeric_transformer 中看到的,我通过标准化对数据进行了缩放。我也很困惑模型得分是多么高,以及这是好事还是坏事。

Yah*_*hya 72

警告的意思是说,主要是:建议要尽量使求解(算法)收敛。


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

有限内存一词仅表示它存储一些隐式表示梯度近似的向量。

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


但什么是算法收敛

用简单的话来说。如果求解的误差在非常小的范围内(即几乎没有变化),那么这意味着算法达到了解决方案(不必是最佳解决方案,因为它可能会停留在所谓的“局部最优” ”)。

另一方面,如果误差变化显着即使误差相对较小 [例如在您的情况下得分很好],但每次迭代的误差之间的差异大于某些容差),那么我们说算法没有收敛。

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

LogisticRegression(... solver='lbfgs', max_iter=100 ...)
Run Code Online (Sandbox Code Playgroud)

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

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


更新:

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

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

  • 我将最大迭代次数增加到 400 LogisticRegression(solver='lbfgs', max_iter=400),这已经解决了警告。谢谢你的解释。 (7认同)
  • 回到这个问题,我可以尝试帮助算法收敛的其他方面有什么建议吗? (3认同)
  • 我将最大迭代次数增加到 1000 次以使其正常工作。 (2认同)

Ude*_*esh 14

要修复收敛警告,请将LogisticRegression中的max_iter指定为更高的值:

from sklearn.linear_model import LogisticRegression
model=LogisticRegression(max_iter=3000)
model.fit(X_train,y_train)
Run Code Online (Sandbox Code Playgroud)


小智 12

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

收敛警告:

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

增加迭代次数 (max_iter) 或缩放数据,如6.3所示。预处理数据

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

那么在这种情况下,您可以使用类似的算法

from sklearn.linear_model import LogisticRegression
log_model = LogisticRegression(solver='lbfgs', max_iter=1000)
Run Code Online (Sandbox Code Playgroud)

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

  • 这个答案在最近的[Stack Overflow博客文章](https://stackoverflow.blog/2021/04/19/how-often-do-people-actually-copy-and-paste-from-stack-overflow -now-we-know/),因此,今天很快就获得了一些支持。 (104认同)
  • 是的,但这仍然是一个糟糕的答案。“因为有时会因为迭代而发生。” 这是一个相当无意义的回应... (48认同)
  • 该博客文章似乎感到惊讶的是,这个答案比接受的答案更容易被应对 - 接受的答案中没有任何可复制的内容! (25认同)
  • 引用博客文章:*“最多复制的被否决的答案”* (20认同)
  • 我来到这里,因为[人们实际复制和粘贴的频率(2021-12-30)](https://stackoverflow.blog/2021/12/30/how-often-do-people-actually)中提到了它-从堆栈溢出现在我们知道/?cb = 1复制并粘贴) (14认同)
  • 我也来了,但现在它**有**赞成票! (5认同)
  • @jms 仍然,正如帖子所说,“这似乎是已接受答案的更简洁版本(...)它是“太长时间没有阅读”帖子的完美示例。” (4认同)
  • @GuilhermeGarnier 当然,接受的答案很冗长,但原始海报似乎相当天真,可能需要一些评论者所迎合的额外背景。 (2认同)
  • 这个答案在[StackOverflow博客2021-04-19](https://stackoverflow.blog/2021/04/19/how-often-do-people-actually-copy-and-paste-from-stack中再次提到-overflow-now-we-know)并且肯定会吸引更多关注:) (2认同)