机器学习的特征选择方法

有时候特征太多了也是一个问题,容易过拟合。为了降低模型的复杂程度,降低过拟合的可能性,我们会减少需要的学习的特征。

特征选择法主要有三种,分别是过滤法,包裹法和嵌入法。

1.过滤法

这种方法主要是基于统计检验,根据特征之间的关系去掉具有线性相关的特征,还有根据特征和标签的关系,筛选关系大的特征。

这种方法的好处是具有通用性,不管什么算法都可以这么用。但是问题是这种方法没有考虑算法的特殊性,可能某些算法就是喜欢那些不起眼的特征,有这些特征,它的表现就更好。

简单介绍几种过滤法。

(1).方差阈值法

这种方法就是计算各个特征的方差,然后把方差过低的特征删除,为什么用这个办法?因为如果一个特征全都是一个数值,说明它对分类毫无意义,而这样的特征方差为0,当然这是一种极端情况,但是特征毫无波动,那它确实没什么用。sklearn提供了VarianceThreshold这个方法;

(2).假设检验法

这种一般是使用假设检验进行特征选择,消灭掉P值大于0.05的特征,这种教条主义的P值实际上经常帮倒忙,但是偶尔也会有不错的结果。

sklearn提供了卡方检验chi2,f检验r_regression等等,这些可以结合SelectFpr,SelectFdr,SelectFwe等方法使用

(3).特征相关性

删掉线性相关的特征,我觉得这个方法包含很多种,比如特征之间的互信息,皮尔逊相关系数等等

(4).Fish得分

这种方法有点类似LDA的思想,某一类的特征可能更集中,而不属于这个类的特征就要离得远一些。

还有一些方法,不仅上面提到的。可以再训练分类器之前就进行特征选择的方法,都属于过滤法。

2.包裹法

前向选择,后向选择,分支界定法,递归特征选择法都属于嵌入法,这种方法和特定的算法有一定的交互性。

sklearn提供了递归特征选择法RFE,RFECV,还有前向或者后向选择SequentialFeatureSelector,RFECV是RFE的交叉检验版本,SequentialFeatureSelector可以选择是使用前向还是后向选择,缺点是它居然没有记录每一次的评分。RFE必须带有特征重要性评分的分类器使用,对于基于高斯内核的支持向量机救没办法用了,而具有评分的分类器有树类型的分类器,线性回归等等。

所谓评分就是各个特征的重要评分,比如线性回归的参数就代表了各个特征的重要性,决策树再分裂节点的时候使用的特征具有的信息增益大小等等,具有这些的分类器才能使用RFE,但是SequentialFeatureSelector不用。

from mlxtend.feature_selection import SequentialFeatureSelector
from mlxtend.plotting import plot_sequential_feature_selection
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split#自定义一个评价函数,sklearn是按照分数越高越好来选特征的,所以我们取个负数
#FPR+FNR最大值为2
def score_fpr_fnr(model, X, y):y_pred = model.predict(X)mat = confusion_matrix(y, y_pred)fpr = mat[0,1]/(mat[0,0]+mat[0,1])#假正类率,错误识别的负类除以整个负类fnr = mat[1,0]/(mat[1,1] + mat[1,0])#假负类率return 2 - fpr - fnr#加载数据集二分类
data = load_breast_cancer()
dataset = data['data']
label = data['target']
#划分数据集
X_train, X_test, y_train, y_test = train_test_split(dataset, label, test_size=0.2, shuffle=42)model = RandomForestClassifier()
val_score_list = []#记录每一次的交叉检验均值分数
test_score_list = []#记录每一次测试的分数
#每次要求的后向选择特征数量
for feature_number in range(1, X_train.shape[1]+1):#不进行交叉验证,因为要算太久了,可以根据情况设置,设置自定义的评价方法sfs = SequentialFeatureSelector(model, k_features=feature_number, forward=True,scoring=score_fpr_fnr, cv=None)sfs.fit(X_train, y_train)#训练分类器然后测试X_train_transform = sfs.transform(X_train)X_test_transform = sfs.transform(X_test)model.fit(X_train_transform , y_train)my_score= score_fpr_fnr(model,X_test_transform,y_test)#每一次选择特征的分数#因为制作了一次交叉检验,所以是1,如果多次,就要循环取得f_score = sfs.subsets_[1]['avg_score']val_score_list .append(f_score)test_score_list.append(my_score)

