逻辑回归全面解析
创始人
2025-05-28 02:48:55
0

在 scikit-learn 中,逻辑回归的类主要是 LogisticRegression 和 LogisticRegressionCV。两者主要区别是 LogisticRegressionCV 使用了交叉验证来选择正则化系数 C;而 LogisticRegression 需要自己每次指定一个正则化系数。

除了交叉验证,以及选择正则化系数 C 以外,两者的使用方法基本相同。

参数
sklearn 的 lr 主要的参数设置在 LogisticRegression 构造函数和 fit 拟合函数。

solver
solver 是 LogisticRegression 构造函数的参数,用它来指定逻辑回归损失函数的优化方法,可选项如下:

newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵,即海森矩阵来迭代优化损失函数。
lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵,即海森矩阵来迭代优化损失函数。
liblinear:使用了开源的 liblinear 库实现,内部使用了坐标轴下降法来迭代优化损失函数。
sag:即随机平均梯度下降(stochastic average gradient descent),是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候。该优化算法是 2013 年,Mark Schmidt、Nicolas Le Roux 和 Francis Bach 三人在法国国家信息与自动化研究所(INRIA)技术报中发表的论文《Minimizing finite sums with the stochastic average gradient》。
saga:优化的,无偏估计的 sag 方法,它是 2014 年由 Aaron Defazio、Francis Bach 和 Simon Lacoste-Julien 发表的论文《SAGA: A Fast Incremental Gradient Method With Support for Non-Strongly Convex Composite Objectives》。
对于少量的样本数据,‘liblinear’ 是很好的选择,而 ‘sag’ 和 ‘saga’ 对大量样本训练速度更快。
对于多分类问题,只有 ‘newton-cg’、‘sag’、‘saga’ 和 ‘lbfgs’ 能够处理多项损失,而 ‘liblinear’ 面对多分类问题,得先把一种类别作为一个类别,剩余的所有类别作为另外一个类别。依次类推,遍历所有类别,进行分类。

‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 支持正则(penalty)参数 l2 和 none。

‘liblinear’ 和 ‘saga’ 支持正则(penalty)参数 l1。

从 0.22 版本开始 solver 的默认值从 ‘liblinear’ 改为 ‘lbfgs’。

penalty
penalty 是 LogisticRegression 构造函数的参数,它是正则惩罚参数,可选项如下:

l1:‘liblinear’ 和 ‘saga’ 支持 l1。
l2:‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 支持 l2。
elasticnet:‘saga’ 支持 elasticnet。
none:‘newton-cg’, ‘lbfgs’, ‘sag’ 和 ‘saga’ 支持正则参数设定 none。
默认值为 l2。

        newton-cg、lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化,而liblinear通吃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正则化了。

dual
dual 是 LogisticRegression 构造函数的参数,是否选择对偶,是一个布尔类型,默认为 False;dual 只适用于正则化项为 l2 的 ‘liblinear’ 的情况,通常样本数大于特征数的情况下。

tol
tol 是 LogisticRegression 构造函数的参数,表示停止迭代求解的阈值。

该参数是浮点类型(float),默认为 1e-4,即 0.0001。
C
C 是 LogisticRegression 构造函数的参数,正则化系数的倒数,必须为正的浮点数,默认为 1.0,这个值越小,说明正则化效果越强。换句话说,这个值越小,越训练的模型更泛化,但也更容易欠拟合。

fit_intercept
fit_intercept 是 LogisticRegression 构造函数的参数,表示是否在拟合样本时保留截距,布尔类型,默认为 True。

intercept_scaling
intercept_scaling 是 LogisticRegression 构造函数的参数,它是给特征向量添加的一个常量,比如原本的向量是 [x],那么添加后就变成 [x, intercept_scaling];这个参数仅在 solver 参数为 liblinear,fit_intercept 参数为 True 的时候生效。该参数是浮点类型(float),默认值为 1.0。

class_weight
class_weight 是 LogisticRegression 构造函数的参数,顾名思义它指定分类的权重。参数支持的类型有字典(dict)或字符串值 ‘balanced’,默认值为 None。
如果不指定该参数,即 None,表示不对样本做任何处理,也就是对所有样本都有相同的权重。
class_weight 为 balanced 时,样本权重会根据分类样本比例进行自适应,具体权重公式为 n_samples / (n_classes * np.bincount(y)),其中 bincount 函数是对各个 label 的样本个数计数。

random_state
random_state 是 LogisticRegression 构造函数的参数,设置随机数种子。

