sklearn-逻辑回归-特征工程示例

news2024/11/15 23:39:11

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 +=1

plt.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个特征

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2120370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【系统方案】大数据库建设技术方案(PPT完整版)

大数据湖建设方案旨在构建一个集中式、可扩展的数据存储与分析平台,集中整合企业内外各类数据资源,形成统一的数据资产池。通过先进的数据处理技术,实现数据的快速入库、高效查询与深度分析,为企业决策提供全面、实时、精准的数据…

关于 win10安装.NET framework 3.5失败 的解决方法

文为原创文章,转载请注明原文出处 本文章博客地址:https://hpzwl.blog.csdn.net/article/details/142030841 长沙红胖子Qt(长沙创微智科)博文大全:开发技术集合(包含Qt实用技术、树莓派、三维、OpenCV、Op…

Stable Diffusion AI算法,实现一键式后期处理与图像修复魔法

在当今数字影像时代,后期处理技术已成为将原始图像转化为视觉上令人惊叹艺术作品的点睛之笔。随着人工智能技术的飞速发展,尤其是Stable Diffusion技术在图像处理领域的应用,图片后期处理已达到前所未有的高度,为摄影师、设计师及…

【秒达开源】多功能中文工具箱源码:自部署 全开源 轻量级跨平台 GPT级支持+高效UI+Docker

【秒达开源】多功能中文工具箱源码发布:自部署、全开源、轻量级跨平台,GPT级支持高效UI,Docker/便携版任选,桌面友好丰富插件生态 这是一款集大成之作,专为追求高效与便捷的用户量身打造。它不仅支持完全自部署&#…

Axure科技感设计案例教程:从按钮到大屏的全面探索

Axure RP,作为一款强大的原型设计工具,不仅能够帮助设计师快速构建产品界面,还能通过其丰富的交互功能实现高度逼真的科技感效果。以下是一个简要的教程,介绍如何使用Axure RP设计科技感按钮、图标、统计、图表以及大屏界面。 1.…

Watt ToolKit(steam++)加速服务启动失败,443端口被vsvnhttpsvc(5792)占用。请关掉443端口的程序或者尝试使用系统代理模式

系列文章目录 文章目录 系列文章目录前言一、pandas是什么?二、使用步骤三、 解决办法 前言 在使用Watt ToolKit(steam),加速服务启动失败,443端口被vsvnhttpsvc(5792)占用。请关掉443端口的程序或者尝试使用系统代理…

海外云手机有哪些推荐?

随着云手机的发展,越来越多的企业和个人开始使用云手机来满足他们的海外业务需求。用户可以通过云手机实现方便、快捷的海外访问,一般用来进行tiktok运营、亚马逊电商运营、海外社媒运营等操作。海外云手机平台有很多,以下是一些比较好的云手…

ProbVLM: Probabilistic Adapter for Frozen Vison-Language Models 论文阅读

ProbVLM: Probabilistic Adapter for Frozen Vison-Language Models 论文阅读 Abstract1. Introduction2. Related Work3. Method3.1. Problem Formulation3.2. Building ProbVLM3.3. Latent Diffusion for Probabilistic Embeddings 4. Experiments and Results5. Conclusion阅…

基于spring的博客系统(二)

4. 业务代码 4.1 持久层 根据需求, 先⼤致计算有哪些DB相关操作, 完成持久层初步代码, 后续再根据业务需求进⾏完善 1. ⽤⼾登录⻚ a. 根据⽤⼾名查询⽤⼾信息 2. 博客列表⻚ a. 根据id查询user信息 b. 获取所有博客列表 3. 博客详情⻚ a. 根据博客ID查询博客信息 b. 根据博客I…

【论文阅读】01-Survey on Temporal Knowledge Graph

