合适数量的特征变量是机器学习模型训练的前提。当维度高的时候,为保证样本空间的覆盖度,对样本量要求呈指数增长,或者反过来说,在样本量一定的情形下,随着维度空间的增长,样本在空间分布越来越稀疏,很多基于近邻的算法变得不再有效,训算效率、模型性能也会大幅度下降,这种现象被称为维度灾难(the curse of dimensionality) [27] 。降低这种挑战的一种方法就是特征选择,消除无关特征和冗余特征。
特征选择的主要作用是增强对特征量和目标量关系的理解,降低模型学习的成本,主要手段是降维、减少无关特征和冗余特征。但是特征选择不像PCA(Principal Component Analysis,主成分分析)、SVD(Singular Value Decomposition,奇异值分解)等算法生成新组合特征,而是从原有特征中进行选择或排除,不涉及原有特征的变换。
特征选择包括4个环节:
1)子集生成:生成候选的特征子集;
2)子集评价:评价特征子集的好坏;
3)停止条件:决定什么时候该停止;
4)验证过程:特征子集是否有效。
其中最关键的环节就是子集生成(具体指子集生成制定的搜索策略)环节和子集评价环节。因为停止条件往往与评价函数相关,当评价函数值达到某个阈值后就可停止搜索。而验证过程是在测试数据集上评价选出来的特征子集的有效性,是一种度量方法,本身并不是特征选择的一部分,需要使用不同的测试集、学习方法验证。最大影响到特征选择效果的就是使用一系列搜索策略,为评价函数提供特征子集的子集生成环节;还有在不同应用环境下,对产生的子集(一个或多个)好坏程度进行评价,来产生最优子集的子集评价过程,如图2-19所示。
图2-19 子集生成方法
Dash [28] 等人总结的特征选择方法如图2-20所示,子集的生成过程本质就是一个搜索的过程,这个搜索过程主要分为3类。
图2-20 特征选择方法
1)完全搜索:根据评价函数做完全搜索,完全搜索主要有两种:穷举搜索和非穷举搜索。
2)启发式搜索:根据一些启发式规则在每次迭代时,决定剩下的特征是应该被选择还是被拒绝,这种方法很简单并且速度很快。
3)随机搜索:基于设置参数,采用随机选择特征,提高获得全局最优的可能性,复杂度也比完全搜索要低。
1.完全搜索
完全搜索分为穷举(Exhaustive)搜索与非穷举(Non-Exhaustive)搜索两类。穷举搜索枚举了所有的特征组合,时间复杂度是 O (2 n ),实用性不高,还可能导致过度拟合和参数估计的高方差问题。在穷举搜索的基础上加入限制分支,进行分支修剪的分支限界(Branch and Bound)搜索是一种改进办法,避免了穷举搜索的高复杂度和过拟合。除此之外还有集束搜索(Beam Search)和最佳优先搜索(Best First Search)等办法。
2.启发式搜索
当数据量庞大时,可以选用起点为空集的前向搜索或者起点是全集的后向搜索来降低复杂度,这种方法被称为启发式搜索。也有前后方向同时进行,每次加入 m 个特征删除 n 个特征的双向搜索。
R的leaps包中regsubsets()函数提供了这种搜索策略的方法,如下例子,前向和后向搜索可以用method=“forward”和method=“backword”。method=“exhaustive”全局序列搜索。R的MASS包的函数stepAIC()可以根据AIC进行双向选择。此外,基础包中step()函数也可以用来进行前向、后向和双向选择。更多的包的介绍和使用可以查看《应用预测建模》 [29] 一书(caret、stats、rms、klaR等)。
3.随机搜索
启发式策略计算量可控,但容易落到局部最优解。前向搜索本质是贪婪的,不会对之前的结果进行评估,后向搜索又会在同一数据上重复地去做统计假设检验,前后序列搜索只能应用于比较小型的数据集。为此,提出了随机搜索策略,早期较“差”的解也有机会继续参与后续组合中,避免过早陷入局部最优。常用的随机搜索方法有模拟退火算法(Simulated Annealing,SA)算法 [30] 、遗传算法(Genetic Algorithm,GA) [30] 、蚁群优化算法(Ant Colony Optimization,ACO)算法、差分进化(Differential Evolution,DE)算法等。
使用模拟退火算法可以使用GenGA函数,GenSA(par,fn,lower,upper,control=list(),…)中参数par为初始值,fn为最小化函数,lower和upper确定上下界,control代表控制算法行为的列表。R中常用的实现遗传算法的包有mcga包、genalg包、rgenoud包等。
子集评价包括评价准则和评价方法两个方面。评价准则是对特征选择的评估标准,它直接影响到子集的结果。如距离度量使用的Relief、ReliefF算法等;一致性度量使用的Foucus、LVF算法等。
根据特征选择、模型训练的融合方式,评价方法主要分为如图2-21所示的3类。
1)过滤(Filter)法:如图2-21a所示,先进行特征选择,然后去训练模型,特征选择的过程与面模型训练无关。相当于先对于特征进行过滤操作,然后用特征子集来训练分类器。
2)绕封(Wrapper)法:如图2-21b所示,直接把最后要使用的模型性能作为特征选择的评价准则,对于特定的分类器选择最优的特征子集。从最终模型的性能来看,绕封法特征选择比过滤法特征选择更好,但需要多次训练模型,因此计算开销较大。
3)嵌入(Embedding)法:在前两种特征选择方法中,特征选择过程和模型训练过程是有明显分别的两个过程。嵌入式特征选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择,如图2-21c所示。
图2-21 三种子集评价方法
这几种评价方法本身是独立的,在具体应用中可以灵活融合,例如可以先使用过滤法进行特征选择,去掉不相关的特征,降低特征维度,然后利用绕封法进行特征选择,甚至可以在过程中再将特征选择与分类器学习融合为一个过程(即嵌入法)。
1.过滤法
过滤法在建模之前先对预测变量进行评估,且基于评估值,选出部分变量用于建模,在一定程度上优化了计算时间。因此过滤法较为快速,只需要基础统计知识,但是对特征之间的组合效应难以挖掘。
这里请思考一个问题,为什么过滤法对随机森林无效,却对树模型有效?是因为传统决策树采用贪婪算法遍历所有特征,计算纯度后分枝(俗话说,一旦错过就没有机会),而随机森林却是随机选择特征进行计算和分枝。
(1)移除低方差特征
移除低方差特征的方法会删除方差未达到某个阈值的所有要素。在默认的情况下,将删除所有的零方差特征,也就是在所有样本中具有相同值的特征。
可以应用mlr包进行低方差特征移除,首先是通过makeClassifTask()创建一个用于分类的Task,其他回归等目的有相应的创建函数。通过removeConstantFeatures()函数丢弃零变量,generateFilterValuesData()函数可选择相应的method进行特征重要性排序(这里运用信息增益衡量),并可绘图(如图2-22所示)实现,下面例子中还需要FSelector包支撑,需要配置Java环境。
图2-22 绘图实现
(2)单变量特征选择
单变量过滤方法主要考虑的是如何去除数据中冗余的特征,而忽略了特征之间的相关性。常见的过滤方法如下。
① 卡方检验;
② Pearson相关系数(Pearson Correlation);
③ Fisher得分;
④ 假设检验;
⑤ 互信息;
⑥ 最小冗余最大相关性;
⑦ 相关特征选择;
⑧ 最大信息系数(MIC);
⑨ 基于模型的特征排序方法。
1)卡方检验:经典的卡方检验是检验定性自变量对定性因变量的相关性,考虑自变量等于 i 且因变量等于 j 的样本频数的观察值与期望的差距,这个统计量的含义简而言之就是自变量对因变量的相关性。
式中, A 为实际值; T 为理论值;计算结果体现了相关性差异程度。
实际观测值与理论推断值之间的偏离程度就决定卡方值的大小,如果卡方值越大,二者偏差程度越大;反之,二者偏差越小;若两个值完全相等,卡方值就为0,表明理论值完全符合。
2)互信息:经典的互信息也是评价定性自变量对定性因变量的相关性的,可以看成是一个随机变量中包含的关于另一个随机变量的信息量。
3)Pearson相关系数:Pearson相关系数是一种最简单的,能帮助理解特征和响应变量之间关系的方法,该方法衡量的是变量之间的线性相关性,结果的取值区间为[-1,1],-1表示完全的负相关,+1表示完全的正相关,0表示没有线性相关。Pearson相关系数衡量连续变量的线性相关性,如果只关心两个变量的单调关系(也就是说两个变量一致变化,但不一定恒定),可以采用Spearman相关系数(也称为秩相关系数),对于多列等级变量,可以用Kendall相关系数。R语言基础包中的cor()函数提供了这些函数的支持。
(3)Relief算法
Relief算法最早由Kira提出,最初局限于二分类问题。Relief算法是一种特征权重算法(Feature weighting algorithms),根据各个特征和类别的相关性赋予特征不同的权重,权重小于某个阈值的特征将被移除。算法从训练集 D 中随机选择一个样本 R ,然后从和 R 同类的样本中寻找最近邻样本 H ,称为Near Hit,从和 R 不同类的样本中寻找最近邻样本 M ,称为Near Miss,然后根据以下规则更新每个特征的权重:如果 R 和Near Hit在某个特征上的距离小于 R 和Near Miss上的距离,则说明该特征对区分同类和不同类的最近邻是有益的,则增加该特征的权重;反之,如果 R 和Near Hit在某个特征的距离大于 R 和Near Miss上的距离,说明该特征对区分同类和不同类的最近邻起负面作用,则降低该特征的权重。以上过程重复 m 次,最后得到各特征的平均权重。特征的权重越大,表示该特征的分类能力越强,反之,表示该特征分类能力越弱。Relief算法的运行时间随着样本的抽样次数 m 和原始特征个数 N 的增加线性增加,因而运行效率非常高。为了处理多分类问题,1994年Kononeill对其进行了扩展,得到了ReliefF算法。
Relief统计量的计算可以使用CORElearn包,attrEval()函数能计算几个不同版本的Relief值(使用estimator选项),该函数也能用来计算其他分值,如增益比、基尼系数等。
2.绕封法
绕封法根据目标函数(通常是预测效果评分),每次选择若干个特征,或者排除若干个特征。它可以直接面向算法优化,不需要过多的评价准则,但是占用了庞大的搜索空间,并且需要定义合适的搜索策略,搜索策略在上文中有介绍。
绕封法使用的评价方法为递归特征消除(Recursive Feature Elimination,RFE)。递归消除特征法使用一个基模型来进行多轮训练,每轮训练后,移除若干权值系数的特征,再基于新的特征集进行下一轮训练。
1)用算法模型反复迭代,利用训练的数据去预测,选择可以返回特征权重的算法(随机森林,逻辑回归);
2)反复迭代,每一次去除一个特征,去除一个用剩下的特征再次训练;
3)可以用一个模型来进行特征选择,用另一个模型来做最终的预测。
下例是在Pima Indians Diabetes数据集上提供RFE方法的例子。随机森林算法用于每一轮迭代中评估模型的方法,验证方法使用交叉验证,默认为10折交叉。该算法用于探索所有可能的特征子集。从图2-23中可以看出,当使用4个或者6个特征时即可获取与最高性能相差无几的结果。
图2-23 绘图结果
3.嵌入法
在前两种特征选择方法中,特征选择过程和模型训练过程是有明显分别的两个过程。而嵌入式特征选择是将特征选择过程与模型训练过程融为一体,两者在同一个优化过程中完成,嵌入式选择的实例是LASSO和Ridge Regression。决策树算法在构建树的同时也可以看作进行了特征选择,在冠以上也可以算作嵌入式方法。
下面给对带L1惩罚项的逻辑回归作为基模型的特征选择(LASSO回归)方法给出一个简单例子:这里用到了glmnet包,其中alpha参数为0是LASSO回归,为1是Loss回归,其他的包还有liblinear等。
在特征选择中,有3种常见的子集选择策略:
1)过滤法:快速,更多以统计知识为基础,但特征之间的组合效应难以挖掘,比较粗糙。
2)绕封法:直接面向算法优化,但是需要庞大的搜索空间,并且需要制定合适的搜索策略。
3)嵌入法:效果和速度都很明显,但是需要深厚的背景知识来进行合适的参数设置。
过滤法更快速,但更粗糙。绕封法和嵌入法更精确,比较适合具体到算法去调整,但计算量比较大,运行时间长。当数据量很大的时候,优先使用方差过滤和互信息法,之后再用其他特征选择方法。使用逻辑回归时,优先使用嵌入法。使用支持向量机时,优先使用绕封法。