【机器学习】sklearn特征选择(feature selection)

文章目录

  • 特征工程
  • 过滤法(Filter)
    • 方差过滤
    • 相关性过滤
      • 卡方过滤
      • F验表
      • 互信息法
      • 小结
  • 嵌入法(Embedded)
  • 包装法(Wrapper)


特征工程

特征提取(feature extraction)特征创造(feature creation)特征选择(feature selection)
从文字,图像,声音等其他非结构化数据中提取新信息作为特征。比如说,从淘宝宝贝的名称中提取出产品类别,产品颜色,是否是网红产品等等。把现有特征进行组合,或互相计算,得到新的特征。比如说,我们有一列特征是速度,一列特征是距离,我们就可以通过让两列相除,创造新的特征:通过距离所花的时间。从所有的特征中,选择出有意义,对模型有帮助的特征,以避免必须将所有特征都导入模型去训练的情况。

特征选择是特征工程中最为简单的一个,在做特征选择时,第一步是根据我们的目标,用业务常识来选择特征,做一些基本的判断,也就是需要理解业务

理解业务,对特征做出基本的判断,只适用于特征量不多且好分辨的数据集,多特征不易分辨的数据集,可以采用四种方法可以用来选
择特征:过滤法嵌入法包装法,和降维算法

本文主要对过滤法嵌入法包装法进行解释说明,并用sklearn进行实践操作,降维算法可以看下一篇博客详解。


过滤法(Filter)

过滤方法通常用作预处理步骤,特征选择完全独立于任何机器学习算法。它是根据各种统计检验中的分数以及相关。
在这里插入图片描述选择特征时不管模型,该方法基于特征的通用表现去选择,比如: 目标相关性、自相关性和发散性等。

方差过滤

方差越大的特征,那么我们可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对我们的算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对我们的模型训练没有任何作用,可以直接舍弃。

方差过滤,就是设置一个阈值,方差小于这个阈值的全部过滤掉,舍弃掉。sklearn中使用类VarianceThreshold,只需要填写一个阈值参数,不填默认0,就是把毫无关联的特征删除掉。

VarianceThreshold(阈值).fit_transform(特征矩阵数据集)

比如说,我要删除一半的特征,那么我们需要找到所有特征方差的中位数来作为阈值:

from sklearn.feature_selection import VarianceThreshold
import numpy as np
X_fsvar = VarianceThreshold(np.median(X.var().values)).fit_transform(X)  # X.var()每一列的方差

当特征是二分类时,特征的取值就是伯努利随机变量,这些变量的方差可以计算为:
V [ x ] = p ( 1 − p ) V[x] = p(1-p) V[x]=p(1p)
其中X是特征矩阵,p是二分类特征中的一类在这个特征中所占的概率。
二分类特征中某种分类占到80%以上的时候,删除该特征:

X_bvar = VarianceThreshold(.8 * (1 - .8)).fit_transform(X)

可以对进行方差过滤后的特征集进行交叉验证,看看效果如何:效果其实主要看超参数threshold阈值的选取

阈值很小
被过滤掉得特征比较少
阈值比较大
被过滤掉的特征有很多
模型表现不会有太大影响可能变更好,代表被滤掉的特征大部分是噪音
也可能变糟糕,代表被滤掉的特征中很多都是有效特征
运行时间可能降低模型的运行时间基于方差很小的特征有多少当方差很小的特征不多时对模型没有太大影响一定能够降低模型的运行时间算法在遍历特征时的计算越复杂,运行时间下降得越多

现实中,我们只会使用阈值为0或者阈值很小的方差过滤,来为我们优先消除一些明显用不到的特征,然后我们会选择更优的特征选择方法继续削减特征数量。

相关性过滤

望选出与标签相关且有意义的特征,因为这样的特征能够为我们提供大量信息。如果特征与标签无关,那只会白白浪费我们的计算内存,可能还会给模型带来噪音。

sklearn当中,我们有三种常用的方法来评判特征与标签之间的相关性:卡方,F检验,互信息。

卡方过滤

卡方过滤是专门针对离散型标签(即分类问题)的相关性过滤。卡方检验类feature_selection.chi2计算每个非负特征和标签之间的卡方统计量,并依照卡方统计量由高到低为特征排名。
再结合feature_selection.SelectKBest这个可以输入”评分标准“来选出前K个分数最高的特征的类,我们可以借此除去最可能独立于标签,与我们分类目的无关的特征。

卡方值 X2的计算公式如下:

在这里插入图片描述

observed是实际值,expected是理论值。卡方值的目的是衡量理论和实际的差异程度。
卡方值高,说明两变量之间具有相关性的可能性更大。

from sklearn.ensemble import RandomForestClassifier as RFC # 随机森林
from sklearn.model_selection import cross_val_score # 交叉验证
from sklearn.feature_selection import SelectKBest #选出前K个分数最高的特征
from sklearn.feature_selection import chi2 # 卡方
# 通过卡方=》排序=》选择300个相关性最高的特征
X_fschi = SelectKBest(chi2, k=300).fit_transform(X_fsvar, y)
# 用随机森林验证一下
cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()

如果交叉验证的结果比之前的准确率低,说明删除了与模型相关且有效的特征,k值设置的太小了,如果模型的表现提升,则说明我们的相关
性过滤是有效的,是过滤掉了模型的噪音的,这时候我们就保留相关性过滤的结果。

如何选择超参数k?
一个一个试,画学习曲线:

%matplotlib inline
import matplotlib.pyplot as plt
score = []
for i in range(390,200,-10):X_fschi = SelectKBest(chi2, k=i).fit_transform(X_fsvar, y)once = cross_val_score(RFC(n_estimators=10,random_state=0),X_fschi,y,cv=5).mean()score.append(once)
plt.plot(range(350,200,-10),score)
plt.show()

在这里插入图片描述随着K值的不断增加,模型的表现不断上升,这说明,K越大越好,数据中所有的特征都是与标签相关的。

上面学习曲线选不出k值,还可以通过:看p值选择k

卡方检验的本质是推测两组数据之间的差异,其检验的原假设是”两组数据是相互独立的”。卡方检验返回卡方值和P值两个统计量,其中卡方值很难界定有效的范围,而p值,我们一般使用0.01或0.05作为显著性水平,即p值判断的边界,具体我们可以这样来看:

P值<=0.05或0.01>0.05或0.01
数据差异差异不是自然形成的这些差异是很自然的样本误差
相关性两组数据是相关的两组数据是相互独立的
原假设拒绝原假设,接受备择假设接受原假设

从特征工程的角度,我们希望选取卡方值很大,p值小于0.05的特征,即和标签是相关联的特征。

chivalue, pvalues_chi = chi2(X_fsvar,y)
# chivalue卡方值  pvalues_chi  p值

F验表

F检验,又称ANOVA,方差齐性检验,是用来捕捉每个特征与标签之间的线性关系的过滤方法。它即可以做回归也可以做分类,因此包含feature_selection.f_classif(F检验分类)和feature_selection.f_regression(F检验回归)两个类。其中F检验分类用于标签是离散型变量的数据,而F检验回归用于标签是连续型变量的数据。

F检验的本质是寻找两组数据之间的线性关系,其原假设是”数据不存在显著的线性关系“。它返回F值和p值两个统计量。和卡方过滤一样,我们希望选取p值小于0.05或0.01的特征,这些特征与标签时显著线性相关的,而p值大于0.05或0.01的特征则被我们认为是和标签没有显著线性关系的特征,应该被删除。

from sklearn.feature_selection import f_classif
F, pvalues_f = f_classif(X_fsvar,y)

互信息法

互信息是衡量变量之间相互依赖程度,它的计算公式如下:

在这里插入图片描述在这里插入图片描述在这里插入图片描述

它既可以做回归也可以做分类,并且包含两个类feature_selection.mutual_info_classif(互信息分类)和
feature_selection.mutual_info_regression(互信息回归)。这两个类的用法和参数都和F检验一模一样,不过互信息法比F检验更加强大,F检验只能够找出线性关系,而互信息法可以找出任意关系。

互信息法不返回p值或F值类似的统计量,它返回“每个特征与目标之间的互信息量的估计”,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1则表示两个变量完全相关。

from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(X_fsvar,y)

小结

现实中:先使用方差过滤,然后使用互信息法来捕捉相关性。

