type
status
date
slug
summary
tags
category
icon
password
Property
- 最简单的方法是方差筛选。方差越大的特征,可以认为它是比较有用的。如果方差较小,比如小于1,那么这个特征可能对算法作用没有那么大。最极端的,如果某个特征方差为0,即所有的样本该特征的取值都是一样的,那么它对模型训练没有任何作用,可以直接舍弃。
- 相关系数,这个主要用于输出连续值的监督学习算法中。分别计算所有训练集中各个特征与输出值之间的相关系数,设定一个阈值,选择相关系数较大的部分特征。
- 假设检验,比如卡方检验。卡方检验可以检验某个特征分布和输出值分布之间的相关性。比粗暴的方差法好用。在sklearn中,可以使用
chi2
这个类来做卡方检验得到所有特征的卡方值与显著性水平P临界值,可以给定卡方值阈值, 选择卡方值较大的部分特征。除了卡方检验,还可以使用F检验和t检验,它们都是使用假设检验的方法,只是使用的统计分布不是卡方分布,而是F分布和t分布而已。在sklearn中,有F检验的函数f_classif
和f_regression
,分别在分类和回归特征选择时使用。
- 互信息,即从信息熵的角度分析各个特征和输出值之间的关系评分。互信息值越大,该特征和输出值之间的相关性越大,越需要保留。在sklearn中可以使用
mutual_info_classif
(分类)和mutual_info_regression
(回归)来计算各个输入特征和输出值之间的互信息。
在没有什么思路的时候,可以优先使用卡方检验和互信息来做特征选择
方差选择法
使用方差选择法,先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。使用feature_selection库的
VarianceThreshold
类来选择特征:这应该是最简单的特征选择方法了:假设某特征的特征值只有0和1,并且在所有输入样本中,95%的实例的该特征取值都是1,那就可以认为这个特征作用不大。如果100%都是1,那这个特征就没意义了。当特征值都是离散型变量的时候这种方法才能用,如果是连续型变量,就需要将连续变量离散化之后才能用,而且实际当中,一般不太会有95%以上都取某个值的特征存在,所以这种方法虽然简单但是不太好用。可以把它作为特征选择的预处理,先去掉那些取值变化小的特征,然后再从接下来提到的的特征选择方法中选择合适的进行进一步的特征选择。
单变量选择法
什么单变量选择?——选择与目标变量相关性最高的特征,剔除无关变量
单变量选择是最简单的特征选择方法之一,但有一个明显的缺点,它仅仅考虑了特征与目标变量的相关性,没有考虑特征与特征之间的相关性,所以无法剔除重复的特征。
如何测量相关性?
用统计检验(如F检验,卡方检验等)测试特征和目标变量的关联程度。
sklearn.feature_selection提供了3个接口:
- SelectKBest: 筛选k个相关性最高的特征,最常用。
- SelectPercentile: 筛选得分排名前k分位数的特征。
- GenericUnivariateSelect: 根据用户自定义评分函数进行筛选。
有3种常用的统计检验:
- f_classif:方差分析(ANOVA),适用于分类问题,特征是数值变量,目标是分类变量。
- chi2:差方分析,适用于分类问题,要求特征是计数或二元变量(正值)。
- f_regression:适用于回归问题,特征和目标变量均为数值变量。
所有检验都返回一个分值和
p-value
,分值和p-value越高表示特征与目标变量的关联程度越高score_func
里可选的参数:相关系数法
使用相关系数法,先要计算各个特征对目标值的相关系数以及相关系数的P值。用feature_selection库的
SelectKBest
类结合相关系数来选择特征:Scipy的
pearsonr
方法能够同时计算相关系数和p-valuePearson
相关系数的一个明显缺陷是,作为特征排序机制,只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson
相关性也可能会接近0如果仅仅根据相关系数这个值来判断的话,有时候会具有很强的误导性,如Anscombe’s quartet
Anscombe’s quartet
1973年,统计学家F.J. Anscombe构造出了四组奇特的数据。它告诉人们,在分析数据之前,描绘数据所对应的图像有多么的重要。
这四组数据中, 值的平均数都是9.0, 值的平均数都是7.5; 值的方差都是10.0, 值的方差都是3.75;它们的相关度都是0.816,线性回归线都是 。单从这些统计数字上看来,四组数据所反映出的实际情况非常相近,而事实上,这四组数据有着天壤之别。
把它们描绘在图表中,你会发现这四组数据是四种完全不同的情况。第一组数据是大多人看到上述统计数字的第一反应,是最“正常”的一组数据;第二组数据所反映的事实上是一个精确的二次函数关系,只是在错误地应用了线性模型后,各项统计数字与第一组数据恰好都相同;第三组数据描述的是一个精确的线性关系,只是这里面有一个异常值,它导致了上述各个统计数字,尤其是相关度值的偏差;第四组数据则是一个更极端的例子,其异常值导致了平均数、方差、相关度、线性回归线等所有统计数字全部发生偏差。
距离相关系数 (Distance correlation)
距离相关系数是为了克服Pearson相关系数的弱点而生的。在 和 这个例子中,即便Pearson相关系数是0,也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是0,那么就可以说这两个变量是独立的
卡方检验
经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于且因变量等于的样本频数的观察值与期望的差距,构建统计量:
不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用feature_selection库的
SelectKBest
类结合卡方检验来选择特征:互信息法和最大信息系数(MIC)
经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息计算公式如下:
如果它俩独立 ,那么 KL 距离值为0,也就是 和 不相关了,可以去除;相反,如果两者密切相关,那么 MI 值会很大。在对MI进行排名后,最后剩余的问题就是如何选择个值(前个)
使用feature_selection库的
SelectKBest
类结合互信息来选择特征想把互信息直接用于特征选择其实不是太方便:
- 它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较
- 对于连续变量的计算不是很方便(和都是集合, 都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感
最大信息系数克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在[0,1]。
minepy
提供了MIC功能。反过头来看 这个例子,MIC算出来的互信息值为1(最大的取值)。
使用feature_selection库的
SelectKBest
类结合最大信息系数法来选择特征:MIC的统计能力遭到了一些质疑,当零假设不成立时,MIC的统计就会受到影响。在有的数据集上不存在这个问题,但有的数据集上就存在这个问题。
尽管有MIC和距离相关系数在了,但当变量之间的关系接近线性相关的时候,Pearson相关系数仍然是不可替代的。第一、Pearson相关系数计算速度快,这在处理大规模数据的时候很重要。第二、Pearson相关系数的取值区间是[-1,1],而MIC和距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。
单变量选择小结
对于分类问题(离散),可采用:
卡方检验,f_classif, mutual_info_classif
对于回归问题(连续),可采用:
皮尔森相关系数,f_regression, mutual_info_regression,最大信息系数,Spearman 等级系数(非线性)
- 卡方(Chi2)检验:卡方检验是检验定性自变量对定性因变量的相关性
- 检验: 用于评估两个随机变量的线性相关性
- Pearson相关系数 (Pearson Correlation): 衡量的是变量之间的线性相关性,结果的取值区间为 ,-1表示完全的负相关,+1表示完全的正相关, 0 表示没有线性相关
- 互信息和最大信息系数 (Mutual information and maximal information coefficient (MIC)
- 距离相关系数 (Distance Correlation): 对P系数的改良
- 基于模型的特征排序 (Model based ranking):直接针对每个单独的特征和标签基于机器学习算法建立预测模型,交叉验证计算
- Relief方法 (机器学习书) : 给定训练集,对每个特征,同类的“猜中近邻” 与不同类的“猜错近邻” , 计算其“相关统计量”,设定阈值,从大到小选取“相关统计量” (和大于阈值)