1. 背景
1.1 问题
在机器学习的实际应用中,特征数量可能较多,其中可能存在不相关的特征,特征之间也可能存在相关性,容易导致如下的后果:
(1) 特征个数越多,分析特征、训练模型所需的时间就越长,模型也会越复杂。
(2) 特征个数越多,容易引起“维度灾难”,其推广能力会下降。
(3) 特征个数越多,容易导致机器学习中经常出现的特征稀疏的问题,导致模型效果下降。
(4)对于模型来说,可能会导致不适定的情况,即是解出的参数会因为样本的微小变化而出现大的波动。
特征选择,能剔除不相关、冗余、没有差异刻画能力的特征,从而达到减少特征个数、减少训练或者运行时间、提高模型精确度的作用。
1.2 如何做特征选择
特征选择,即是指从全部特征中选取一个特征子集,使得使构造出来的模型效果更好,推广能力更强。如何做特征选择呢,如果要从全部特征中选择一个最优的子集,使得其在一定的评价标准下,在当前训练和测试数据上表现最好。
从这个层面上理解,特征选择可以看作三个问题:
(1)从原始特征集中选出固定数目的特征,使得分类器的错误率最小这是一个无约束的组合优化问题;
(2)对于给定的允许错误率,求维数最小的特征子集,这是一种有约束的最优化问题;
(3)在错误率和特征子集的维数之间进行折中。
上述3个问题都是一个NP难问题,当特征维度较小时,实现起来可行,但是当维度较大时,实现起来的复杂度很大,所以实际应用中很难实用。上述三种特征选择都属十NP难的问题。由于求最优解的计算量太大,需要在一定的时间限制下寻找能得到较好次优解的算法。以下介绍对次优解的求解过程。
2. 特征选择的一般过程
特征选择的一般过程可用图1表示。首先从特征全集中产生出一个特征子集,然后用评价函数对该特征子集进行评价,评价的结果与停止准则进行比较,若满足停止准则就停止,否则就继续产生下一组特征子集,继续进行特征选择。选出来的特征子集一般还要验证其有效性。
综上所述,特征选择过程一般包括:特征子集产生过程,评价函数,停止准则,验证过程,这4个部分。
特征子集产生过程( Generation Procedure )
采取一定的子集选取办法,为评价函数提供特征子集。根据搜索过程的方法的不同,可以将特征选择分为穷举、启发式、随机几种方法。
以上几种方法不改变特征的原始属性,而有些方法通过对特征进行空间变换,去除相关性。比如PCA、傅立叶变换、小波变换等.
评价函数( EvaluationFunction )
评价函数是评价一个特征子集好坏程度的一个准则。评价函数的设计在不同的应用场景下会不同,比如有的会根据其分布是否均匀判断,或者看对最终模型的效果进行判断。每种评价函数各有优劣,所以需要根据实际情况进行选择。根据不同的评价准则,可以分为:筛选器模型、封装器模型以及混合模型。过滤器模型是将特征选择作为一个预处理过程,利用数据的内在特性对选取的特征子集进行评价,独立于学习算法。而封装器模型则将后续学习算法的结果作为特征评价准则的一部分。根据评价函数的不同(与采用的分类方法是否关联),可以将特征选择分为独立性准则、关联性度量。
筛选器通过分析特征子集内部的特点来衡量其好坏。筛选器一般用作预处理,与分类器的选择无关。筛选器的原理如下图1:
图1. Filter原理(RicardoGutierrez-Osuna 2008 )
封装器实质上是一个分类器,封装器用选取的特征子集对样本集进行分类,分类的精度作为衡量特征子集好坏的标准。封装器的原理如图2所示。
图2. Wrapper原理(RicardoGutierrez-Osuna 2008 )
停止准则( StoppingCriterion )
停止准则是与评价函数相关的,当评价函数值达到某个阈值后就可停止搜索。比如对于独立性准则,可以选择样本间平均间距最大;对于关联性度量,可以选择使得分类器的准确召回最高作为准则。
验证过程(Validation Procedure )
度量测试数据集上验证选出来的特征子集的有效性。最好采取与前期选择方法不相关的度量方法,这样可以减少其间的耦合。
图3特征选择的过程 ( M.Dash and H. Liu 1997 )
这几个过程中的不同方法可以看作一种组件,分别进行组合。比如可以采取启发式特征筛选方法,结合相关性度量作为评价函数等。
3. 特征子集产生过程
产生过程是搜索特征子空间的过程。搜索的算法分为完全搜索(Complete),启发式搜索(Heuristic),随机搜索(Random)3大类,如图4所示。
图4 特征子集搜寻过程分类
当然,每种方法都不是互斥的,也可以将多种方法结合起来使用,取长补短。下面对常见的搜索算法进行简单介绍。
3.1完全搜索(complete)
完全搜索分为穷举搜索(Exhaustive)与非穷举搜索(Non-Exhaustive)两类。完全搜索部分考虑特征之间的相关性,从而能更好地找到最优集合。
A. 广度优先搜索( Breadth First Search )
算法描述:广度优先遍历特征子空间。
Step1:首先将根节点放入队列中。
Step2:从队列中取出第一个节点,并检验它是否为目标。
substep:如果找到目标,则结束搜寻并回传结果。
substep:否则将它所有尚未检验过的直接子节点加入队列中。
Step3:若队列为空,表示所有特征都检查过了。结束搜寻并回传「找不到目标」。
Step4:重复step2。
算法评价:枚举了所有的特征组合,属于穷举搜索,时间复杂度是O(2n),实用性不高。
B. 分支限界搜索( Branch and Bound )
算法描述:在穷举搜索的基础上加入分支限界。例如:若断定某些分支不可能搜索出比当前找到的最优解更优的解,则可以剪掉这些分支。
C. 定向搜索(Beam Search )
算法描述:首先选择N个得分最高的特征作为特征子集,将其加入一个限制最大长度的优先队列,每次从队列中取出得分最高的子集,然后穷举向该子集加入1个特征后产生的所有特征集,将这些特征集加入队列。
D. 最优优先搜索( Best First Search )
算法描述:与定向搜索类似,唯一的不同点是不限制优先队列的长度。
3.2启发式搜索(heuristic)
启发式搜索更多地采用贪心的思想,某些算法没有考虑特征之间的相关性,而单纯考虑单个特征对最终结果的影响,然而现实中的特征可能存在各种相关性。某些算法也从这些方面进行改进,比如增L去R选择算法,序列浮动选择。
A. 序列前向选择( SFS , Sequential Forward Selection )
算法描述:特征子集X从空集开始,每次选择一个特征x加入特征子集X,使得特征函数J( X)最优。简单说就是,每次都选择一个使得评价函数的取值达到更优的特征加入,是一种简单的贪心算法。
算法评价:缺点是只能加入特征而不能去除特征。例如:特征A完全依赖于特征B与C,可以认为如果加入了特征B与C则A就是多余的。假设序列前向选择算法首先将A加入特征集,然后又将B与C加入,那么特征子集中就包含了多余的特征A。
B. 序列后向选择( SBS , Sequential Backward Selection )
算法描述:从特征全集O开始,每次从特征集O中剔除一个特征x,使得剔除特征x后评价函数值达到最优。
算法评价:序列后向选择与序列前向选择正好相反,它的缺点是特征只能去除不能加入。
另外,SFS与SBS都属于贪心算法,容易陷入局部最优值。
C. 双向搜索( BDS , Bidirectional Search )
算法描述:使用序列前向选择(SFS)从空集开始,同时使用序列后向选择(SBS)从全集开始搜索,当两者搜索到一个相同的特征子集C时停止搜索。
双向搜索的出发点是 。如下图所示,O点代表搜索起点,A点代表搜索目标。灰色的圆代表单向搜索可能的搜索范围,绿色的2个圆表示某次双向搜索的搜索范围,容易证明绿色的面积必定要比灰色的要小。
图5. 双向搜索
D. 增L去R选择算法( LRS , Plus-L Minus-R Selection )
该算法有两种形式:
<1>算法从空集开始,每轮先加入L个特征,然后从中去除R个特征,使得评价函数值最优。( L> R )
<2> 算法从全集开始,每轮先去除R个特征,然后加入L个特征,使得评价函数值最优。( L< R )
算法评价:增L去R选择算法结合了序列前向选择与序列后向选择思想, L与R的选择是算法的关键。
E. 序列浮动选择( Sequential Floating Selection )
算法描述:序列浮动选择由增L去R选择算法发展而来,该算法与增L去R选择算法的不同之处在于:序列浮动选择的L与R不是固定的,而是“浮动”的,也就是会变化的。
序列浮动选择根据搜索方向的不同,有以下两种变种。
<1>序列浮动前向选择( SFFS, Sequential Floating Forward Selection )
算法描述:从空集开始,每轮在未选择的特征中选择一个子集x,使加入子集x后评价函数达到最优,然后在已选择的特征中选择子集z,使剔除子集z后评价函数达到最优。
<2>序列浮动后向选择( SFBS, Sequential Floating Backward Selection )
算法描述:与SFFS类似,不同之处在于SFBS是从全集开始,每轮先剔除特征,然后加入特征。
算法评价:序列浮动选择结合了序列前向选择、序列后向选择、增L去R选择的特点,并弥补了它们的缺点。
F. 决策树( Decision Tree Method , DTM)
算法描述:在训练样本集上运行C4.5或其他决策树生成算法,待决策树充分生长后,再在树上运行剪枝算法。则最终决策树各分支处的特征就是选出来的特征子集了。决策树方法一般使用信息增益作为评价函数。
3.3 随机算法(random)
A. 随机产生序列选择算法(RGSS, Random Generation plus Sequential Selection)
算法描述:随机产生一个特征子集,然后在该子集上执行SFS与SBS算法。
算法评价:可作为SFS与SBS的补充,用于跳出局部最优值。
B. 模拟退火算法( SA, Simulated Annealing )
算法评价:模拟退火一定程度克服了序列搜索算法容易陷入局部最优值的缺点,但是若最优解的区域太小(如所谓的“高尔夫球洞”地形),则模拟退火难以求解。
C. 遗传算法( GA, Genetic Algorithms )
算法描述:首先随机产生一批特征子集,并用评价函数给这些特征子集评分,然后通过交叉、突变等操作繁殖出下一代的特征子集,并且评分越高的特征子集被选中参加繁殖的概率越高。这样经过N代的繁殖和优胜劣汰后,种群中就可能产生了评价函数值最高的特征子集。
随机算法的共同缺点:依赖于随机因素,有实验结果难以重现。
3.4 特征变换方法
A. PCA
PCA(Principal ComponentAnalysis),中文名为主成份变换,是一种坐标变换的方法,可以去除冗余特征。
具体特征变换过程中,去掉较小的特征值,从而达到去噪、去除相关性和特征减少的目的。
B. 小波变换
小波也是一种特征空间变换的方法,相较于傅立叶变换,小波变换能更好地适应剧烈的变换。
4. 评价函数
评价函数的作用是评价产生过程所提供的特征子集的好坏。
4.1 独立准则
独立准则通常应用在过滤器模型的特征选择算法中,试图通过训练数据的内在特性对所选择的特征子集进行评价,独立于特定的学习算法。通常包括:距离度置、信息度量,关联性度量和一致性度量。
在做比较通用的特征选择方法时,建议采用这种方法,因为这是独立于特定机器学习算法的,适用于大多数后续机器学习方法。
4.2关联性度量
关联准则通常应用在封装器模型的特征选择算法中,先确定一个学习算法并且利用机器学习算法的性能作为评价准则。对于特定的学习算法来说,通常可以找到比过滤器模型更好的特征子集,但是需要多次调用学习算法,一般时间开销较大,并且可能不适介其它学习算法。
在我们做模式分类算法时,可以根据自己的实际情况,采用关联性度量方法,这样能更好地和我们的分类方法相结合,通常能找到比较好的子集。
综上,两种种评价函数的优缺点和适用情况总结如下:
方法 | 独立性准则 | 关联性度量 |
---|---|---|
优点 | 通用,独立于特定算法 | 对于关联的分类算法可能是最优的 |
缺点 | 效果一般 | 对其他算法不适用 |
适用情况 |
4.3 常见的评价函数
A. 卡方检验
卡方检验最基本的思想就是通过观察实际值与理论值的偏差来确定理论的正确与否.具体做的时候常常先假设两个变量确实是独立的(“原假设”),然后观察实际值(观察值)与理论值(这个理论值是指“如果两者确实独立”的情况下应该有的值)的偏差程度,如果偏差足够小,我们就认为误差是很自然的样本误差,是测量手段不够精确导致或者偶然发生的,两者确确实实是独立的,此时就接受原假设;如果偏差大到一定程度,使得这样的误差不太可能是偶然产生或者测量不精确所致,我们就认为两者实际上是相关的,即否定原假设,而接受备择假设.
理论值为E,实际值为x,偏差程度的计算公式为:
这个式子就是开方检验使用的差值衡量公式.当提供了数个样本的观察值x1,x2,……xi,……xn之后,代入到式中就可以求得开方值,用这个值与事先设定的阈值比较,如果大于阈值(即偏差很大),就认为原假设不成立,反之则认为原假设成立.[请参考我的另外一篇卡方检验的普及文章]
B. 相关性( Correlation)
运用相关性来度量特征子集的好坏是基于这样一个假设:好的特征子集所包含的特征应该是与分类的相关度较高(相关度高),而特征之间相关度较低的(冗余度低)。
可以使用线性相关系数(correlationcoefficient) 来衡量向量之间线性相关度。
C. 距离(Distance Metrics )
运用距离度量进行特征选择是基于这样的假设:好的特征子集应该使得属于同一类的样本距离尽可能小,属于不同类的样本之间的距离尽可能远。同样基于此种思想的有fisher判别分类反法。
常用的距离度量(相似性度量)包括欧氏距离、标准化欧氏距离、马氏距离等。
D. 信息增益( Information Gain )
假设存在离散变量Y,Y中的取值包括{y1,y2,….,ym} ,yi出现的概率为Pi。则Y的信息熵定义为:
信息熵是对不确定性的一种描述。具有如下特性:若集合Y的元素分布不均,则其信息熵越小;若Y分布越平均,则其信息熵越大。在极端的情况下:若Y只能取一个值,即P1=1,则H(Y)取最小值0;反之若各种取值出现的概率都相等,即都是1/m,则H(Y)取最大值log2m。
对于一个特征t,系统有它和没它的时候信息量各是多少,两者的差值就是这个特征给系统带来的信息量.有它即信息熵,无它则是条件熵.
条件熵:计算当一个特征t不能变化时,系统的信息量是多少.
对于一个特征X,它可能的取值有n多种(x1,x2,……,xn),计算每个值的条件熵,再取平均值.
在文本分类中,特征词t的取值只有t(代表t出现)和(代表t不出现).那么
最后,信息增益
但信息增益最大的问题[对于多分类存在这个问题,对于二分类则不存在]还在于它只能考察特征对整个系统的贡献,而不能具体到某个类别上,这就使得它只适合用来做所谓“全局”的特征选择(指所有的类都使用相同的特征集合),而无法做“本地”的特征选择(每个类别有自己的特征集合,因为有的词,对这个类别很有区分度,对另一个类别则无足轻重).
同时,信息熵会偏向于特征的分布较多的特征,所以改进方法是可以尝试信息增益率。
E. 分类器错误率(Classifier error rate )
使用特定的分类器,用给定的特征子集对样本集进行分类,用分类的精度来衡量特征子集的好坏。
以上4种度量方法中,卡方检验、相关性、距离、信息增益、属于筛选器,而分类器错误率属于封装器。筛选器由于与具体的分类算法无关,因此其在不同的分类算法之间的推广能力较强,而且计算量也较小。而封装器由于在评价的过程中应用了具体的分类算法进行分类,因此其推广到其他分类算法的效果可能较差,而且计算量也较大。
5. 应用实例
此处举出一个实际应用中的栗子,基本方法为启发式搜索(顺序添加)+关联性准则(卡方检验、最大熵)+准召停止准则。以下详细介绍操作步骤。
Step1:统计每种特征的卡方值.
Step2:取topN的特征值.
Step3:带入模型训练,并在测试集合上计算准确和召回.
Step4:如果达标,停止,否则,gotostep2.
参考文献
[1]李云,机器学习中若干特征选择算法研究,博士后学位论文
[2]http://casparzhang.blog.163.com/blog/static/126626558201332701016809/
原文地址:http://blog.csdn.net/iezengli/article/details/32686803