Sklearn笔记--逻辑回归调参指南

2023-11-20

1 逻辑回归概述

p θ ( y = 1 ∣ x ) = δ ( θ ⊤ x ) = 1 1 + e − θ ⊤ x p θ ( y = 0 ∣ x ) = e − θ ⊤ x 1 + e − θ ⊤ x \begin{array}{c} p_{\theta}(y=1 | x)=\delta\left(\theta^{\top} x\right)=\frac{1}{1+e^{-\theta^{\top} x}} \\ p_{\theta}(y=0 | x)=\frac{e^{-\theta^{\top} x}}{1+e^{-\theta^{\top} x}} \end{array} pθ(y=1x)=δ(θx)=1+eθx1pθ(y=0x)=1+eθxeθx

在Scikit-learn的最新版本中,与逻辑回归有关的有2个类。LogisticRegression, LogisticRegressionCV 。其中LogisticRegression和LogisticRegressionCV的主要区别是LogisticRegressionCV使用了交叉验证来选择正则化系数C。 而LogisticRegression需要自己每次指定一个正则化系数。除了交叉验证,以及选择正则化系数C以外, LogisticRegression和LogisticRegressionCV的使用方法基本相同。
在之前的版本中,还有一个Logistic_regression_path类则比较特殊,它拟合数据后,不能直接来做预测,只能为拟合数据选择合适逻辑回归的系数和正则化系数,主要是用在模型选择的时候。在版本0.21中已废弃,在版本0.23中已删除。
LogisticRegression和LogisticRegressionCV中的大部分参数是一样的,下面首先介绍LogisticRegression的参数,再介绍LogisticRegressionCV中的不同参数。

本文基于scikit-learn 0.23最新版本,官方API 为:

sklearn.linear_model.LogisticRegression

class sklearn.linear_model.LogisticRegression(penalty=‘l2’, dual=False,tol=0.0001, C=1.0, fit_intercept=True, intercept_scaling=1,class_weight=None, random_state=None, solver=‘liblinear’, max_iter=100,multi_class=‘ovr’,verbose=0, warm_start=False, n_jobs=1)


2 LogisticRegression参数指南


2.1 正则化参数:penalty

{‘l1’,‘l2’, ‘elasticnet’, ‘none’}, default=’l2’
1、newton-cg、sag 和 lbfgs 算法只能使用 l2 正则化,因为L1正则化的损失函数不是连续可导的。
2、elasticnet是弹性网络正则化,是L1正则化和L2正则化的混合项,仅支持saga损失函数优化器。
3、在调参时一般选择L2正则化就够了,但是如果选择L2正则化发现还是过拟合,即预测效果差的时候,就可以考虑L1正则化。另外,如果模型的特征非常多,我们希望一些不重要的特征系数归零,从而让模型系数稀疏化的话,也可以使用L1正则化。

2.2 损失函数优化器:solver

{‘liblinear’,‘lbfgs’, ‘sag’,‘newton-cg’, ‘saga’}, default=’lbfgs’
solver参数决定了我们对逻辑回归损失函数的优化方法,有5种算法可以选择,分别是:
  a) liblinear:使用了开源的liblinear库实现,内部使用了坐标轴下降法来迭代优化损失函数,适用于小数据集。
  b) lbfgs:拟牛顿法的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  c) newton-cg:也是牛顿法家族的一种,利用损失函数二阶导数矩阵即海森矩阵来迭代优化损失函数。
  d) sag:即随机平均梯度下降,是梯度下降法的变种,和普通梯度下降法的区别是每次迭代仅仅用一部分的样本来计算梯度,适合于样本数据多的时候,sag是一种线性收敛算法,这个速度远比梯度下降法快。
  e) saga:快速梯度下降法,线性收敛的随机优化算法的的变种,适用于样本量非常大的数据集。

