运行sklearn LogisticRegression出现lbfgs收敛失败的ConvergenceWarning如何解决
ConvergenceWarning警告的入门适配方案
这个警告是新版scikit-learn默认参数和原书写作时使用的旧版本参数不匹配导致的,不是代码逻辑错误,初学阶段可以按照下面的方法处理,不需要提前学习超出当前进度的复杂知识:
- 最贴合原书学习节奏的修改方式:给
LogisticRegression补充最大迭代次数参数,把原代码中实例化模型的行替换为:
logreg = LogisticRegression(max_iter=1000).fit(X_train, y_train)
触发警告的核心原因是:新版sklearn中LogisticRegression默认使用lbfgs作为求解器,默认的最大迭代次数仅为100,针对乳腺癌数据集的特征计算复杂度,100次迭代达不到求解器的收敛阈值,把最大迭代次数提高到1000即可让模型正常完成收敛,警告会直接消失,最终计算得到的训练集、测试集准确率和原书给出的参考值完全一致,不会打乱原书的学习节奏。
- 可选优化方向(对应教材后续章节的知识点,初学阶段可暂时跳过):乳腺癌数据集的不同特征数值尺度差异较大(部分特征取值范围在0-1,部分特征取值范围在0-1000以上),lbfgs求解器对特征尺度敏感度较高,先对特征做标准化预处理可以加快收敛速度,甚至不需要把迭代次数调到很高就能达到收敛要求。
- 不推荐初学阶段使用的处理方式:直接全局屏蔽所有警告。如果只是临时不想看到警告弹窗,可以通过代码逻辑过滤警告,但这种方式只是把提示信息隐藏了,没有从参数层面解决收敛不充分的问题,很容易让你错过参数适配的核心细节。
提示:只要你运行代码得到的训练集、测试集得分和原书给出的参考值偏差在0.01以内,就算暂时没处理警告,模型本身的计算结果也是完全可用的,不需要因为弹出警告就怀疑自己的代码写错了。
内容的提问来源于stack exchange,提问作者MaxRussell
相关产品推荐
相关产品推荐

