sklearn.linear_model.LogisticRegression()函数解析(最清晰的解释)

📅 2026/7/28 18:07:40
sklearn.linear_model.LogisticRegression()函数解析(最清晰的解释)
欢迎关注WX公众号【程序员管小亮】sklearn.linear_model.LogisticRegression()函数全称是Logistic回归aka logitMaxEnt分类器。classsklearn.linear_model.LogisticRegression(penaltyl2,dualFalse,tol0.0001,C1.0,fit_interceptTrue,intercept_scaling1,class_weightNone,random_stateNone,solverlbfgs,max_iter100,multi_classauto,verbose0,warm_startFalse,n_jobsNone,l1_ratioNone)参数penalty惩罚项str类型可选参数为l1和l2默认为l2。用于指定惩罚项中使用的规范。newton-cg、sag和lbfgs求解算法只支持L2规范。L1G规范假设的是模型的参数满足拉普拉斯分布L2假设的模型参数满足高斯分布所谓的范式就是加上对参数的约束使得模型更不会过拟合(overfit)但是如果要说是不是加了约束就会好这个没有人能回答只能说加约束的情况下理论上应该可以获得泛化能力更强的结果。dual对偶或原始方法bool类型默认为False。对偶方法只用在求解线性多核(liblinear)的L2惩罚项上。当样本数量样本特征的时候dual通常设置为False。tol停止求解的标准float类型默认为1e-4。就是求解到多少的时候停止认为已经求出最优解。c正则化系数λ的倒数float类型默认为1.0。必须是正浮点型数。像SVM一样越小的数值表示越强的正则化。fit_intercept是否存在截距或偏差bool类型默认为True。intercept_scaling仅在正则化项为”liblinear”且fit_intercept设置为True时有用。float类型默认为1。class_weight用于标示分类模型中各种类型的权重可以是一个字典或者balanced字符串默认为不输入也就是不考虑权重即为None。如果选择输入的话可以选择balanced让类库自己计算类型权重或者自己输入各个类型的权重。举个例子比如对于0,1的二元模型我们可以定义class_weight{0:0.9,1:0.1}这样类型0的权重为90%而类型1的权重为10%。如果class_weight选择balanced那么类库会根据训练样本量来计算权重。某种类型样本量越多则权重越低样本量越少则权重越高。当class_weight为balanced时类权重计算方法如下n_samples / (n_classes * np.bincount(y))。n_samples为样本数n_classes为类别数量np.bincount(y)会输出每个类的样本数例如y[1,0,0,1,1],则np.bincount(y)[2,3]。那么class_weight有什么作用呢 在分类模型中我们经常会遇到两类问题第一种是误分类的代价很高。比如对合法用户和非法用户进行分类将非法用户分类为合法用户的代价很高我们宁愿将合法用户分类为非法用户这时可以人工再甄别但是却不愿将非法用户分类为合法用户。这时我们可以适当提高非法用户的权重。第二种是样本是高度失衡的比如我们有合法用户和非法用户的二元样本数据10000条里面合法用户有9995条非法用户只有5条如果我们不考虑权重则我们可以将所有的测试集都预测为合法用户这样预测准确率理论上有99.95%但是却没有任何意义。这时我们可以选择balanced让类库自动提高非法用户样本的权重。提高了某种分类的权重相比不考虑权重会有更多的样本分类划分到高权重的类别从而可以解决上面两类问题。random_state随机数种子int类型可选参数默认为无仅在正则化优化算法为sag,liblinear时有用。solver优化算法选择参数只有五个可选参数即newton-cg,lbfgs,liblinear,sag,saga。默认为liblinear。solver参数决定了我们对逻辑回归损失函数的优化方法有四种算法可以选择分别是liblinear使用了开源的liblinear库实现内部使用了坐标轴下降法来迭代优化损失函数。lbfgs拟牛顿法的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。newton-cg也是牛顿法家族的一种利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。sag即随机平均梯度下降是梯度下降法的变种和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度适合于样本数据多的时候。saga线性收敛的随机优化算法的的变重。总结liblinear适用于小数据集而sag和saga适用于大数据集因为速度更快。对于多分类问题只有newton-cg,sag,saga和lbfgs能够处理多项损失而liblinear受限于一对剩余(OvR)。啥意思就是用liblinear的时候如果是多分类问题得先把一种类别作为一个类别剩余的所有类别作为另外一个类别。一次类推遍历所有类别进行分类。newton-cg,sag和lbfgs这三种优化算法时都需要损失函数的一阶或者二阶连续导数因此不能用于没有连续导数的L1正则化只能用于L2正则化。而liblinear和saga通吃L1正则化和L2正则化。同时sag每次仅仅使用了部分样本进行梯度迭代所以当样本量少的时候不要选择它而如果样本量非常大比如大于10万sag是第一选择。但是sag不能用于L1正则化所以当你有大量的样本又需要L1正则化的话就要自己做取舍了。要么通过对样本采样来降低样本量要么回到L2正则化。从上面的描述大家可能觉得既然newton-cg, lbfgs和sag这么多限制如果不是大样本我们选择liblinear不就行了嘛错因为liblinear也有自己的弱点我们知道逻辑回归有二元逻辑回归和多元逻辑回归。对于多元逻辑回归常见的有one-vs-rest(OvR)和many-vs-many(MvM)两种。而MvM一般比OvR分类相对准确一些。郁闷的是liblinear只支持OvR不支持MvM这样如果我们需要相对精确的多元逻辑回归时就不能选择liblinear了。也意味着如果我们需要相对精确的多元逻辑回归不能使用L1正则化了。max_iter算法收敛最大迭代次数int类型默认为10。仅在正则化优化算法为newton-cg, sag和lbfgs才有用算法收敛的最大迭代次数。multi_class分类方式选择参数str类型可选参数为ovr和multinomial默认为ovr。ovr即前面提到的one-vs-rest(OvR)而multinomial即前面提到的many-vs-many(MvM)。如果是二元逻辑回归ovr和multinomial并没有任何区别区别主要在多元逻辑回归上。OvR和MvM有什么不同OvR的思想很简单无论你是多少元逻辑回归都可以看做二元逻辑回归。具体做法是对于第K类的分类决策我们把所有第K类的样本作为正例除了第K类样本以外的所有样本都作为负例然后在上面做二元逻辑回归得到第K类的分类模型。其他类的分类模型获得以此类推。而MvM则相对复杂这里举MvM的特例one-vs-one(OvO)作讲解。如果模型有T类我们每次在所有的T类样本里面选择两类样本出来不妨记为T1类和T2类把所有的输出为T1和T2的样本放在一起把T1作为正例T2作为负例进行二元逻辑回归得到模型参数。我们一共需要T(T-1)/2次分类。可以看出OvR相对简单但分类效果相对略差这里指大多数样本分布情况某些样本分布下OvR可能更好。而MvM分类相对精确但是分类速度没有OvR快。如果选择了ovr则4种损失函数的优化方法liblinearnewton-cg,lbfgs和sag都可以选择。但是如果选择了multinomial,则只能选择newton-cg, lbfgs和sag了。verbose日志冗长度int类型。默认为0。就是不输出训练过程1的时候偶尔输出结果大于1对于每个子模型都输出。warm_start热启动参数bool类型。默认为False。如果为True则下一次训练是以追加树的形式进行重新使用上一次的调用作为初始化。n_jobs并行数。int类型默认为1。1的时候用CPU的一个内核运行程序2的时候用CPU的2个内核运行程序。为-1的时候用所有CPU的内核运行程序。还有其他参数例子fromsklearn.datasetsimportload_irisfromsklearn.linear_modelimportLogisticRegressionX,yload_iris(return_X_yTrue)clfLogisticRegression(random_state0).fit(X,y)clf.predict(X[:2,:])array([0,0])clf.predict_proba(X[:2,:])array([[9.8...e-01,1.8...e-02,1.4...e-08],[9.7...e-01,2.8...e-02,...e-08]])clf.score(X,y)0.97...Logistic 回归算法实现理论和代码在博客《机器学习实战》学习笔记五Logistic 回归