从上面的描述可以看出,newton-cg, lbfgs和sag这三种优化算法时都需要损失函数的一阶或者二阶连续导数,因此不能用于没有连续导数的L1正则化,只能用于L2正则化。而liblinear,saga适用于L1正则化和L2正则化。
同时,sag每次仅仅使用了部分样本进行梯度迭代,所以当样本量少的时候不要选择它,而如果样本量非常大,比如大于10万,sag是第一选择。
下图是官方给出的损失函数优化器适用情形:
在这里插入图片描述

总结而言:
1、liblinear支持L1和L2,只支持OvR做多分类。
2、lbfgs, sag,newton-cg只支持L2,支持OvR和MvM做多分类。
3、saga支持L1、L2、Elastic-Net,支持OvR和MvM做多分类。

2.3 分类方式选择参数:multi_class

{‘auto’, ‘ovr’, ‘multinomial’}, default=’auto’
1、‘ovr’ – ‘OvR’, 将多分类问题看成是二分类问题,每次只将一类样本与其他类样本组成的集合进行训练,进行 nc 次训练以后就可以完成多分类问题的处理了。
2、‘multinomial’ – ‘MvM’,liblinear 不能选择该项,以单循环的方式进行分类,每次处理两个分类,保证样本中所有分类两两组合进行过一次训练,共需 nc*(nc-1)/2 次训练,分类速度慢,但分类结果更准确。
3、‘auto’ – 如果 resolver 是 liblinear 则选择 OvR,否则选择 MvM。
   
OvR相对简单,但分类效果相对略差。而MvM分类相对精确,但是分类速度没有OvR快。

2.4 类型权重参数:class_weight

{dict or ‘balanced’}, default=None
class_weight 参数决定了样本的各分类类型权重,可以取值:
1、dict – 通过 dict 定义分类权重:{class_label: weight}。
2、balanced – 类库会根据训练样本量来计算权重。某种类型样本量越多,则权重越低,样本量越少,则权重越高。
3、None – 默认值,不指定权重。

那么class_weight有什么作用呢?在分类模型中,我们经常会遇到两类问题:

1、第一种是误分类的代价很高。比如对合法用户和非法用户进行分类,将非法用户分类为合法用户的代价很高,这时我们可以适当提高非法用户的权重。
2、第二种是样本是高度失衡的,比如我们有合法用户和非法用户的二元样本数据10000条,里面合法用户有9995条,非法用户只有5条,如果我们不考虑权重,则我们可以将所有的测试集都预测为合法用户,这样预测准确率理论上有99.95%,但是却没有任何意义。这时,我们可以选择balanced,让类库自动提高非法用户样本的权重。

2.5 其他参数

---- 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。
---- random_state:随机数种子
int类型,可选参数,默认为无,仅在正则化优化算法为"sag",“liblinear"时有用。
---- max_iter:算法收敛最大迭代次数
int类型,默认为10。仅在正则化优化算法为"newton-cg”, "sag"和"lbfgs"才有用,算法收敛的最大迭代次数。
---- verbose:日志冗长度
int类型。默认为0,就是不输出训练过程;1的时候偶尔输出结果;大于1,对于每个子模型都输出。
---- warm_start:热启动参数
bool类型,默认为False。如果为True,则下一次训练是以追加树的形式进行(重新使用上一次的调用作为初始化)。
---- n_jobs:并行数
int类型,默认为1。1的时候,用CPU的一个内核运行程序;2的时候,用CPU的2个内核运行程序;为-1的时候,用所有CPU的内核运行程序。

2.6 类属性和方法

类属性

---- coef_:决策函数中的特征系数
---- intercept_:截距
---- n_iter_:所有分类实际迭代次数

类方法