说明超参数的选择
VarianceThreshold方差过滤,可输入方差阈值,返回方差大于阈值的新特征矩阵看具体数据究竟是含有更多噪声还是更多有效特征一般就使用0或1来筛选也可以画学习曲线或取中位数跑模型来帮助确认
SelectKBest用来选取K个统计量结果最佳的特征,生成符合统计量要求的新特征矩阵看配合使用的统计量
chi2卡方检验,专用于分类算法,捕捉相关性追求p小于显著性水平的特征
f_classifF检验分类,只能捕捉线性相关性要求数据服从正态分布追求p小于显著性水平的特征
f_regressionF检验回归,只能捕捉线性相关性要求数据服从正态分布追求p小于显著性水平的特征
mutual_info_classif互信息分类,可以捕捉任何相关性不能用于稀疏矩阵追求互信息估计大于0的特征
mutual_info_regression互信息回归,可以捕捉任何相关性不能用于稀疏矩阵追求互信息估计大于0的特征

嵌入法(Embedded)

特征选择被嵌入进学习器训练过程中,得到各个特征的权值系数,根据权值系数从大到小选择特征。

在这里插入图片描述
SelectFromModel是一个元变换器,可以与任何在拟合后具有coef_feature_importances_属性或参数中可选惩罚项的评估器一起使用(比如随机森林和树模型就具有属性feature_importances_,逻辑回归就带有Ll和L2惩罚项,线性支持向量机也支持l2惩罚项)。
对于有feature_importances_的模型来说,若重要性低于提供的阈值参数,则认为这些特征不重要并被移除。
feature_importances_的取值范围是[0,1],如果设置阈值很小,比如0.001,就可以删除那些对标签预测完全没贡献的特征。如果设置得很接近1,可能只有一两个特征能够被留下。

参数:

  1. estimator:使用的模型评估器,只要是带feature_importances_或者coef_属性,或带有L1和L2惩罚项的模型都可以使用。
  2. threshold:特征重要性的阈值,重要性低于这个阈值的特征都将被删除。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC
RFC_ = RFC(n_estimators =10,random_state=0)
X_embedded = SelectFromModel(RFC_,threshold=0.005).fit_transform(X,y)

学习曲线找阈值:

import numpy as np
import matplotlib.pyplot as plt
RFC_.fit(X,y).feature_importances_
threshold = np.linspace(0,(RFC_.fit(X,y).feature_importances_).max(),20)
score = []
for i in threshold:X_embedded = SelectFromModel(RFC_,threshold=i).fit_transform(X,y)once = cross_val_score(RFC_,X_embedded,y,cv=5).mean()score.append(once)
plt.plot(threshold,score)
plt.show()

包装法(Wrapper)

将要使用的学习器的性能作为特征子集的评价准则,目的是为给的学习器选择“量身定做”的特征子集。

依赖于算法自身的选择,比如
coef_属性或feature_importances_属性来完成特征选择。我们往往使用一个目标函数作为黑盒来帮助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器,并且通过
coef_属性或通过feature_importances_属性获得每个特征的重要性。然后,从当前的一组特征中修剪最不重要的特征。在修剪的集合上递归地重复该过程,直到最终到达所需数量的要选择的特征。区别于过滤法和嵌入法的一次训练解决所有问题,包装法要使用特征子集进行多次训练,因此它所需要的计算成本是最高的。

在这里插入图片描述

在这个图中的“算法”,指的不是我们最终用来导入数据的分类或回归算法(即不是随机森林),而是专业的数据挖掘算法,即我们的目标函数。这些数据挖掘算法的核心功能就是选取最佳特征子集。

最典型的目标函数是递归特征消除法(Recursive feature elimination, 简写为RFE)。它是一种贪婪的优化算法,旨在找到性能最佳的特征子集。 它反复创建模型,并在每次迭代时保留最佳特征或剔除最差特征,下一次迭代时,它会使用上一次建模中没有被选中的特征来构建下一个模型,直到所有特征都耗尽为止。 然后,它根据自己保留或剔除特征的顺序来对特征进行排名,最终选出一个最佳子集。包装法的效果是所有特征选择方法中最利于提升模型表现的,它可以使用很少的特征达到很优秀的效果。除此之外,在特征数目相同时,包装法和嵌入法的效果能够匹敌,不过它比嵌入法算得更见缓慢,所以也不适用于太大型的数据。相比之下,包装法是最能保证模型效果的特征选择方法。

