对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限。由此可见,数据和特征在模型的整个开发过程中是比较重要。特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为特征,作为输入供算法和模型使用。从本质上来讲,特征工程是一个表示和展现数据的过程。在实际工作中,特征工程旨在去除原始数据中的杂质和冗余,以设计更高效的特征以刻画求解的问题与预测模型之间的关系。

在实际的模型应用中并不是特征越多越好,特征越多固然会给我们带来很多额外的信息,但是与此同时,一方面,这些额外的信息也增加实验的时间复杂度和最终模型的复杂度,造成的后果就是特征的“维度灾难”,使得计算耗时大幅度增加;另一方面,可能会导致模型的复杂程度上升而使得模型变得不通用。所以我们就要在众多的特征中选择尽可能相关的特征有效的特征,使得计算的时间复杂度大幅度减少来简化模型,并且保证最终模型的有效性不被减弱或者减弱很少,这也就是我们特征选择的目的

特征工程主要包括以下方面:

我们重点从3个方面来详细说明特征工程的具体操作:

机器学习-特征工程中的数据预处理

机器学习-特征工程中的特征选择

机器学习-特征工程中的特征降维

我们在用逻辑回归、决策树等模型方法构建分类模型时,经常需要对自变量进行筛选。比如我们有200个候选自变量,通常情况下,不会直接把200个变量直接放到模型中去进行拟合训练,而是会用一些方法,从这200个自变量中挑选一些出来,放进模型,形成入模变量列表,入模的变量数量会小于200个。这样减少特征具有重要的现实意义:

  • 减少特征数量、降维
  • 降低学习任务的难度,提升模型的效率
  • 使模型泛华能力更强,减少过拟合
  • 增强对特征和特征值之间的理解

问题是,在面对未知领域时,很难有足够的认识去判断特征与目标之间的相关性,特征与特征之间的相关性。这时候就需要用一些数学或工程上的方法来帮助我们更好地进行特征选择,挑选入模变量过程是个比较复杂的过程,需要考虑的因素很多,比如:变量的预测能力,变量之间的相关性,变量的简单性(容易生成和使用),变量的强壮性(不容易被绕过),变量在业务上的可解释性(被挑战时可以解释的通)等等。常见的方法有:

过滤法(Filter):按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。常用的有方差选择法,相关性选择法,特征重要性选择法,互信息选择法,开发检验选择法。
包裹法(Wrapper):根据目标函数,每次选择若干特征或者排除若干特征,直到选择出最佳的子集,常用的有递归特征消除法。
嵌入法(Embedding):先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣,常用的有基于树模型的特征选择和基于惩罚项的特征选择法

目录

1. 去掉重复值高的特征

2. 方差选择法

3. 去掉相关性高的变量

4. 基于IV值的特征选择

5. 基于互信息特征选择

6. 基于卡方检验特征选择

7. 基于树模型的特征选择

总结

1. 去掉重复值高的特征

最基础的特征过滤方法,我们假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用,而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。在实际的应用中一般统计单一变量的众数占比,众数占比95%以上就可以过滤掉这个特征;另外空值率占比95%以上的变量也可以直接过滤掉。

2. 方差选择法

方差衡量的是一个随机变量取值的分散程度。如果一个随机变量的方差非常小,那这个变量作为输入,是很难对输出有什么影响的。在进行特征选择时,可以丢弃那些方差特别小的特征。
       首先计算各个特征的方差,按照方差大小排序,特征的方差越大,特征可能越好。也可以根据指定的阈值选择方差大于阈值的特征,或者指定待选择的特征数 k,然后选择 k 个最大方差的特征。在多分类问题中,如果某特征只有一个取值,那么该特征对分类结果没有任何意义,因为不管取什么值都为 1,单凭该特征是无法区分样本的分类。需要注意的是,方差选择法只有在特征是离散型时才适用,如果是连续型则需要离散化后才能使用。此外,该方法在实际问题中效果并非很好,具体原因参考如下数据集:

特征A     特征B     Y
1                1          0
2                1          0
3                1          0
1                2          1
2                2          1
3                2          1

从以上的数据集中可以看出,特征 A 的方差 4 要大于特征 B 的方差 1.5,但特征 A 对最终分类结果 Y 的区分度明显没有特征 B 好。单看这 6 条数据,特征 A 几乎没有办法区分 Y 是 0 还是 1。因此我们需要明确一个概念,特征值的方差越大不一定对分类结果有更好的区分。关键原因是特征值的方差仅仅只考虑自身的取值,而没有结合最终的分类结果。

from sklearn.feature_selection import VarianceThreshold#方差选择法,返回值为特征选择后的数据
#参数threshold为方差的阈值
VarianceThreshold(threshold=3).fit_transform(iris.data)

3. 去掉相关性高的变量

