ConvergenceWarning

来源:9-8 OvR与OvO

ITMOCC

2021-01-19

老师,您好。现在sklearn默认的solver是lbfgs,我对digits数据集进行LogisticRegression或者LogisticRegressionCV,发现都不收敛。将solver换成liblinear发现都收敛了。查阅了sklearn文档,文档说liblinear适合小型数据集。我就想是不是digits数据集规模小了,只适合用liblinear。可是那些人造的数据那规模不更小吗?用的也是sklearn默认的solver,也没见报这种警告啊。我又用iris数据集测试,发现默认solver情况下LogisticRegression收敛,而
LogisticRegressionCV却不收敛,这又是为什么?同样改成liblinear后就都收敛了。

写回答

1回答

liuyubobobo

2021-01-19

首先,一个算法适合小数据集,不代表所有小数据集都一定有效。只是统计意义上,这个算法在小数据集上,作用的效果更好。


以 iris 数据及为例,我测试了一下,现在默认的 LogisticRegression 确实不收敛。

//img1.sycdn.imooc.com/szimg/6006aea80978983521840510.jpg


解决不收敛的方式,通常有两种,其实课程中都提及过:


1)增加迭代次数。所谓不收敛,是在有限次迭代中没有收敛。LogisticRegression 默认的迭代次数 max_iter 是 100,我试了一下,max_iter 设置为 1000 就可以收敛。

//img1.sycdn.imooc.com/szimg/6006af1809863b3b11280216.jpg


2)另一个方式非常建议,就是对数据做标准化。在讲线性回归的时候介绍过,对于一些算法,标准化虽然在理论上不影响最终的结果,但是会让搜索更容易进行。

//img.mukewang.com/szimg/6006b04e09e9663410420310.jpg


继续加油!:)


0
4
liuyubobobo
回复
ITMOCC
C 是正则化的参数,和 svm 算法中的 C 意义相同,你可以先往后看,看到 svm 的 C 以后可能就理解了;LogisticRegressionCV 使用 KFold 的方式,针对每一个 fold 会找到一组参数,如果 refit = True,则会使用最佳的参数,对每一个 fold 再计算一遍结果,报告这个结果的平均值,否则没有这个在计算的过程(相当于就是用原本每个 fold 找到的参数)。
2021-01-19
共4条回复

Python3入门机器学习 经典算法与应用  

Python3+sklearn,兼顾原理、算法底层实现和框架使用。

5904 学习 · 2455 问题

查看课程