from sklearn.feature_selection import RFE
RFC_ = RFC(n_estimators =10,random_state=0)
selector = RFE(RFC_, n_features_to_select=340, step=50).fit(X, y)

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

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

相关文章

【软件设计师-下午题总结】

目录 下午题之总结于学习记录&#xff1a;题一、数据流图&#xff1a;1、熟悉相关的图形2、实体名称3、数据存储4、补充缺失的数据流和起点终点5、用结构化语言描述6、描述&#xff0c;找加工逻辑的时候7、如何保持数据流平衡 题二&#xff1a;实体联系图&#xff1a;1、常用图…

Django Test

Django--Laboratory drug management and early warning system-CSDN博客 创建项目doinglms django-admin startproject doinglms python manage.py runserver 运行开发服务器(Development Server) 创建一个自定义 App,名称为 lms: python manage.py startapp lms

minio桶命名规则

一、背景 今天做项目需要上传图片到minio&#xff0c;上传失败&#xff0c;查看错误是桶未创建成功。 minio桶的创建具有自己的命名规则&#xff0c;不符合则无法创建。 二、命名规则 1、存储桶名称的长度必须介于 3&#xff08;最小&#xff09;到 63&#xff08;最大&…

【数据结构】二叉树--堆排序

目录 一 降序(建小堆) 二 升序 (建大堆) ​三 优化(以升序为例) 四 TOP-K问题 一 降序(建小堆) void Swap(int* x, int* y) {int tmp *x;*x *y;*y tmp; }//降序 建小堆 void AdjustUp(int* a, int child) {int parent (child - 1) / 2;while (child > 0){if (a[chil…

Ubuntu 22.04.3 LTS单机私有化部署sealos

推荐使用奇数台 Master 节点和若干 Node 节点操作系统 :Ubuntu 22.04 LTS内核版本 :5.4 及以上配置推荐 :CPU 4 核 , 内存 8GB, 存储空间 100GB 以上最小配置 :CPU 2 核 , 内存 4GB, 存储空间 60GB 这里采用的Ubuntu 22.04.3 LTS 版本&#xff0c;Ubuntu 20.04.4 LTS这个版本…

Eclipse插件安装版本不兼容问题解决方案——Papyrus插件为例

项目场景: Eclipse Papyrus安装后,没有新建Papyrus工程选项,也没有新建Papyrus Model的选项。 打开Papyrus Model会报错 问题描述 同样的,安装其他插件也是。可能某个插件之前安装是好用的,结果Eclipse的版本更新了,就再也安装不好用了 原因分析: 根本原因是因为包之…

Xcode 15下,包含个推的项目运行时崩溃的处理办法

升级到Xcode15后&#xff0c;部分包含个推的项目在iOS17以下的系统版本运行时&#xff0c;会出现崩溃&#xff0c;由于崩溃在个推Framework内部&#xff0c;无法定位到具体代码&#xff0c;经过和个推官方沟通&#xff0c;确认问题是项目支持的最低版本问题。 需要将项目的最低…

十七、【渐变工具组】

文章目录 渐变工具油漆桶工具 渐变工具 渐变样式有5种&#xff0c;分别是线性渐变&#xff0c;径向渐变&#xff0c;角度渐变&#xff0c;对称渐变&#xff0c;菱形渐变 另外渐变工具的颜色可以进行编辑&#xff0c;需要先打开渐变编辑工具&#xff1a; 如何使用渐变编辑工…

与HTTP相关的各种概念

网络世界 网络世界中最重要的一个名词就是互联网&#xff08;Internet&#xff09;,它以TCP/IP协议族为基础&#xff0c;构建成了一望无际的信息传输网络。而我们通常所说的“上网”&#xff0c;主要就是访问互联网的一个子集——万维网&#xff08;World Wide Web&#xff09…

如何使用CSS和JavaScript实施暗模式?

近年来&#xff0c;暗模式作为用户界面选项备受追捧。它提供了更暗的背景和更亮的文本&#xff0c;不仅可以减轻眼睛疲劳&#xff0c;还可以节省电池续航时间&#xff0c;尤其是在OLED屏幕上。 不妨了解如何结合使用CSS和JavaScript为网站和Web应用程序添加暗模式选项。 了解暗…

JWT的原理及实际应用

前言&#xff1a; 定义&#xff1a;JSON Web Token&#xff08;缩写 JWT&#xff09;是目前最流行的跨域认证解决方案 JWT官网 由于HTTP协议是无状态的&#xff0c;这意味着如果我们想判定一个接口是否被认证后访问&#xff0c;就需要借助cookie或者session会话机制进行判定&…

保姆级手把手记录Android studio BottomNavigationView +FrameLayout暴力切换Fragment

开发环境&#xff1a; 效果图&#xff1a; 《《《代码在底部》》》 1&#xff0c;新建项目 2&#xff0c;新建若干Fragment&#xff0c;内容一样&#xff0c;改一下显示出来的Text&#xff0c;名字分别为test1Fragment,test2Fragment,test3Fragment,默认TextView的Text属性分别…

交通 | python网络爬虫:“多线程并行 + 多线程异步协程

推文作者&#xff1a;Amiee 编者按&#xff1a; 常规爬虫都是爬完一个网页接着爬下一个网页&#xff0c;不适应数据量大的网页&#xff0c;本文介绍了多线程处理同时爬取多个网页的内容&#xff0c;提升爬虫效率。 1.引言​ 一般而言&#xff0c;常规爬虫都是爬完一个网页接着…

代码随想录算法训练营第五十二天 | 123.买卖股票的最佳时机III、188.买卖股票的最佳时机IV

123.买卖股票的最佳时机III 视频讲解&#xff1a;动态规划&#xff0c;股票至多买卖两次&#xff0c;怎么求&#xff1f; | LeetCode&#xff1a;123.买卖股票最佳时机III_哔哩哔哩_bilibili 代码随想录 &#xff08;1&#xff09;代码 188.买卖股票的最佳时机IV 视频讲解&a…

文字雨特效

效果展示 CSS 知识点 简易实现云朵技巧text-shadow 属性的灵活运用filter 属性实现元素自动变色 实现页面布局 <div class"container"><div class"cloud"><h2>Data Clouds Rain</h2></div> </div>实现云朵 实现云…

从基础到卷积神经网络(第12天)

1. PyTorch 神经网络基础 1.1 模型构造 1. 块和层 首先&#xff0c;回顾一下多层感知机 import torch from torch import nn from torch.nn import functional as Fnet nn.Sequential(nn.Linear(20, 256), nn.ReLU(), nn.Linear(256, 10))X torch.rand(2, 20) # 生成随机…

<图像处理> Fast角点检测

Fast角点检测 基本原理是使用圆周长为N个像素的圆来判定其圆心像素P是否为角点&#xff0c;如下图所示为圆周长为16个像素的圆&#xff08;半径为3&#xff09;&#xff1b;OpenCV还提供圆周长为12和8个像素的圆来检测角点。 相对中心像素的位置信息 //圆周长为16 static c…

Lumen/Laravel - 事件机制原理与工作流程 - 探究

1.应用场景 主要用于学习与探究Lumen/Laravel的事件机制原理与工作流程。 2.学习/操作 1.文档阅读 chatgpt & 其他资料 2.整理输出 2.1 是什么 TBD 2.2 为什么需要「应用场景」 TBD 2.3 什么时候出现「历史发展」 TBD 2.4 怎么实践 TBD 截图 后续补充 ... 3.问题…

深度学习基础知识 Dataset 与 DataLoade的用法解析

深度学习基础知识 Dataset 与 DataLoade的用法解析 1、Dataset2、DataLoader参数设置&#xff1a;1、pin_memory2、num_workers3、collate_fn分类任务目标检测任务 1、Dataset 代码&#xff1a; import torch from torch.utils import dataclass MyDataset(torch.utils.data.D…

语言模型编码中/英文句子格式详解

文章目录 前言一、Bert的vocab.txt内容查看二、BERT模型转换方法(vocab.txt)三、vocab内容与模型转换对比四、中文编码总结 前言 最近一直在学习多模态大模型相关内容&#xff0c;特别是图像CV与语言LLM模型融合方法&#xff0c;如llama-1.5、blip、meta-transformer、glm等大…