特征选择方法总结

article/2025/11/5 14:01:52

问题

在数据处理中经常会遇到特征太多造成的计算负担和一些其他的影响,如过拟合等,不但使得预测结果不准确,还消耗计算时间。所以特征选择就显得非常重要了。

特征选择:从给定的特征集合中选取出相关特征子集的过程成为“特征选择”。

通过这一操作,不仅能够减少特征的维度,也能得到更能体现目标值的几个特征。在周志华的《机器学习》中第十一章对于特征选择也是有所提到。在文章中大佬对于特征选择的方法分为三类:过滤式(filter),包裹式(wrapper),和嵌入式(embedding).


过滤式(filter)

过滤式:主要是在数据处理过程就对特征进行筛选了,也就是说和机器学习算法无关。该方法本质就是利用数据的数理统计中的某些指标数值来进行筛选。例如卡方,还有信息增益。对于每一个不同的统计量,我们都需要一个阈值来确定那些特征是我们想要的,而这个统计量我们称为“相关统计量”。

方差筛选:

计算每一个特征的方差值,默认情况是删除所有方差为0的特征,很显然,特征为零的数据意味着数据变化为零,这对结果预测的帮助非常小。同样可以通过设定一个阈值,来筛选特征。
例子代码:

from sklearn.feature_selection import VarianceThreshold  # 导入python的相关模块X = [[7, 4, 1], [5, 9, 6], [1, 2, 8], [4, 1, 5]]  #样本情况
select_Feature = VarianceThreshold(threshold=(6))  # 筛选特征的方差大于阈值的特征
select_Feature.fit_transform(X)  # 返回的结果为选择的特征print(select_Feature.fit_transform(X))结果:
[[4 1][9 6][2 8][1 5]]

除了这个简单易懂的方差筛选法外,还有卡方,信息增益等


卡方检验 筛选
其实卡方的本质和误差计算类似,也是实际值与期望值的差经过一些运算得到的一个统计量,

对于这个统计量来说

这里写图片描述

目的是验两个变量独立性的方法,其中
这里写图片描述为实际值,E是期望值,所以当两者越接近的话,意味着差异越小,从实际意义上来讲就是特征这里写图片描述 与类别这里写图片描述之间计算的卡方值越大,说明与假设的偏差越大,而通常原假设:这里写图片描述这里写图片描述之间相互独立,那么我们就可以否定原假设,认为他们是相关的。
举例说明:

是否化妆总计
化妆15(55)95(55)110
不化妆85(45)5(45)90
100100200

原假设:化妆与性别没有关系。
将表中数据带入到公式去,计算可以得出:
在这里插入图片描述
我们得到的结果是129.3,通过查表可以得出推理论犯错的概率p>0.999,也就是存在99.9的可能性是错的。

而该方法在Sklearn中都可以直接调用,如下:

from sklearn.feature_selection import chi2
from sklearn.feature_selection import SelectKBest
import pandas as pd
import numpy as np#利用卡方计量来筛选7个满足条件的特征
x_data = SelectKBest(chi2, k=7).fit_transform(x_data, y_data)

信息增益(information gain)
信息增益主要是通过计算信息熵(entropy)与条件熵的差值的大小排序,这个要对熵进行解释一下,这个概念主要是在物理学中对系统状态混乱程度的量化,如果一个系统不确定的程度越大,那么其熵就越大。所得出的一种特征选择的方法,计算方法如下:

熵的表达式
这个计算得出的信息熵E(X),这个比较容易理解。
其次我们需要计算条件熵,

在这里插入图片描述
。该公式以例子来给大家解说一下

时间效率智商成绩好坏

我们可以看出Y=好/坏的分别概率为3/5,2/5,而我们条件概率,就是在时间多/少确认的情况下(概率为3/5,2/5),效率是否高的概率,例如在已知时间多的情况下,成绩好的占2/3,坏的1/3,H(Y|X = 多)=-(2/3)log(2/3)-(1/3)log(1/3),p(x=多)的概率为3/5,所以将全部的情况计算相加就可以得到条件熵了。

随后我们将两者相减,按照差值排序就可以了。

代码:

import numpy as np
import pandas as pd
import mathclass IG():def __init__(self,X,y):X = np.array(X)n_feature = np.shape(X)[1]#取出x的特征数n_y = len(y)#类标的长度orig_H = 0 #信息熵for i in set(y):#orig_H += -(y.count(i)/n_y)*math.log(y.count(i)/n_y)#条件信息熵condi_H_list = []for i in range(n_feature):feature = X[:,i]sourted_feature = sorted(feature)threshold = [(sourted_feature[inde-1]+sourted_feature[inde])/2 for inde in range(len(feature)) if inde != 0 ]thre_set = set(threshold)if float(max(feature)) in thre_set:thre_set.remove(float(max(feature)))if min(feature) in thre_set:thre_set.remove(min(feature))pre_H = 0for thre in thre_set:lower = [y[s] for s in range(len(feature)) if feature[s] < thre]highter = [y[s] for s in range(len(feature)) if feature[s] > thre]H_l = 0for l in set(lower):H_l += -(lower.count(l) / len(lower))*math.log(lower.count(l) / len(lower))H_h = 0for h in set(highter):H_h += -(highter.count(h) / len(highter))*math.log(highter.count(h) / len(highter))temp_condi_H = len(lower)/n_y *H_l+ len(highter)/n_y * H_hcondi_H = orig_H - temp_condi_Hpre_H = max(pre_H,condi_H)condi_H_list.append(pre_H)#返回所需要的信息增益值self.IG = condi_H_listdef getIG(self):return self.IGif __name__ == "__main__":X = [[1, 0, 0, 1],[0, 1, 1, 1],[0, 0, 1, 0]]y = [0, 0, 1]print(IG(X,y).getIG())结果:
[0.17441604792151594, 0.17441604792151594, 0.17441604792151594, 0.6365141682948128]