---- decision_function(X) :预测样本的置信度分数
---- densify() :密集化处理,将系数矩阵转换为密集阵列格式
---- sparsify() :稀疏化处理,将系数矩阵转换为稀疏格式
---- fit(X, y[, sample_weight]) :训练逻辑回归模型
---- get_params([deep]):获取参数
---- predict(X):用来预测测试样本的标记,也就是分类,预测X的标签
---- predict_log_proba(X): 获取预测样本 log 概率估计
---- predict_proba(X) :获取预测样本概率估计
---- score(X, y[, sample_weight]) :返回给定的测试数据和标签的平均精度
---- set_params(**params) :设置estimate的参数

样本权重参数: sample_weight

上面我们提到了样本失衡的问题,由于样本不平衡,导致样本不是总体样本的无偏估计,从而可能导致我们的模型预测能力下降。遇到这种情况,我们可以通过调节样本权重来尝试解决这个问题。调节样本权重的方法有两种,第一种是在class_weight使用balanced。第二种是在调用fit(X, y[, sample_weight])函数时,通过sample_weight来自己调节每个样本权重。Scikit-learn做逻辑回归时,如果上面两种方法都用到了,那么样本的真正权重是class_weight*sample_weight。


3 LogisticRegressionCV参数指南


sklearn.linear_model.LogisticRegressionCV

class sklearn.linear_model.LogisticRegressionCV(Cs=10, fit_intercept=True, cv=None, dual=False, penalty=‘l2’, scoring=None, solver=‘lbfgs’, tol=0.0001, max_iter=100, class_weight=None, n_jobs=None, verbose=0, refit=True, intercept_scaling=1.0, multi_class=‘auto’, random_state=None, l1_ratios=None)

LogisticRegressionCV与LogisticRegression中不同的参数已经用粗体标示了。

3.1 LogisticRegressionCV中的参数

LogisticRegressionCV中的大部分参数和LogisticRegression是一样的,还有些是LogisticRegression中没有的,这里单独说明。

---- 正则化系数λ的倒数 Cs
浮点数列表或int,可选(默认值= 10)。如果Cs为int,则以1e-4和1e4之间的对数标度选择Cs值网格。与支持向量机一样,较小的值指定更强的正则化。
---- 交叉验证参数 : cv
默认None,使用三折交叉验证。指定fold数量,默认为3,也可以是yield训练/测试数据的生成器。
---- refit
bool,optional(默认= True)。如果设置为True,则对所有folds处的分数取平均值,并获取与最佳分数相对应的coefs和C,然后使用这些参数进行最后的修正。如果设置为False,coefs、intercepts和C对应的最佳folds的分数将被平均。
---- l1_ratios
float或None列表,可选(默认=无)。弹性网混合参数列表,用于交叉验证的l1_ratio数组。如果没有使用l1_ratio(即惩罚不是’ elasticnet '),则将其设置为[None]。

3.2 类属性和方法

类属性

coef_、intercept_、n_iter_属性和LogisticRegression中的一致。
---- Cs_
用于交叉验证的正则化系数λ的倒数 Cs。
---- C_
数组C映射到每个类的最佳分数。
---- scores_
在对相应的类执行OvR之后,以类为键进行dict,值为交叉验证每个fold时获得的分数网格。
---- l1_ratios_
用于交叉验证的l1_ratios数组。
---- l1_ratio_
映射到每个类最佳分数的l1_ratio数组。
---- coefs_paths_
以类为键的dict,值为通过每个fold进行交叉验证时获得的系数路径,和通过每个类执行OvR相应Cs获取的系数路径。

LogisticRegressionCV与LogisticRegression中的类方法一致。

参考资料

https://blog.csdn.net/sun_shengyun/article/details/53811483
https://blog.csdn.net/kingzone_2008/article/details/81067036
https://techlog.cn/article/list/10183284
https://scikit-learn.org/dev/modules/linear_model.html#logistic-regression
https://scikit-learn.org/dev/modules/generated/sklearn.linear_model.LogisticRegression.html#sklearn.linear_model.LogisticRegression

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Sklearn笔记--逻辑回归调参指南 的相关文章

  • 如何从数据库模式自动生成示例 Django 应用程序?

    我正在评估概念验证应用程序的框架 该应用程序的生命周期约为 30 天 之后它将被遗忘或完全重写 我已确定要从现有数据库模式自动生成示例应用程序 然后调整视觉设计的某些方面 我看过一个演示红宝石 on Rails 它会为数据库中的每个表自动生
  • matplotlib 的 pcolor 中的白线

    在某些 pdf 查看器 例如 OSX 上的 Preview 中 使用以下命令绘制的图matplotlib的 pcolor 有白线 见下图 我怎样才能摆脱它们 源代码非常简单 选择任何数据x y z import matplotlib mat
  • tkinter 上的“NoneType”对象没有属性“get”错误[重复]

    这个问题在这里已经有答案了 我最近开始使用 python 3 6 进行编码tkinter并尝试创建我自己的项目repl it 该项目是一个简单的交互式待办事项列表 但是我陷入困境并且无法使该功能正常工作 该函数只是简单地获取条目并将其添加到
  • 使用 OpenCV 进行图像模糊检测

    我正在研究图像的模糊检测 我已经用过拉普拉斯方法的方差在 OpenCV 中 img cv2 imread imgPath gray cv2 cvtColor img cv2 COLOR BGR2GRAY value cv2 Laplacia
  • 如何让 Discord 机器人显示“机器人正在输入...”状态?

    所以如果我有一个像这样的长命令 bot command pass context True async def longCommand ctx typing status sleep 10 bot say Done 不幸的是 在文档或此处没
  • Python服务器“通常只允许每个套接字地址使用一次”

    我正在尝试用 python 创建一个非常基本的服务器 它侦听端口 当客户端尝试连接时创建 TCP 连接 接收数据 发回某些内容 然后再次侦听 并无限期地重复该过程 这是我到目前为止所拥有的 from socket import server
  • 如何在Python中重命名virtualenv?

    我拼错了名字virtualenv使用以下方法初始化它 virtualenv vnev 我实际上打算创建一个名为的环境venv 尝试重命名后vnev文件夹到venv 我发现这并没有提供太多帮助 激活环境的名称仍然重命名旧的vnev mv vn
  • Tensorflow:Cuda 计算能力 3.0。所需的最低 Cuda 能力为 3.5

    我正在从源安装tensorflow 文档 https www tensorflow org versions r0 10 get started os setup html installing from sources Cuda驱动版本
  • Python 的二进制字符串列表

    我有一个像这样的二进制字符串 1100011101 我想将其解析为一个列表 其中每个 1 或 0 块都是列表中的单独值 例如 1100011101 变成 11 000 111 0 1 您可以通过使用正则表达式而不是从中获得一点 次要 性能g
  • 为什么Python 3中实例方法可以作为类方法调用?

    考虑下面的类 class Foo object def bar self print self 在Python 2中 2 7 13 调用bar 作为类方法引发异常 gt gt gt Foo bar hello Traceback most
  • 提取二值图像中的最中心区域

    我正在处理二进制图像 之前使用此代码来查找二进制图像中的最大区域 Use the hue value to convert to binary thresh 20 thresh thresh img cv2 threshold h thre
  • 在Python中从整个图像中检测表格部分

    我有一张尺寸为 3500x5000 的图像 现在我只想检测整个图像中的表格部分 如果不能直接进行 OCR 处理 则对其进行裁剪和旋转 经过所有搜索后 我想到了使用裁剪图像中的每个单元格的想法https medium com coinmonk
  • 使用 django-profiles 以配置文件形式编辑相关模型

    我在用着Django 配置文件 http bitbucket org ubernostrum django profiles wiki Home在我的应用程序中 因为它为我提供了一些简单的视图 可以帮助我更快地到达我想去的地方 但是 我有一
  • 为什么变量不在循环外更新?

    无法弄清楚为什么结果中的第一个键是 abc 而不是我期望的 c 我使用的是Python 3 6 4 数据结构很奇怪 因为我删除了不相关的键和值 f replace ab r data abc 1 def 2 ghi 3 jkf 4 lmn
  • “gi.repository.Gtk”对象没有属性“gdk”

    我正在尝试使用 GTK 创建多线程 需要 Gtk gdk 但我收到有关没有 gdk 属性的错误 我正在使用带有 Raspbian 的 Raspberry Pi 这就是我导入 GTK 库的方式 try import pygtk pygtk r
  • 打包布尔数组需要通过 int (numpy 1.8.2)

    我正在寻找更紧凑的方式来存储布尔值 numpy 内部需要 8 位来存储一个布尔值 但是np packbits允许打包 他们 这真是太酷了 问题是要打包在4e6字节数组a32e6字节我们需要首先使用的布尔值数组256e6字节将布尔数组转换为
  • 从 Python 访问 802.11 无线管理帧

    我想从 Linux 上的 Python 嗅探 802 11 管理 探测请求 帧 这可以从 Scapy 中实现 如下所示 coding utf 8 from scapy all import def proc p if p haslayer
  • centos上无法安装Pillow

    我上面有 centos 6 3 和 python 2 6 当我尝试通过 easy install 安装它时 出现以下错误 imaging c 76 20 error Python h No such file or directory In
  • 写入文件的正确方法?

    我想知道这样做是否有什么区别 var1 open filename w write Hello world 并做 var1 open filename w var1 write Hello world var1 close 我发现没有必要
  • Django Python - LDAP 身份验证

    我目前正在研究 Django Python 我的目标是从 Ldap 目录对用户进行身份验证 我确实有 python 代码来访问 ldap 目录并检索信息 Code import ldap try l ldap open ldap forum

随机推荐

  • python爬虫,多线程与生产者消费者模式

    使用队列完成生产者消费者模式 使用类创建多线程提高爬虫速度 https sc chinaz com tupian index html https sc chinaz com tupian index 2 html https sc chi
  • elasticsearch 安装教程

    一 jdk安装 es要求jdk版本在1 8以上 所以先安装jdk1 8 安装步骤 1 安装完Centos6 5的Base Server版会默认安装OpenJDK 首先需要删除OpenJDK 命令 rpm qa grep java 显示如下
  • 头条员工自爆:拿遍BAT和TMD的offer,面试过于NB!

    最近看到一位今日头条员工在脉脉发帖称 最近两次找工作 BAT TMD的offer几乎拿了个遍 但一般一家只能待两年 原因是面试的时候表现过于NB 导致下家对自己期望值过高 实际工作中面临的阻力很大的时候就会退缩 自己的能力项可能是面试 每次
  • Android 网络管理

    系统中对网络的判断和选在是在Connectivityervice这个服务中来处理的 在系统启动的时候会启动这个系统服务 系统启动完毕后 ConnectivityService在系统启动的时候就启动了 在android内部 用framewor
  • 如何学好C语言的数据结构与算法?

    C语言的数据结构与算法 难就难在链表 学会了链表 可能后面就一点都不难了 书籍推荐 数据结构与算法分析 C语言描述版 要深入学习的话可以选择这本书 因为针对链表的讲解是比较详细的 所以可以很快理解链表 跟着书上一点点实现基本操作 增删改查
  • Vue中的过滤器

    过滤器 定义 对要显示的数据进行特定格式化后再显示 适用于一些简单逻辑的处理 语法 1 注册过滤器 Vue filter name callback 全局 或 new Vue filters 局部 2 使用过滤器 xxx 过滤器名 或 v
  • 动态修改日志级别,太有用了!

    首发于公众号 BiggerBoy 背景 我们在系统中一般都会打印一些日志 并且在开发 测试 生产各个环境中的日志级别可能不一样 在开发过程中为了方便调试打印了很多debug日志 但是生产环境为了性能 为了节约存储资源 我们会将日志级别设置为
  • linux shell进行数值计算

    出于项目需要 需要用脚本执行计算 最简单的方法1 这里写算式 可以写变量 Desktop cat test sh a 102 c a 123 echo a a echo a 123 c Desktop test sh a 102 a 123
  • 【软件测试】用例篇

    一 什么是测试用例 测试用例 向被测试系统发起的一组集合 这组集合包含测试数据 测试步骤 测试平台 预期结果 二 为什么在测试前要设计测试用例 三 基于需求设计测试用例 3 1测试是我们测试人员进行测试的依据 3 2测试人员首先要分析需求
  • A-LOAM总结-(前端+后端)算法流程分析

    文章目录 scanRegistration cpp 雷达信息预处理进程 laserOdometry cpp laserMapping cpp A LOAM算法流程 主要运行以下3个cpp文件 流程框图在文末 scanRegistration
  • (C语言)输出数组的最大值及其对应下标的最小值

    本题源自pintia cn 题目要求 代码 测试结果图 PTA测试结果 题目要求 本题要求编写程序 找出给定的n个数中的最大值及其对应的最小下标 下标从0开始 输入格式 输入在第一行中给出一个正整数n 1
  • 为什么学完Python后的薪资这么高?

    人工智能和大数据概念的兴起 带动了Python的快速增长 Python语言逻辑简洁 入门简单 生态丰富 几乎成为几个新兴领域的不二选择 而除了这两个领域 Python还有更多的适用领域 爬虫 web 自动化运维等领域都非常适合Python发
  • 详细的Python Flask的操作

    本篇文章是Python Flask 建站框架入门课程 编程实战微课 w3cschool微课的学习笔记 根据课程整理而来 本人使用版本如下 Python 3 10 0 Flask 2 2 2 简介 Flask是一个轻量级的可定制的web框架
  • 推荐|5种商业AI产品的技术架构设计!

    来源 达观数据 概要 今天我们就特别推荐达观数据的几个商业产品设计技术架构 希望对于广大技术有帮助 做任何一个商业产品设计 技术架构都是首先要考虑的 特别是面对海量数据的AI商业项目更是如此 今天我们就特别推荐达观数据的几个商业产品设计技术
  • Vue中key

    相信很多小伙伴跟我一样在使用v for的时候对key值的存在和必要性有疑问 通过ESlint进行代码检查的时候不加上key还会报错 想知道key为什么存在可以先想想key为什么产生 会不会是尤雨溪灵光一闪就给Vue添加上了key 也有可能
  • 大数据简介

    预备篇 目录 知识 大数据简介 计算机单位 大数据的五个 v Hadoop Hadoop概述 Hadoop的历史 Hadoop三大发行版本 1 Apache Hadoop 2 Cloudera Hadoop 3 Hortonworks Ha
  • 野外偷拍_野外紧急设计

    关于本系列 本系列文章旨在为人们经常讨论但难以捉摸的软件体系结构和设计概念提供新的视角 通过具体的示例 尼尔 福特为您提供了进化架构和紧急设计的敏捷实践的坚实基础 通过将重要的架构和设计决策推迟到最后一个负责任的时刻 可以防止不必要的复杂性
  • 武汉大学空间智能化处理复习

    空间数据处理智能化的重要性 提高地理信息处理的效率 减轻人在地理信息处理中的劳动量 使一般的地理信息用户也能让专家一样解决问题 大型的空间决策服务需要归纳 分析多种方案 智能化处理方法的来源 常常来自于人工智能学科的研究成果 如 知识工程
  • CTK框架介绍和环境搭建

    CTK框架介绍和环境搭建 概述 本人第一次接触CTK的时候是看的一去 二三里大佬的博客 CTK框架实际应用比较可靠 但网上资料很少 官网提供的API链接也已经无法打开了 目前还没有找到很好的官方的使用介绍 网上目前找到的CTK的介绍或者是博
  • Sklearn笔记--逻辑回归调参指南

    1 逻辑回归概述 p y