3.嵌入法

这种算法不具有迁移性,因为它与算法本身相关,比如线性回归算法,它的参数w代表了每一个特征的重要性,但是这种w无法用到决策树上面,由于这种方法是算法本身的一种性质,所以就是嵌入在算法内部的意思,因而叫嵌入法。

4.混合

以上三种方法可以进行混合使用,比如使用嵌入法对特征重要性排序,然后使用包裹法进行特征选择。

以后有空回来补充其他的代码

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

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

相关文章

【QT+QGIS跨平台编译】056:【pdal_json_schema+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

点击查看专栏目录 文章目录 一、pdal_json_schema介绍二、pdal下载三、文件分析四、pro文件五、编译实践一、pdal_json_schema介绍 pdal_json_schema 是与 PDAL(Point Data Abstraction Library)相关的 JSON 模式文件。PDAL 是一个用于处理和分析点云数据的开源库。JSON 模式…

wpf Line

详细解释 <Canvas x:Name"canvas"><Line x:Name"flowLine" X1"20" Y1"40" X2"400" Y2"100" StrokeDashArray"2,1" Stroke"Green" StrokeThickness"8"/><Line X1&q…

安装gitlab笔记

安装vim编辑器 yum install vim -y安装ssh协议&#xff0c;在CentOs系统上安装所需的依赖:ssh&#xff0c;防火墙,postfix(用于邮件通知)wget&#xff0c;以下这些命令也会打开系统防火墙中的HTTP和SSH端口访问 yum install -y curl policycoreutils-python openssh-server设…

ISP代理和数据中心IP的不同

ISP代理和数据中心IP在网络应用中都扮演着重要的角色 【定义】 ISP代理是由互联网服务提供商&#xff08;ISP&#xff09;提供的代理服务器。ISP代理的IP地址由ISP分配&#xff0c;这使得用户可以获得一个合法且唯一的IP地址&#xff0c;该地址隐藏了用户的实际位置。而数据中…

AutoMQ 1.1.0-RC0 重磅更新:内核升级到 Apache Kafka 3.7.0

AutoMQ 在 2024.02 正式发布了基于 Apache Kafka 3.4.0 的云原生重构版本 1.0.0&#xff0c;AutoMQ 1.0.0 版本相比原版提供了 Serverless、自动负载均衡、秒级分区迁移和 All in 对象存储能力&#xff0c;让 Kafka 用户能充分利用云的弹性能力和廉价存储&#xff0c;实现十倍成…

Flutter混淆方案对应用性能的影响分析与优化

在移动应用开发中&#xff0c;保护应用代码安全至关重要。Flutter 提供了简单易用的混淆工具&#xff0c;帮助开发者在构建 release 版本应用时有效保护代码。本文将介绍如何在 Flutter 应用中使用混淆&#xff0c;并提供了相关的操作步骤和注意事项。 &#x1f4dd; 摘要 本…

mysq性能优化-my.cnf配置文件参数调整

MySQL 优化配置文件&#xff08;my.cnf 或 my.ini&#xff09;是调整 MySQL 服务器性能的重要手段之一。以下是一些常见的场景&#xff0c;可以通过调整配置文件参数值来优化 MySQL&#xff1a; 1. **提高并发处理能力**&#xff1a; - innodb_buffer_pool_size&#xff1a;增…

【C++】lambda 表达式 / 包装器 / bind 绑定

目录 一. lambda 表达式1. lambda 表达式的语法1. lambda 表达式的使用2. lambda 表达式的捕捉列表 二. 包装器三. bind 绑定 一. lambda 表达式 Lambda 表达式是 C11 标准引入的一种新特性, 它提供了一种方便的方式来定义匿名函数. lambda 表达式实际上是一个匿名的仿函数; …

信创工程师招聘需求分析

职责描述&#xff1a; 1.配合河南区域行业拓展经理&#xff0c;负责河南区域各重点行业嵌入式、信息化软硬件解决方案的设计、研究与推广工作&#xff0c;支持用户开展CPU选型工作。 2. 负责支持飞腾重点行业方向重点客户嵌入式、信息化相关项目的PoC和实施支持工作&#xff0c…

