当前位置: 首页 > news >正文

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等自我反思的解决办法,但是整体链路太长,延迟高,不利于工业落地。 虽然无法面对整个服务场景&#xff…...

[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…...

10.web应用体系以及windows网络常见操作应用

一、Dos命令 1.启动方式:winR,输入cmd 2.切换盘符/路径:盘符名称: (C:) cd 目录 (cd B111)(目录名按table键自动补全) 3.查看目录:dir dir /p 分页展示目录及…...

【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721

1. 力扣19:删除链表的倒数第N个节点 1.1 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: …...

机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)

机器学习之实战篇——Mnist手写数字0~9识别(全连接神经网络模型) 文章传送MNIST数据集介绍:实验过程实验环境导入模块导入MNIST数据集创建神经网络模型进行训练,测试,评估模型优化 文章传送 机器学习之监督学习&#…...

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉:生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐(Biten et al.,2022)或通过数据增强减少对象共现模…...

数据库系统 第54节 数据库优化器

数据库优化器是数据库管理系统(DBMS)中的一个关键组件,它的作用是分析用户的查询请求,并生成一个高效的执行计划。这个执行计划定义了如何访问数据和执行操作,以最小化查询的执行时间和资源消耗。以下是数据库优化器的…...

微服务杂谈

几个概念 还是第一次听说Spring Cloud Alibaba ,真是孤陋寡闻了,以前只知道 SpringCloud 是为了搭建微服务的,spring boot 则是快速创建一个项目,也可以是一个微服务 。那么SpringCloud 和 Spring boot 有什么区别呢?S…...

【Pandas操作2】groupby函数、pivot_table函数、数据运算(map和apply)、重复值清洗、异常值清洗、缺失值处理

1 数据清洗 #### 概述数据清洗是指对原始数据进行处理和转换,以去除无效、重复、缺失或错误的数据,使数据符合分析的要求。#### 作用和意义- 提高数据质量:- 通过数据清洗,数据质量得到提升,减少错误分析和错误决策。…...

如何分辨IP地址是否能够正常使用

在互联网的日常使用中,无论是进行网络测试、网站访问、数据抓取还是远程访问,一个正常工作的IP地址都是必不可少的。然而,由于各种原因,IP地址可能无法正常使用,如被封禁、网络连接问题或配置错误等。本文将详细介绍如…...

Sqoop 数据迁移

Sqoop 数据迁移 一、Sqoop 概述二、Sqoop 优势三、Sqoop 的架构与工作机制四、Sqoop Import 流程五、Sqoop Export 流程六、Sqoop 安装部署6.1 下载解压6.2 修改 Sqoop 配置文件6.3 配置 Sqoop 环境变量6.4 添加 MySQL 驱动包6.5 测试运行 Sqoop6.5.1 查看Sqoop命令语法6.5.2 测…...

【数据结构】排序算法系列——希尔排序(附源码+图解)

希尔排序 算法思想 希尔排序(Shell Sort)是一种改进的插入排序算法,希尔排序的创造者Donald Shell想出了这个极具创造力的改进。其时间复杂度取决于步长序列(gap)的选择。我们在插入排序中,会发现是对整体…...