参数支持的类型有 int 或 RandomState 实例对象,默认值为 None。
该参数只有当 solver 为 sag、saga 或 liblinear 时生效。当设置固定的随机种子时,才会可以每次训练得到相同的结果(可以复现),否则,随机梯度下降优化算法每次训练结果都会有所不同。

max_iter
max_iter 是 LogisticRegression 构造函数的参数,设置最大的迭代次数。

该参数类型为 int,默认为 100。

multi_class
multi_class 是 LogisticRegression 构造函数的参数,该参数决定分类方式的选择。

参数可选项为 {‘auto’, ‘ovr’, ‘multinomial’},默认为 ‘auto’。
‘ovr’ 指的是 one-vs-rest,这种就是用二分类的方法解决多分类的问题;如要分类为 A,B,C 三类,那么就可以把 A 当作正向数据,B 和 C 当作负向数据来处理。
‘multinomial’ 指的是 many-vs-many,它会选择一部分类别的样本和另一部分类别的样本来做逻辑回归二分类;如要分类为 A,B,C 三类,将 A,B 作为正向数据,C 作为负向数据,训练出一个分模型,再将 A,C 作为正向数据,B 作为负向数据,训练出一个分类模型,最后 B,C 作为正向数据,C 作为负向数据,训练出一个模型,通过这三个模型就能实现多分类。
‘auto’ 顾名思义根据实际情况,自动选择,它主要依据 solver 参数来决定,具体可以看源码的 _check_multi_class 函数,逻辑为如果 solver 为 liblinear,multi_class 为 ovr,如果分类类别大于 2,multi_class 为 multinomial,否则为 ovr。
 

from sklearn.linear_model import LogisticRegressio
for solver in ['sag', 'newton-cg', 'lbfgs']:for C in [0.001, 0.01, 0.1, 1, 10, 100]:clf = LogisticRegression(C=C, solver=solver, max_iter=1024, n_jobs=6, class_weight='balanced')clf.fit(x_train, y_train)

相关内容

热门资讯

Ubuntu系统搭建 一、创建环境常见问题1.1 windows11下打开虚拟机蓝屏问题参考这篇文章,控制面...
性能优化搞得好,Tomcat少... Tomcat基本使用 什么是Web服务器 web服务器的定义 其实并没有标准定义,...
2023还有人不知道kuber... 文章目录Kubernetes(K8s)一、Openstack&VM1、**认识虚拟化****1.1*...
笨鸟学数据结构(绪论) 数据结构的定义按某种逻辑关系组织起来的一批数据,按一定的映象方式把它存放在计算机的存储...
不使用cocoapods-ar... 不使用cocoapods-art插件情况下与jfrog协作原理下载索引创建git仓库或者更新git仓...
微机原理 || push p... 考试真的考了push和pop ,那个加减到底是什么? PUSH 源   ...
使用Spring Boot和C... 原理 Spring Boot是一个基于Spring框架的快速开发应用程序的框架,其提供...
python数据类型常见操作 目录 一、python常见的赋值方式 1.交互性赋值方式 2.连续性赋值方式 3.单独赋值方式 二...
系统架构:经典三层架构 引言 经典三层架构是分层架构中最原始最典型的分层模式,其他分层架构都是其变种或扩展&#...
c++ 流 stream Text Stream: 有解析(parse)和格式化&#...
【springboot】web... 5、视图解析与模板引擎 视图解析:SpringBoot默认不支持 JSP,...
【Java注释】如何自定义注解... 一,如何自定义注解 1.1 在编译时进行格式检查(JDK内置的三个基本注解) ...
Redis案例实战_微信抢红包 目录需求分析架构设计编码实现拓展 需求分析 首先想到发红包的流程 1.发红包 2.抢红包 3.记录红...
关于朋友的思考 关于朋友的思考 朋友就是你高兴时想见的人,烦恼时想找的人,得到对方帮助...
Cobalt Strike--... 获取凭证和哈希      要dump哈希,通过 [beacon] → Access →...
第二章 运算方法和运算器 引入:1. 运算器的运算功能 计算机能够进行的运算包括:算术运算和逻辑运...
DevData Talks 直... 📊本期分享 本期 DevData Talks 邀请到了微众银行研发效能负责人余伟老师...
postgresql基本操作与... postgresql基本操作与基本对象 postgresql是一个C/S架构的大型软件࿰...
【洛谷 P1028】[NOIP... [NOIP2001 普及组] 数的计算 题目描述 给出自然数 nnn,要求按如下方式构...
实验一 Java Web 入门 一、实验目标: 1、了解并学会配置MyEclipse集成开发环境,学会在...