特征选择

特征选择是特征工程里的一个重要问题,其目标是寻找最优特征子集。特征选择的目的有如下三个:

  1. 简化模型,使模型更易于研究人员和用户理解。
  2. 改善性能。节省存储和计算开销。
  3. 改善通用性,降低过拟合的风险。

特征选择的一般流程


主要分为产生过程,评估过程,停止条件和验证过程。

当特征数量很大的时候, 这个搜索空间会很大,如何找最优特征还是需要一些经验结论。

具体特征选择方法

分为三大类:

  1. Filter:过滤法,按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数,选择特征。
  2. Wrapper:包装法,根据目标函数(通常是预测效果评分),每次选择若干特征,或者排除若干特征。
  3. Embedded:嵌入法,先使用某些机器学习的算法和模型进行训练,得到各个特征的权值系数,根据系数从大到小排序选择特征。类似于Filter方法,但是是通过训练来确定特征的优劣。

过滤特征选择

过滤特征选择法的想法是针对每个特征 x_i ,i 从 1 到 n ,计算 x_i 相对于类别标签 y 的信息量 S(i) ,得到 n 个结果,然后将 n 个 S(i) 按照从大到小排序,输出前 k 个特征。显然,这样复杂度大大降低。那么关键的问题就是使用什么样的方法来度量 S(i) ,我们的目标是选取与 y 关联最密切的一些 特征x_i 。

Pearson相关系数

皮尔森相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为 [-1,1] , -1 表示完全的负相关(这个变量下降,那个就会上升), +1 表示完全的正相关, 0 表示没有线性相关。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的pearsonr方法能够同时计算相关系数和p-value,


Pearson相关系数的一个明显缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近 0 。

卡方验证

什么是卡方检验:
卡方检验就是检验两个变量之间有没有关系。
以运营为例:
卡方检验可以检验男性或者女性对线上买生鲜食品有没有区别;
不同城市级别的消费者对买SUV车有没有什么区别;
如果有显著区别的话,我们会考虑把这些变量放到模型或者分析里去。

注意:卡方检验针对分类变量。

置信度的话,我们按照我们自己意愿挑选,一般我们会挑90%或者95%。




卡方检验就是统计样本的实际观测值与理论推断值之间的偏离程度,实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等时,卡方值就为0,表明理论值完全符合。

不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。用sklearn中feature_selection库的SelectKBest类结合卡方检验来选择特征的代码如下:


sklearn.feature_selection模块中的类可以用于样本集中的特征选择/维数降低,以提高估计器的准确度分数或提高其在非常高维数据集上的性能

互信息和最大信息系数

经典的互信息也是评价定性自变量对定性因变量的相关性的,互信息公式如下:


当 x_i 是0/1离散值的时候,这个公式如上。很容易推广到 x_i 是多个离散值的情况。这里的 p(x_i,y) , p(x_i) 和 p(y) 都是从训练集上得到的。

MI 衡量的是 x_i 和 y 的独立性。如果它俩独立 P(x_i,y)=p(x_i)p(y) ,那么 KL 距离值为0,也就是 x_i 和 y 不相关了,可以去除 x_i 。相反,如果两者密切相关,那么 MI 值会很大。

在对 MI 进行排名后,最后剩余的问题就是如何选择 k 个值(前 k 个 x_i )。我们继续使用交叉验证的方法,将 k 从 1 扫描到 n ,取最大的 F 。

想把互信息直接用于特征选择其实不是太方便:1、它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较;2、对于连续变量的计算不是很方便( X 和 Y 都是集合, x_i, y 都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感。

最大信息系数克服了这两个问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在 [0,1] 。minepy提供了MIC功能。

如y=x^2 这个例子,MIC算出来的互信息值为1(最大的取值)。代码如下:

距离相关系数

距离相关系数是为了克服Pearson相关系数的弱点而生的。在 x 和 x^2 这个例子中,即便Pearson相关系数是 0 ,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是 0 ,那么我们就可以说这两个变量是独立的。

尽管有MIC和距离相关系数在了,但当变量之间的关系接近线性相关的时候,Pearson相关系数仍然是不可替代的。第一、Pearson相关系数计算速度快,这在处理大规模数据的时候很重要。第二、Pearson相关系数的取值区间是[-1,1],而MIC和距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。

方差选择法

过滤特征选择法还有一种方法不需要度量特征 x_i 和类别标签 y 的信息量。这种方法先要计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征。

例如,假设我们有一个具有布尔特征的数据集,并且我们要删所有01特征中出现0的概率超过80%的特征。布尔特征是伯努利随机变量,这些变量的方差由下式给出:


VarianceThreshold是特征选择的简单基线方法。它删除方差不符合某个阈值的所有特征。默认情况下,它会删除所有零差异特征,即所有样本中具有相同值的特征。代码如下:

输出结果:

如预期的那样,VarianceThreshold已经删除了第一列,其具有 p=5/6>0.8 包含零的概率。

包装(wrapper)特征选择

Wrapper这里指不断地使用不同的特征组合来测试学习算法进行特征选择。先选定特定算法, 一般会选用普遍效果较好的算法, 例如Random Forest, SVM, kNN等等。

前向搜索

前向搜索说白了就是每次增量地从剩余未选中的特征选出一个加入特征集中,待达到阈值或者 n 时,从所有的 F 中选出错误率最小的。过程如下:

  1. 初始化特征集 F 为空。
  2. 扫描 i 从 1 到 n如果第 i 个特征不在 F 中,那么特征 i 和F 放在一起作为 F_i (即取并集,在只使用 F_i 中特征的情况下,利用交叉验证来得到 F_i 的错误率。
  3. 从上步中得到的 n 个 F_i 中选出错误率最小的 F_i ,更新 F 为 F_i 。
  4. 如果 F 中的特征数达到了 n 或者预定的阈值(如果有的话),那么输出整个搜索过程中最好的 ;若没达到,则转到 2,继续扫描。

后向搜索

既然有增量加,那么也会有增量减,后者称为后向搜索。先将 F 设置为 {1,2,…,n} ,然后每次删除一个特征,并评价,直到达到阈值或者为空,然后选择最佳的 F 。

这两种算法都可以工作,但是计算复杂度比较大。时间复杂度为
O(n+(n-1)+(n-2)+…+1)=O(n^2)

递归特征消除法

递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练。使用feature_selection库的RFE类来选择特征的代码如下:

嵌入(Embedded)特征选择

基于惩罚项的特征选择法

通过L1正则项来选择特征:L1正则方法具有稀疏解的特性,因此天然具备特征选择的特性,但是要注意,L1没有选到的特征不代表不重要,原因是两个具有高相关性的特征可能只保留了一个,如果要确定哪个特征重要应再通过L2正则方法交叉检验。

基于学习模型的特征排序

这种方法的思路是直接使用你要用的机器学习算法,针对每个单独的特征和响应变量建立预测模型。假如某个特征和响应变量之间的关系是非线性的,可以用基于树的方法(决策树、随机森林)、或者扩展的线性模型等。基于树的方法比较易于使用,因为他们对非线性关系的建模比较好,并且不需要太多的调试。但要注意过拟合问题,因此树的深度最好不要太大,再就是运用交叉验证。通过这种训练对特征进行打分获得相关性后再训练最终模型。

在波士顿房价数据集上使用sklearn的随机森林回归给出一个单变量选择的例子: