sklearn-逻辑回归-特征工程示例
sklearn-逻辑回归-特征工程示例
在实际应用场景中,有时候特征的数量会很多,我们出于业务考虑,也出于计算量的考虑,希望对逻辑回归进行特征选择来降维。比如在判断一个人是否会患乳腺癌的时候,医生如果看58个指标来确诊,会比看30多个指标容易得多,因此就挑选58个至关重要的指标来看
高效的嵌入法 embedded 实现降维
由于 L1 正则化会使得部分特征对应的参数变为0, 因此 L1 正则化可以用来做特征选择。结合嵌入法的模块 SelectFromModel,可以很容易筛选出让模型十分高效的特征。此时我们的目的是尽量保留原数据上的信息,让模型在降维后的数据上拟合效果保持十分优秀,因此我们不考虑训练集测试集的问题,把所有的数据都放入模型进行降维。
示例代码看效果
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LogisticRegression as LR
# load_breast_cancer 为乳腺癌数据集
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import cross_val_score
from sklearn.feature_selection import SelectFromModel# 将数据集实例化,不考虑测试集和训练集的问题,直接把数据集都导入模型中
data = load_breast_cancer()
# 查看数据集结构, 结果如 图1 所示
data.data.shape# C为0.9, penalty 默认为 L2
LR_ = LR(solver="liblinear", C=0.8, random_state = 420)
# 进行交叉验证,入参依次为 模型、特征矩阵、标签、cv交叉验证次数为10次,mean取平均值,得出结果如 图2 所示
cross_val_score(LR_, data.data, data.target, cv=10).mean()# 对数据进行降维,并打印最终特征矩阵的结构,如 图3 所示
# 嵌入法 SelectFromModel 的实例化,LR_代表模型,norm_order=1代表使用l1范式,模型会删除所有在 L1 范式下面被判断为无效的特征
# fit_transform 直接输入特征矩阵和标签,得出最终的特征矩阵 x_embedded
x_embedded = SelectFromModel(LR_, norm_order=1).fit_transform(data.data, data.target)
x_embedded.shape# 使用x_embedded进行交叉验证, 结果如 图4 所示
cross_val_score(LR_, x_embedded, data.target, cv=10).mean()
图1:

图2:

图3:

图4:

调节模型到最佳拟合效果
根据示例代码,使用嵌入法完成降维之后,特征由 30 个减少到了 9个,模型效果由 0.95 下降到 0.93,效果并没有下降太多,模型还是比较的高效。
如果要求比较高,想要让模型的拟合效果更好,可以借助学习曲线来观察
通过 threshold 参数画学习曲线
threshold 参数是一个浮点数,代表特征的重要性低于这个浮点数的都删除。在逻辑回归中就是系数,系数越大,这个参数对逻辑回归的影响性就越大,所以 threshold 参数可以取到的最大值,就是系数的最大值
相关代码
# 查看模型里面所有的系数,系数值越大,代表这个特征对逻辑回归的贡献越大,结果如 图5 所示
LR_.fit(data.data, data.target).coef_
# 完整的特征矩阵结果列表
fullx = []
# 特征选择后的特征矩阵结果列表
fsx = []
# 取从0开始,系数的绝对值最大值结束的,20个数的列表,作为 threshold 的可选入参,进行循环
threshold = np.linspace(0, abs(LR_.fit(data.data, data.target).coef_).max(), 20)
# 打印 threshold 列表,如 图6 所示
print(threshold)
k = 0
for i in threshold:# threshold从0开始,逐渐靠近系数最大值时,模型的表现变化X_embedded = SelectFromModel(LR_, threshold = i).fit_transform(data.data, data.target)# 完整的特征矩阵交叉验证的结果fullx.append(cross_val_score(LR_, data.data, data.target, cv=5).mean())# 特征选择后的特征矩阵交叉验证结果fsx.append(cross_val_score(LR_, X_embedded, data.target, cv=10).mean())# 打印 threshold 里面取到的每一个值 和 降维后的特征矩阵含有多少个特征,如 图7 所示print((threshold[k], X_embedded.shape[1]))k +=1plt.figure(figsize=(20, 5))
plt.plot(threshold, fullx, label="full")
plt.plot(threshold, fsx, label="feature selection")
plt.xticks(threshold)
plt.legend()
# 打印学习曲线图,如 图8 所示
plt.show()
图5:

图6:

图7:

图8:

由图7和图8可见,threshold 从 0 到 0.1 的时候,特征个数删减的最多,从30个特征删减到了17个特征,后面 threshold 的变动,特征个数的变动都比较小,最后5个取值特征个数都稳定在1个。学习效果从0.95下降到0.93左右,此后随着threshold逐渐变大,学习效果也在降低。可见 threshold 的取值设置区间过大,没有参考价值。我们要找的是降维之后,存在着能够让模型效果保持优异的情况。 可以取0到0.101之间的范围,再次查看特征个数和学习曲线是如何波动的,结果如 图9 所示
图9:

由图9可见,threshold 在0.0215之前,模型学习效果和全特征学习效果差别不大,当 threshold 大于 0.0215的后,模型学习效果开始下降。由此,最少的特征量取24、25个合适。相较于30个,降维并不明显,可见该方法不适用于乳腺癌数据集。
通过画C的学习曲线
第二种方式是直接调整逻辑回归的类 LR 本身,通过画 C 的学习曲线来实现。
相关代码
# 完整的特征矩阵结果列表
fullx = []
# 特征选择后的特征矩阵结果列表
fsx = []
# 一般 C 取值范围是 0 到 1,这个模型可以试验一下,取 0 到 10 比较好
# 以 0.01 为开头,10.01 为结尾,每隔 0.5 取一个数
C = np.arange(0.01, 10.01, 0.5)for i in C:# 根据不同的C,构建不同的模型LR_C = LR(solver="liblinear", C=i, random_state=420)# 完整的特征矩阵交叉验证的结果fullx.append(cross_val_score(LR_C, data.data, data.target, cv=10).mean())X_embedded = SelectFromModel(LR_C,norm_order=1).fit_transform(data.data, data.target)# 特征选择后的特征矩阵交叉验证结果fsx.append(cross_val_score(LR_C, X_embedded, data.target, cv=10).mean())# 打印特征选择后特征矩阵模型交叉验证分数列表里的最高的值,以及对应的 C 值
print(max(fsx), C[fsx.index(max(fsx))])plt.figure(figsize=(20, 5))
plt.plot(C, fullx, label="full")
plt.plot(C, fsx, label="feature selection")
plt.xticks(C)
plt.legend()
# 打印学习曲线图,如 图10 所示
plt.show()
图10:

由图10可见,C为 8.51 的时候,模型的学习效果达到最优 0.956,并且要比蓝色的全量特征的分值还高。在这条学习曲线中,C的取值范围比较大,一般来讲,C的取值范围在0到1之间,我们可以将C范围划定在 8.01 到 9.01 ,以0.005为间隔画C的学习曲线,如图11所示
图11:

由图11可见,C位8.025000000000002的时候,模型的学习效果最好,为0.9563164376458386,我们可以验证一下,当 C 取该值时,模型降维效果如何
验证模型降维效果
LR_ = LR(solver="liblinear", C=8.025000000000002, random_state=420)
# 打印完整的特征矩阵交叉验证的结果
print("完整的特征矩阵交叉验证的结果:{}".format(cross_val_score(LR_, data.data, data.target, cv=10).mean()))X_embedded = SelectFromModel(LR_,norm_order=1).fit_transform(data.data, data.target)
# 打印降维后的特征矩阵交叉验证的结果
print("降维后的特征矩阵交叉验证的结果:{}".format(cross_val_score(LR_, X_embedded, data.target, cv=10).mean()))# 打印降维后的维度
print(X_embedded.shape)
图12:

由图12可见,通过C学习曲线找到的最佳C变量,完成降维后的模型,学习效果达到了 0.956,由30个特征成功降维到9个特征
相关文章:
sklearn-逻辑回归-特征工程示例
sklearn-逻辑回归-特征工程示例 在实际应用场景中,有时候特征的数量会很多,我们出于业务考虑,也出于计算量的考虑,希望对逻辑回归进行特征选择来降维。比如在判断一个人是否会患乳腺癌的时候,医生如果看58个指标来确诊…...
RTMP播放器延迟最低可以做到多少?
技术背景 RTMP播放器的延迟可以受到多种因素的影响,包括网络状况、推流设置、播放器配置以及CDN分发等。因此,RTMP播放器的延迟并不是一个固定的数值,而是可以在一定范围内变化的。 正常情况下,网上大多看到的,针对R…...
细致刨析JDBC ① 基础篇
目录 一、JDBC概述 1.JDBC的概念 编辑2.JDBC的核心组成 ① 接口规范: ② 实现规范: 二、JDBC快速入门 1.JDBC搭建步骤 三、核心API理解 1.注册驱动 2.Connection 3.Statement 4.PreparedStatement 5.ResultSet 四、基于Preparedment实现CRUD 1.查询单行单列 2.查询单行…...
Reactive 编程-Loom 项目(虚拟线程)
Reactive 编程与 Loom 项目(虚拟线程) Java 项目 Loom 是 Oracle 在 JVM 上的一项重大变革,旨在引入 虚拟线程(Virtual Threads),以简化并发编程。传统的 Java 线程是重量级的,由操作系统管理&…...
Windows下使用MinGW编译安装zmq的步骤
背景: 在开发过程中,需要使用zmq库进行数据交互,因此需要编译zmq库。 安装步骤 软件下载 https://github.com/zeromq/libzmq.git 下载,将代码切换到git checkout 4c6cff6391分支 软件编译 cd .\libzmq\ mkdir build cd .\bu…...
电商云账户分账系统:打造高效资金流转体系
在当今的电子商务时代,随着消费者购物习惯的转变和在线交易量的激增,电商平台的运营模式也日趋复杂。为了满足多商家共存、利益共享的需求,电商分账成为了一个至关重要的环节。 电商分账是指电商平台在销售商品或服务后,根据事先…...
设计模式 -- 单例设计模式
1.1 单例 创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。 SingleModel 类提供了一个静态方法,供外界获取它的静态实例。 DesignTest 我们的演示类使用 SingleModel 类来获取 SingleModel 对象。 创建 Single…...
python fastapi 打包exe
创建虚拟环境 python -m venv 国内依赖仓库 # 换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com 安装nuitka pip install nuitka 生成exe nuitka --mingw64 --show-progress --s…...
【测试开岗面试】知识点总结
1.知识点总结 Q:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试 (Unit Testing) 单元测试是对软件中最小可测试单元(通常是函数或方法)进行验证的过程。它的目的是确保每个单元在设计时的功能能够正常运行。单元测试通常由…...
【高级编程】synchronized 解决并发问题 类的线程安全类型
文章目录 并发问题同步方法同步代码块 线程安全类型ArrayListHashtableHashMapVector 多线程共享数据引发的问题 模拟 “A” “B” “C” 三人抢票,总票数10张,打印抢票情况以及剩余票数。 public class Site implements Runnable {int count 10; // …...
Speculative RAG:为知识密集型数据服务的RAG
论文链接 RAG的一个棘手问题是不知道该召回多少chunk,少了可能丢信息,多了会引入噪声信息。虽然有self-reasoning等自我反思的解决办法,但是整体链路太长,延迟高,不利于工业落地。 虽然无法面对整个服务场景ÿ…...
[Go]-抢购类业务方案
文章目录 要点:1. 抢购/秒杀业务的关键挑战2. 技术方案3.关键实现点4.性能优化建议5.其他考虑因素 细节拆分:1. **高并发处理**2.**限流与防护**3.**库存控制**4. **异步处理**5. **数据一致性**6. **常用架构设计**7. **代码示例**8. 进一步优化9. 注意…...
Android 源码多个Launcher设置默认Launcher
目录 第一部分、android10之前 一.多个launcher 启动设置默认launcher的核心类 二 在自定义服务里面设置默认Launcher 第二部分、android10之后 一、Launcher应用内置并设置为默认Launcher 1.通过ResolverActivity.java设置为默认Launcher 改法一: 改法二&am…...
计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...
深度学习中实验、观察与思考的方法与技巧
在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。以下是一些有效的方法与技巧,可以帮助你在深度学习实践中系统性地开展实验、分析结果并进行深入思考: 1. 明确实验目标 在开始实验前,确保对实验的目标有清晰的定…...
记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享
一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…...
http连接github远程仓库密码问题解决办法
目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…...
LAMP环境下项目部署
目录 目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 2、关闭防火墙和selinux 查看防火墙状态 关闭防火墙 查看SELinux的状态 临时关闭SELinux 永久关闭SELinux:编辑SELinux的配置文件 配置文件的修改内容 3、检查系统…...
Visual Studio 2022从外部引入dll导致的问题
这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中,有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下: 3、点击浏览选项,选择想要引入dll的路径,这里我选择下载MapGIS 10的路径 …...
大模型从失败中学习 —— 微调大模型以提升Agent性能
人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时,通常只使用成功的交互轨迹,而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费,也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
连锁超市冷库节能解决方案:如何实现超市降本增效
在连锁超市冷库运营中,高能耗、设备损耗快、人工管理低效等问题长期困扰企业。御控冷库节能解决方案通过智能控制化霜、按需化霜、实时监控、故障诊断、自动预警、远程控制开关六大核心技术,实现年省电费15%-60%,且不改动原有装备、安装快捷、…...
Frozen-Flask :将 Flask 应用“冻结”为静态文件
Frozen-Flask 是一个用于将 Flask 应用“冻结”为静态文件的 Python 扩展。它的核心用途是:将一个 Flask Web 应用生成成纯静态 HTML 文件,从而可以部署到静态网站托管服务上,如 GitHub Pages、Netlify 或任何支持静态文件的网站服务器。 &am…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
HDFS分布式存储 zookeeper
hadoop介绍 狭义上hadoop是指apache的一款开源软件 用java语言实现开源框架,允许使用简单的变成模型跨计算机对大型集群进行分布式处理(1.海量的数据存储 2.海量数据的计算)Hadoop核心组件 hdfs(分布式文件存储系统)&a…...
Chromium 136 编译指南 Windows篇:depot_tools 配置与源码获取(二)
引言 工欲善其事,必先利其器。在完成了 Visual Studio 2022 和 Windows SDK 的安装后,我们即将接触到 Chromium 开发生态中最核心的工具——depot_tools。这个由 Google 精心打造的工具集,就像是连接开发者与 Chromium 庞大代码库的智能桥梁…...
Kafka主题运维全指南:从基础配置到故障处理
#作者:张桐瑞 文章目录 主题日常管理1. 修改主题分区。2. 修改主题级别参数。3. 变更副本数。4. 修改主题限速。5.主题分区迁移。6. 常见主题错误处理常见错误1:主题删除失败。常见错误2:__consumer_offsets占用太多的磁盘。 主题日常管理 …...
