0.引言
在现实世界中,我们总是倾向于收集尽可能多的特征来描述一个事物,以期能够更加全面准确的对其进行刻画。然而,我们了解事物的目的是变化着的,所以并非每一次对事物的刻画都需要所有特征。例如在机器学习领域众所周知的西瓜,描述西瓜的特征有很多,包括:大小、色泽、敲声、纹理、触感、根蒂等。了解西瓜的目的,即学习任务,也各不相同:好吃、好闻、好看等。显然,若学习任务是判断一个西瓜是否好看,则只需要大小、色泽、纹理等特征即可,这些特征即是“相关特征”。若需求为判断西瓜是否好吃,有经验的人只需要根蒂、敲声即可挑出好瓜,其他的特征则为“无关特征”。故对应于不同的学习任务,不同特征的重要性不同,从所有特征构成的特征集中选取对学习任务有用的相关特征的过程就称为特征选择。
如果我们不对特征进行选择,使用全部的特征,能否在只是付出更多的时间和资源代价的情况下完成学习任务呢?答案是不一定。特征选择是“数据预处理”过程的重要组成部分,其不仅筛选出完成学习任务所需的最少特征,还出于两个很重要的原因。其一是避免维度灾难,如果使用特征数量过多、样本数又不够,则可能带来过拟合等问题,所以需要构筑基于部分特征的模型。特征选择和降维在这一点上有相同的动机,使他们成为高维数据处理的两大主流技术。其二因为特征选择能够去除不相关特征,只留下关键因素,有利于我们在纷繁的因素中抽丝剥茧,看清事物的真相,例如房价和那些因素相关性最大。
1. 子集搜索
如想从初始的数据集中选取一个包含所有重要信息的特征子集,如果没有任何领域知识作为先验假设,则最好的办法就是遍历所有可能的特征子集,也称为暴力破解。显而易见,随着特征数量的增加,计算量终将无法招架,除非在量子计算机或其他非传统计算机领域有重大突破,在现实应用中很难使用这种方法。
相对而言,“贪心算法”则可操作性较强,基本流程如下所述。对于给定的特征集合 { a 1 , a 2 , . . . , a d } \{a_{\tiny 1},a_{\tiny 2},...,a_{\tiny d} \} { a1,a2,...,ad},首先将每个特征看做一个候选子集,对这d个候选子集进行评价,即对比单个特征对数据的分类效果。以人体为例,包含有身高、体重、肤色、发色等诸多特征,若学习的目的是对人种进行分类,则利用每一个特征(身高、体重、肤色、发色等)对数据进行分类(不同的人种),在通过数据真实标签对比就可以选出分类效果最好或者说分类结果最纯的特征。假定特征 { a 2 } \{a_{\tiny 2}\} { a2}最优,将 { a 2 } \{a_{\tiny 2}\} { a2}作为第一轮的选定集;然后在此基础上加入另一个特征,构成包含两个特征的特征集合,按照同样的方法对特征集合进行评价,假设集合 { a 2 , a 4 } \{a_{\tiny 2},a_{\tiny 4}\} { a2,a4}为最优,其优于 { a 2 } \{a_{\tiny 2}\} { a2},于是将 { a 2 , a 4 } \{a_{\tiny 2},a_{\tiny 4}\} { a2,a4}作为本轮的选定集。假设递归至k+1轮时,最优的候选 ( k + 1 ) (k+1) (k+1)特征子集不如上一轮的选定集,则停止生成候选子集,并将上一轮选定的包含k个特征的特征子集作为特征选择结果。这种从一个特征开始的策略称为“前向(forward)搜索”。相反,如果我们从整个特征集合出发,每一轮尝试筛选出一个无关特征,这样逐渐减少的策略称为“后向(backward)搜索”。又或者,还可以将前向和后向搜索结合起来,每一轮逐渐增加相关特征同时减少无关特征,称为“双向搜索”。
由于仅考虑了使本轮选定集最优而无法筛选出全局最优,此种策略故被称为贪心算法。贪心算法并不能涵盖所有可能的可能,只能保证当前利益的最大化,若要获得全局最优只能通过穷举遍历才可行。虽然不能获得绝对的最优解,但贪心算法能够得到解决大对数问题的次优解。类似的有序列向后选择算法(Sequential backward Selection,SBS),其大致流程是先用所有特征训练一个分类器并得到分类器的某种性能度量(MSE、准确度等),然后每次去掉一个特征再训练一个分类器,若去除的是无关特征,则性能变化不大甚至可能还会有所提升,反之可能使性能下降。
2.信息熵
2.1 定义
熵来自于物理学,被称为信息论之父的香农证明了熵与信息内容的不确定性有等价关系。熵是描述物质系统状态,即该状态可能出现的程度。简单的讲,熵用以描述事物无序的状态,越混乱无序的事物熵越大,越确定有序的事物熵越小。熵的一个重要作用就是度量系统的平均信息量,即传递该信息所用的代价。例如:太阳从东方升起,正是一个确定性事件,其熵为0,意味着若要传递该信息,无需进行任何编码。根据定义,若一个系统中存在多个事件 E 1 , E 2 , . . . , E n E_{\tiny 1},E_{\tiny 2},...,E_{\tiny n} E1,E2,...,En,每个事件出现的概率为 p 1 , p 2 , . . . , p n p_{\tiny 1},p_{\tiny 2},...,p_{\tiny n} p1,p2,...,pn,则系统的平均信息量为:
e n t r o p y ( p 1 , p 2 , . . . , p n ) = − p 1 l o g 2 p 1 − p 2 l o g 2 p 2 . . . − p n l o g 2 p n ( b i t s ) entropy(p_{\tiny 1},p_{\tiny 2},...,p_{\tiny n}) = -p_{\tiny1}log_{\tiny 2}{p_{\tiny 1}}-p_{\tiny2}log_{\tiny 2}{p_{\tiny 2}}...-p_{\tiny n}log_{\tiny 2}{p_{\tiny n}}^(bits) entropy(p1,p2,...,pn)=−p1log2p1−p2log2p2...−pnlog2pn(bits)
例如,某事件有四种可能{A,B,C,D},其发生的概率分别为{1/2,1/4,1/8,1/8},假设某一种可能发生视为随机变量 X ∈ { A , B , C , D } X\in\{A,B,C,D\} X∈{
A,B,C,D},利用信息熵额定义,得到该事件的信息熵为:
H ( x ) = 1 2 l o g ( 2 ) + 1 4 l o g ( 4 ) + 1 8 l o g ( 8 ) + 1 8 l o g ( 8 ) = 1 2 + 1 2 + 3 8 + 3 8 = 7 4 b i t H(x)=\frac{1}{2}log(2)+\frac{1}{4}log(4)+\frac{1}{8}log(8)+\frac{1}{8}log(8)=\frac{1}{2}+\frac{1}{2}+\frac{3}{8}+\frac{3}{8}=\frac{7}{4}bit H(x)=21log(2)+41log(4)+81log(8)+81log(8)=21+21+83+83=47bit
这也就意味着,在计算机中,若要对该事件进行二元(0/1)编码,所需要的平均码长即为1.75比特。
同时,信息熵也是度量集合纯度的一个指标。集合中数据的真实标签全为一个类别时纯度最高,相应的信息熵就越低。假设当前样本集合D中k类样本所占比例为 p k ( k = 1 , 2 , . . . , n ) p_k(k=1,2,...,n) pk(k=1,2,...,n),则D的信息熵定义为:
E n t ( D ) = − ∑ k = 1 n p k l o g 2 p k Ent(D)=-\sum_{k=1}^{n}p_klog_2p_k Ent(D)=−k=1∑npklog2pk
Ent值越小,则集合D的纯度越高。
2.2 信息增益
就特征选择而言,如果按照某个特征(属性)对对数据集进行划分后,能够提高数据纯度,则可以认为该特征对分类任务是有意义的。由于信息熵反应了数据集合的混乱程度,通过比较数据划分后信息熵的变化,就得到了所谓的信息增益。
假设离散属性 a a a有 V V V个可能的取值 a 1 , a 2 , . . . , a V {a^1,a^2,...,a^V} a