原文名称:Survey on Temporal Knowledge Graph 1 Introduction 目前有两种方法:基于距离模型的嵌入变换方法和基于语义匹配模型的双线性模型。它们的思想都是将包含实体和关系的知识图谱嵌入到连续的低纬度实向量空间中 时间知识图的推理有两种,第一种是…

LeetCode 热题 100 回顾5

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

【电子通识】半导体工艺——光刻工艺

什么是光刻工艺 人们经常将 Photo Lithography(光刻)缩写成 Photo。得此名称的原因是,这个工艺在晶圆上利用光线来照射带有电路图形的光罩,从而绘制电路。光刻工艺类似于洗印黑白照片,将在胶片上形成的图像印在相纸上。…

Java | Leetcode Java题解之第395题至少有K个重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution {public int longestSubstring(String s, int k) {int ret 0;int n s.length();for (int t 1; t < 26; t) {int l 0, r 0;int[] cnt new int[26];int tot 0;int less 0;while (r < n) {cnt[s.charAt(r) - a];…

一个小例子,给你讲透 Go 配置管理,轻松将其融入到项目中

在软件开发中&#xff0c;配置管理是一个不可或缺的部分。无论是开发环境、测试环境还是生产环境&#xff0c;我们都需要一种方法来存储和读取配置信息。 在 Golang 项目中&#xff0c;Viper 是一个非常流行且功能强大的库&#xff0c;用于处理配置文件。下面我会写一些例子&am…

C++第三节入门 - 引用详解

引用 引用可以对别名进行引用&#xff01; #include<iostream> using namespace std;int main() {int a 0; // 李逵int& b a; // 铁牛int& c b; // 在铁牛的基础上取名为黑旋风return 0; } 引用的特性&#xff1a; 引用在定义的时候必须初始化&…

『功能项目』单例模式框架【37】

我们打开上一篇36C#拓展 - 优化冗余脚本的项目&#xff0c; 本章要做的事情是编写单例模式基类&#xff0c;让继承其基类的子类在运行时只存在一个&#xff0c;共有两个单例基类框架&#xff0c;分别是不继承MonoBehaviour的单例和继承MonoBehaviour的单例框架 首先编写不继承…

【最新华为OD机试E卷-支持在线评测】跳马(200分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 ✨ 本系列打算持续跟新华为OD-E/D卷的三语言AC题解 💻 ACM金牌🏅️团队| 多次AK大厂笔试 | 编程一对一辅导 👏 感谢大家的订阅➕ 和 喜欢💗 🍿 最新华为OD机试E卷,全、新、准,题目覆盖率达 95% 以上,支持…

LabVIEW重构其他语言开发的旧系统

在面对一个运行已久、代码不清晰的项目时&#xff0c;如果该项目涉及复杂的通讯协议&#xff08;如串口和488通讯&#xff09;&#xff0c;重新开发并优化成LabVIEW版本可以极大提升系统的易用性和维护性。为了确保通讯协议的顺利解析和移植&#xff0c;借助专业工具分析现有通…

【OpenCV-阈值与平滑处理】灰度图、HSV、图像阈值、图像平滑处理(方框滤波、均值滤波、高斯滤波、中值滤波)

1 灰度图 import cv2 # 导入 OpenCV 库&#xff0c;用于图像处理 import numpy as np # 导入 NumPy 库&#xff0c;用于数组操作 import matplotlib.pyplot as plt # 导入 Matplotlib 库&#xff0c;用于绘图# %matplotlib inline 是 Jupyter Notebook 特有的魔法命令&…

流媒体平台/视频监控/安防视频汇聚EasyCVR播放暂停后视频画面黑屏是什么原因?

视频智能分析/视频监控/安防监控综合管理系统EasyCVR视频汇聚融合平台&#xff0c;是TSINGSEE青犀视频垂直深耕音视频流媒体技术、AI智能技术领域的杰出成果。该平台以其强大的视频处理、汇聚与融合能力&#xff0c;在构建全栈视频监控系统中展现出了独特的优势。视频监控管理系…