在统计学中,方差是用来度量单个随机变量的离散程度,而协方差则一般用来刻画两个随机变量的相似程度

  • 如果协方差为正,说明X,Y同向变化,协方差越大说明同向程度越高;
  • 如果协方差维负,说明X,Y反向运动,协方差越小说明反向程度越高;
  • 如果两个变量相互独立,那么协方差就是0,说明两个变量不相关。

Pearson相关系数也可以看成协方差:一种剔除了两个变量量纲影响、标准化后的特殊协方差。Pearson相关系数可以反映两个变量变化时是同向还是反向,如果同向变化就为正,反向变化就为负。由于它是标准化后的协方差,因此更重要的特性来了,它消除了两个变量变化幅度的影响,而只是单纯反应两个变量每单位变化时的相似程度。

相关系数取值在-1到1之间,表征的是两个随机变量之间的线性相关关系。相关系数为0,表明两个变量之间线性无关;相关系数大于0,说明两个变量之间是正相关;相关系数小于0,代表两个变量之间负相关。如果>0.8,说明2个变量有明显线性关系,只保留一个,保留与label的皮尔逊系数较大的那个变量或者保留lightgbm AUC最大的那个;

优点:可以通过数字对变量的关系进行度量,并且带有方向性,1表示正相关,-1表示负相关,可以对变量关系的强弱进行度量,越靠近0相关性越弱。