信息增益比
信息增益比,可以说是信息增益的进一步的指标,因为信息增益存在的缺点是它会倾向于分类较多的特征。
其主要的思想是,对于样本集合D来说,随即变量X是样本的类别,即假设有k个类别,每一个类别的概率为在这里插入图片描述,而在这里插入图片描述表示类别k的样本个数,|D|表示样本总数。

这里写图片描述

基尼系数
基尼指数(基尼不纯度):表示在样本集合中一个随机选中的样本被分错的概率。Gini指数越小表示集合中被选中的样本被分错的概率越小,也就是说集合的纯度越高,反之,集合越不纯。

这里写图片描述

基尼系数=样本选中的概率*样本选错的概率,

以上三种计量值都是决策树对于节点的选择依据,而基尼系数就是CART的标准,而信息增益是ID3算法的标准。他们的目的都是将分类的集合更加的纯净,这样在最优化的时候可以更快的达到最优解。


包裹式(wrapper)

与过滤式刚好相反,包裹式选择的特征是在机器学习的过程中,并不像过滤式那样在机器学习前就已经选择好了。也就是说通过机器学习得出的结果来判定那些特征更加适合,**就像特地给脚做一双鞋一样,选择效果最好的,最合适脚的鞋。**可能这就包裹式的由来吧(瞎猜的,小声bb)。
因为其使用机器学习性能来评价特征的好坏,也就是说必须通过多次计算从而对比得出最好的结果,这样的方法缺点也是很明显的,首先是计算量非常大,不像过滤式计算复杂度是常数级的,而它可能是次方级的。其次是其求出来的结果可能是一个局部最优解,类似贪心算法。

未完待续。。。


http://chatgpt.dhexx.cn/article/k7dZwQD3.shtml

相关文章

利用sklearn进行特征选择

3种特征选择 Filter 过滤法&#xff0c;按照发散性或者相关性对各个特征进行评分&#xff0c;设定阈值或者待选择阈值的个数&#xff0c;选择特征。 &#xff08;先对数据集进行特征选择&#xff0c;然后再训练学习器&#xff09; Wrapper 包装法&#xff0c;根据目标函数&…

如何进行特征选择

如何进行特征选择 原文地址&#xff1a; http://blog.csdn.net/u010670689/article/details/73196546 特征选择对于数据科学家、机器学习从业者来说非常重要。好的特征选择能够提升模型的性能&#xff0c;更能帮助我们理解数据的特点、底层结构&#xff0c;这对进一步改善模型、…

光谱特征选择

光谱特征选择&#xff08;谱特征选择&#xff09; 简介算法框架算法推导总结 Spectral feature selection可翻译为谱特征选择&#xff0c;之前的特征提取学习中陷入了光谱特征选择翻译的误区。 参考论文为"Spectral feature selection for supervised and unsupervised le…

模型特征选择

RF、GBDT、XGboost都可以做特征选择&#xff0c;属于特征选择中的嵌入式方法。比如在sklearn中&#xff0c;可以用属性feature_importances_去查看特征的重要度, 比如&#xff1a; from sklearn import ensemble#grd ensemble.GradientBoostingClassifier(n_estimators30)grd …

sklearn 数据处理与特征工程

1、数据处理的流程 2 数据预处理 Preprocessing & Impute 2.1 数据无量纲化 在机器学习算法实践中&#xff0c;我们往往有着将不同规格的数据转换到同一规格&#xff0c;或不同分布的数据转换到某个特定分布的需求&#xff0c;这种需求统称为将数据“无量纲化”。譬如梯度…

特征选择

一、特征选择基本问题 我们将属性称为“特征”&#xff08;feature&#xff09;&#xff0c;对当前学习任务有用的属性称为“相关特征”&#xff08;relevant feature&#xff09;、没什么用的属性称为“无关特征”&#xff08;irrelevant feature&#xff09;。 从给定的特征集…

特征选择(筛选特征)

根据特征选择的形式可以将特征选择方法分为3种&#xff1a; Filter&#xff1a;过滤法&#xff0c;按照发散性或者相关性对各个特征进行评分&#xff0c;设定阈值或者待选择阈值的个数&#xff0c;选择特征。Wrapper&#xff1a;包装法&#xff0c;根据目标函数&#xff08;通常…