【FTP,EMail】

文章目录 FTPFTP&#xff1a;文件传输协议FTP: 控制连接与数据连接分开FTP命令、响应 EMail电子邮件&#xff08;EMail&#xff09;邮件服务器EMail: SMTP [RFC 2821]SMTP&#xff1a;总结 FTP FTP&#xff1a;文件传输协议 向远程主机上传输文件或从远程主机接收文件。客户/服…

使用tcpdump和wireshark进行服务器抓包分析

目录 前言 1.tcpdump简介 2.Wireshark简介 3.实际案例 4.代码示例 5.总结 前言 服务器抓包分析是一种非常常见和有效的网络故障排查和性能优化手段。通过捕获服务器上的网络流量&#xff0c;可以帮助我们深入了解服务器与其它设备之间的通信情况&#xff0c;发现问题并进…

创新学术之道:如何充分利用ChatGPT优化论文写作过程

ChatGPT无限次数:点击直达 创新学术之道&#xff1a;如何充分利用ChatGPT优化论文写作过程 随着人工智能技术的发展&#xff0c;ChatGPT作为一种高效的自然语言处理工具&#xff0c;在学术领域的应用也日渐普及。本文将介绍如何充分利用ChatGPT优化论文写作过程&#xff0c;提…

Java多线程实战-从零手搓一个简易线程池(三)线程工厂,核心线程与非核心线程逻辑实现

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

Mac上怎么合并多张图片?

Mac上怎么合并多张图片&#xff1f;上班过的小伙伴都应该知道&#xff0c;合并拼接图片是一件非常重要且经常需要使用到的图片处理技术&#xff0c;将多张图片合并拼成一张之后能够展现出更多的图片内容。在Mac电脑上&#xff0c;合并多张图片是一项常见的任务&#xff0c;无论…

策略模式详解+代码案例

首先简单介绍策略模式 该模式定义了一系列算法&#xff0c;并将每个算法封装起来&#xff0c;使它们可以相互替换&#xff0c;且算法的变化不会影响使用算法的客户。策略模式属于对象行为模式&#xff0c;它通过对算法进行封装&#xff0c;把使用算法的责任和算法的实现分割开…

notepad++ 快捷键使用

notepad 很好用 使用快捷键能提高效率 以下为我常用的快捷键 键位效果ctrl l删除高亮行ctrl d重复高亮行ctrl k注释选中行ctrl q取消注释选中行ctrl w关闭文本窗口ctrl tab向右切换窗口ctrl shift tab向左切换窗口ctrl 滚轮向滚动方向切换窗口ctrl shift 滚轮滚动选…

【教程】Kotlin语言学习笔记(六)——泛型

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 第三章 《数据容器》 第四章 《方法》 第五章 《L…

关系型数据库设计

目录 1.数据库设计的重要性及定义 1.1 数据库设计的重要性 1.1.1 失败的数据库设计造成的后果 1.1.2 优秀的数据库设计带来的好处 1.2 数据库设计的定义 2.数据库需求分析 2.1 需求分析的步骤 2.1.1 收集信息 2.1.2 标识实体 2.1.3 标识每个实体的详细信息 2.1…

【HTML】制作一个简单的动态SVG图形

目录 前言 开始 HTML部分 CSS部分 效果图 总结 前言 无需多言&#xff0c;本文将详细介绍一段HTML和CSS代码&#xff0c;该代码用于创建一个动态的SVG图形&#xff0c;具体内容如下&#xff1a; 开始 首先新建文件夹&#xff0c;创建两个文本文档&#xff0c;其中HTML的文…

【2023】kafka原生以及配合springboot的使用(Kafka-3)

&#x1f4bb;目录 前言 一、依赖二、原生使用kafka1、发送消息1.1、生产者同步发送消息1.2、生产者异步发送消息1.3、常用配置&#xff1a; 2、接收消息2.1、关于消费者的自动提交和手动提交2.2、长轮训poll消息2.3、消费者的健康状态检查2.4、指定分区和偏移量&#xff0c;时…