缺点:无法利用这种关系对数据进行预测,简单的说就是没有对变量间的关系进行提炼和固化,形成模型。要利用变量间的关系进行预测,需要使用到下一种相关分析方法,回归分析。

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr#选择K个最好的特征,返回选择特征后的数据
#第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量,输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值。在此定义为计算相关系数
#参数k为选择的特征个数
SelectKBest(lambda X, Y: array(map(lambda x:pearsonr(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

特征与输出的相关系数的绝对值越大,说明对输出的影响越大,应该优先选择。

4. 基于IV值的特征选择

IV中文意思是信息价值,或者信息量,可通过woe加权求和得到,衡量自变量对应变量的预测能力。一般我们选择 IV值大于0.02的那些变量进入模型。

关于WOE和IV值的详细解释说明请看文章:https://blog.csdn.net/iqdutao/article/details/107916408

5. 基于互信息特征选择

互信息也可以称作为信息增益,互信息也是评价变量和label之间的相关性的,在进行特征选择时,我们不该把焦点放在数据关系的类型(线性关系)上,而是要考虑在已经给定另一个特征的情况下一个特征可以提供多少信息量。互信息会通过计算两个特征所共有的信息,把上述推理工程形式化表达出来。与相关性不同,它依赖的不是数据序列,而是数据的分布

from sklearn.feature_selection import SelectKBestfrom minepy import MINE#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成固定的P值0.5def mic(x, y):m = MINE()m.compute_score(x, y)return (m.mic(), 0.5)#选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: array(map(lambda x:mic(x, Y), X.T)).T, k=2).fit_transform(iris.data, iris.target)

在机器学习中,理想情况下,当互信息最大,可以认为从数据集中拟合出来的随机变量的概率分布与真实分布相同。
需要注意的是,互信息也是只能处理离散的特征。如果连续的情况,需要先离散化,计算每一对特征之间的归一互信息量。对于具有较高互信息量的特征对,我们会把其中一个特征扔掉。在进行回归的时候,我们可以把互信息量非常低的特征扔掉。对于较小的特征集合这种方式的效果或许还可以。但是,在某种程度上,这个过程会非常缓慢,计算量会以平方级别增长,因为我们要计算的是每对特征之间的互信息量。

关于互信息的详细解释说明请看文章:https://blog.csdn.net/iqdutao/article/details/107795591

6. 基于卡方检验特征选择

卡方检验是一种用途很广的计数资料的假设检验方法。它属于非参数检验的范畴,主要是比较两个及两个以上样本率( 构成比)以及两个分类变量的关联性分析。其根本思想就是在于比较理论频数和实际频数的吻合程度或拟合优度问题。它在分类资料统计推断中的应用,包括:两个率或两个构成比比较的卡方检验;多个率或多个构成比比较的卡方检验以及分类资料的相关分析等。

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2#选择K个最好的特征,返回选择特征后的数据
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)

7. 基于树模型的特征选择

树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型,来选择特征的代码如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier#GBDT作为基模型的特征选择
SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)

在实际的操作中进行特征选择,可以先将特征的相关统计信息输出,如下表,再根据特征的一些统计特性进行变量的选择。

总结

(1)对于理解数据、数据的结构、特点来说,单变量特征选择是个非常好的选择。尽管可以用它对特征进行排序来优化模型,但由于它不能发现冗余(例如假如一个特征子集,其中的特征之间具有很强的关联,那么从中选择最优的特征时就很难考虑到冗余的问题)。

(2)正则化的线性模型对于特征理解和特征选择来说是非常强大的工具。L1正则化能够生成稀疏的模型,对于选择特征子集来说非常有用;相比起L1正则化,L2正则化的表现更加稳定,由于有用的特征往往对应系数非零,因此L2正则化对于数据的理解来说很合适。由于响应变量和特征之间往往是非线性关系,可以采用basis expansion的方式将特征转换到一个更加合适的空间当中,在此基础上再考虑运用简单的线性模型。

(3)随机森林是一种非常流行的特征选择方法,它易于使用,一般不需要feature engineering、调参等繁琐的步骤,并且很多工具包都提供了平均不纯度下降方法。它的两个主要问题,1是重要的特征有可能得分很低(关联特征问题),2是这种方法对特征变量类别多的特征越有利(偏向问题)。尽管如此,这种方法仍然非常值得在你的应用中试一试。

(4)特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。

参考链接:https://www.cnblogs.com/molieren/articles/10617863.html
参考链接:https://blog.csdn.net/wang1127248268/article/details/53505078
参考链接:https://zhuanlan.zhihu.com/p/141010878
参考链接:https://blog.csdn.net/weixin_43378396/article/details/90649064
参考链接:https://www.cnblogs.com/molieren/articles/10617863.html

机器学习-特征工程中的特征选择相关推荐

  1. 机器学习-特征工程中的特征降维

    对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.由此可见,数据和特征在模型的整个开发过程中是比较重要.特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为 ...

  2. 机器学习-特征工程中的数据预处理

    对于一个机器学习问题,数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限.由此可见,数据和特征在模型的整个开发过程中是比较重要.特征工程,顾名思义,是对原始数据进行一系列工程处理,将其提炼为 ...

  3. 机器学习-特征工程中的样本不均衡处理方法

    如果你才开始学习机器学习,那么你使用过的数据集很大程度上都是简单.普通.规整的.其中一个原因就是,当你构建分类器时,样本类都是平衡的.在教学中,数据集通常是处理过的,这样才能够把注意力集中在特定算法或 ...

  4. 双样本T检验——机器学习特征工程相关性分析实战

    最近在做数据分析方面的工作,经常需要检验两组样本之间是否存在差异,所以会遇到统计学中假设检验相关的知识.在机器学习特征工程这一步,笔者最常用到的是假设检验中的卡方检验去做特征选择,因为卡方检验可以做两 ...

  5. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(五)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  6. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(四)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  7. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(三)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  8. 专栏 | 基于 Jupyter 的特征工程手册:特征选择(二)

    作者:陈颖祥.杨子晗 编译:AI有道 数据预处理后,我们生成了大量的新变量(比如独热编码生成了大量仅包含0或1的变量).但实际上,部分新生成的变量可能是多余:一方面它们本身不一定包含有用的信息,故无法 ...

  9. 机器学习实战 | 机器学习特征工程最全解读

    作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/41 本文地址:https://www.showmeai.tech/article-d ...

最新文章

  1. Python生物信息学②从PDB文件中提取蛋白序列
  2. MVC – 9.mvc整体请求流程
  3. 2018年视觉所有干货博文的分类汇总
  4. 刚安装了Fedora 33,尝尝鲜~,哈哈~~~
  5. Android Manager
  6. 0222互联网新闻 | 快手推游戏直播App“电喵直播”及工具型App光音Mulight;“AI音乐学院”完成PreA轮融资...
  7. Git 企业中常用分支管理策略
  8. 我的MYSQL学习心得(一)
  9. sudo vi ~/etc/profile 报错E212:Can't open file for writing
  10. SIP for android
  11. opengl es 实现旋转的三角形
  12. macos中xcode使用opencv,错误总结
  13. Linux谁访问这个内存,Linux中的直接内存访问
  14. 会员管理系统c语言,路西牌会员管理系统。
  15. java 中 如何sum 乘法_java 加法 乘法问题
  16. Web基础配置篇(四): Mysql的配置及使用
  17. 华为od德科面试数据算法解析 2022-3-20 关于员工工号问题
  18. 【面试题】面向对象与面向过程的区别
  19. EMC防护中的滤波电容-为什么放0.1uF和0.01uF电容
  20. adb性能测试_FPS(流畅度)

热门文章

  1. [MetalKit]14-Ray-tracing-in-a-Swift-playground5射线追踪5
  2. 基于React脚手架集成Cesium
  3. 启动Tomcat出现乱码--淇℃伅
  4. 两难!到底用 Spring BeanUtils 还是 Apache BeanUtils?
  5. Spring Boot Elasticsearch 入门
  6. 源代码遭泄露,大疆员工被罚20万,判刑半年。
  7. 从公司发展看技术人才需求
  8. 使用Nomad和OpenFaaS提供FaaS服务
  9. 10张图带你深入理解Docker容器和镜像
  10. Java集合:数组的使用