机器学习 基础理论 学习笔记 (8)特征选择(feature selection)(一)

0.说明 本文也许比较乱&#xff0c;请看目录再食用。 后续会 出文 机器学习 基础理论 学习笔记 &#xff08;8&#xff09;特征选择&#xff08;feature selection&#xff09;&#xff08;二&#xff09; 将 分类问题 和 回归问题 分开总结。 以及或将出文 机器学习 基础理…

三种常见的特征选择方法

特征选择 特征选择是特征工程里的一个重要问题&#xff0c;其目标是寻找最优特征子集。特征选择能剔除不相关(irrelevant)或冗余(redundant )的特征&#xff0c;从而达到减少特征个数&#xff0c;提高模型精确度&#xff0c;减少运行时间的目的。并且常能听到“数据和特征决定…

特征选择方法最全总结!

上个月扫读完《阿里云天池大赛赛题解析》[1]后&#xff0c;看到书中对特征选择的讲述&#xff0c;于是便打算借此机会&#xff0c;系统梳理下各种特征选择方法。如有不足&#xff0c;还望指正。 一、背景介绍 在处理结构型数据时&#xff0c;特征工程中的特征选择是很重要的一个…

运行时错误 '-2147467259 (80004005)'

运行时错误 -2147467259 (80004005)方法 getFooterColor 作用于对象 IFPLayoutRegion 时失败遇到这样的错误主要是因为在 VBA 访问布局表格时&#xff0c;没有启用表尾。解决方法&#xff1a;在布局表格设置中启用表尾。注&#xff1a;同样的错误和解决方法也适用于表首。

win12服务器之常见错误:运行时错误(/应用程序中的服务器错误)

阿里云解答参考&#xff1a;https://www.cnblogs.com/xrtd/p/3704532.html 原因1: 这是由于配置中 Asp.Net 程序 没有显示详细的错误信息. 解决: 您必须修改 web.config 文件 将 <customErrors mode"On"/> 设置为mode "Off", 上传到网站根目录.然后…

问题:当运行exe程序时遇到错误0000007时如何解决

这里我是需要用的一个DDS库安装程序&#xff0c;但是经过一系列安装操作后&#xff0c;最后一步验证是否成功时出现了问题&#xff1a; 点击 该exe应用程序提示&#xff1a;应用程序错误0xc000007b 给出我使用后成功了的解决方法&#xff1a; 首先下载All in One Runtimes 简…

C++编译错误与运行时错误

笔试题里经常会有这样的题目&#xff0c;让你判断运行时错误还是编译错误。在这里将它总结一下。 在调试过程中&#xff0c;运行时错误是最麻烦的问题。因为编译错误可以由编译器检查出来&#xff0c;而大多数编译器对运行时错误却无能为力。查错和纠错的工作完全由用户自己来…

下面的程序运行时哪里会出现错误

1、下面的程序运行时哪里会出现错误&#xff1a;struct S { int i; int * p; }; int main() { S s; int * p &s.i; p[0] 4; p[1] 3; s.p p; s.p[1] 1; s.p[0] 2; return 0; } 【题目解析】 这道题考的是对结构体内存使用情况的理解。在32位的操作系统中&#xff0c;i…

Word粘贴文字时遇到报错:运行时错误‘53’:文件未找到:mathpage.WLL 解决方案

Word粘贴文字时遇到报错&#xff1a; 运行时错误‘53’&#xff1a; 文件未找到&#xff1a;mathpage.WLL 问题&#xff1a; 每次装完MathType后&#xff0c;在word里面进行粘贴操作时&#xff0c;总是出现“运行时错误‘53’&#xff1a;文件未找到&#xff1a;MathPage.WLL…

MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 环境 MathType7.4Microsoft Office 365Windows 11 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 Microsoft Word 中使…

JAVA的编译时错误和运行时错误

1. 要区分编译时错误和运行时错误&#xff0c;就应该先明白什么是编译&#xff1f;什么是运行&#xff1f; 首先&#xff0c;先看一下这张图&#xff1a; 编译期就是将我们写的java源代码交给编译器执行的过程&#xff0c;起翻译的作用&#xff0c;该过程主要对java源代码的…

【Word】MathType 运行时错误‘53’:文件未找到:MathPage.WLL

问题描述 1. 环境&#xff1a; MathType7.4Microsoft Office 365Windows 11 2. 问题 情景1. Microsoft Word 启动时显示 Please reload Word to load MathType addin properly 情景2. 安装MathType后在 Microsoft Word 中使用复制粘贴时报错 运行时错误‘53’ 情景3. 在 M…

运行程序报错怎么办?

Dev c中常见的报错有几种 一. ld return 1 exit status 这种报错是最常见的&#xff0c;下面是可能的原因 1.库函数拼写错误。如&#xff1a;printf&#xff0c;scanf,等 2.定义的函数名在调用时&#xff0c;函数名拼写错误&#xff08;这个主要自定义函数啊啥的可能比较多…