机器学习 第十一章特征选择与稀疏学习

673 阅读12分钟

关于周志华老师的《机器学习》这本书的学习笔记
记录学习过程
本博客记录Chapter11

1 子集搜索与评价

特征选择(feature selection)从给定的特征集合中选择出相关特征子集的过程。 更形象地说明,例如,对于西瓜而言,其特征包括色泽、根蒂、敲声、纹理、触感等。但有经验的人往往只看根蒂和敲声就能判断其是否是好瓜。而从所有特征中挑选出“相关特征”的过程就是“特征选择”。

进行特征选择的原因主要分为:

  • 解决“维数灾难”问题。(与降维有异曲同工之妙)
  • 降低学习任务的难度(将纷繁复杂的因素抽丝剥茧,留下关键因素)

特征选择中所谓的无关特征是指与当前学习任务无关的特征。而冗余特征是指该特征的信息能从其他特征中推演出来。如立方体的体积可以由长度、宽度、高度推演出来。去除冗余特征可以减轻学习过程的负担。但当冗余特征恰好对应完成学习任务所需的“中间概念”时(例如,底面积和体积),则该冗余特征是有益的。所以为了简化讨论,本章暂定数据中不涉及冗余特征,并且假定初始的特征集合包含了所有的重要信息。

从初始的特征集合中选取一个包含了所有重要信息的特征子集,在实现中,我们可行的一个做法是生成一个“候选子集”,评价其好坏,基于评价结果产生一个候选子集,在对其评价……直至无法找到更好的候选子集。这个过程,涉及到两个关键环节:

  • 如何根据评价结果获取下一个候选子集?
  • 如何评价候选特征子集的好坏?

第一个环节是 “子集搜索”(subset search)。给定特征集合{a1,a2,,an}\{a_1,a_2,\cdots,a_n\},我们可将每个特征看作一个候选子集,对dd个候选单特征子集进行评价,假定{a2}\{a_2\}最优,于是将其作为第一轮的选定集;然后,在上一轮的选定集中假如一个特征,构成包含两个特征的候选子集,假定d1d-1个候选两特征子集中{a2,a4}\{a_2,a_4\}最优,且优于{a2}\{a_2\},则将{a2,a4}\{a_2,a_4\}作为本轮的候选集;……假定在第k+1k+1轮中,最优的候选(k+1)(k+1)特征子集不如上一轮的选定集,则停止生成候选子集,并将上一轮的kk特征集合作为特征选择结果。这样逐渐增加相关特征的策略称为“前向”(forward)搜索。 类似地,每次去掉一个无关特征,逐渐减少特征的策略是“后向”搜索(backward)。

第二个环节是 “子集评价”(subset evaluation)。给定数据集DD,假定DD中第ii类样本所占的比例为pi(i=1,2,,Y)p_i(i=1,2,\cdots,|Y|),假定样本属性都属于离散型。对属性子集AA,假定根据其取值将D分为VV个子集{D1,D2,,DV}\{D^1,D^2,\cdots,D^V\},每个子集中的样本在AA上的取值相同,于是我们可以计算属性子集AA的信息增益:

Gain(A)=Ent(A)i=1VDvDEnt(Dv)Gain(A)=Ent(A)-\sum_{i=1}^V\frac{|D^v|}{|D|}Ent(D^v)

其中,信息熵定义为:

Ent(D)=i=1Ypklog2pkEnt(D)=-\sum_{i=1}^{|Y|}p_k\log_2p_k

信息增益越大,意味着特征子集AA包含的有助于分类的信息越多。于是对于每个候选特征子集,我们可以根据训练集DD来确定其信息增益,以此作为评价标准。

常见的特征选择方法大致可以分为三类:过滤式(filter)、包裹式(wrapper)、嵌入式(embedding)

2 过滤式选择

过滤式方法先对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关。这相当于先用特征选择过程对初始特征进行"过滤",再用过滤后的特征来训练模型。

Relief算法是一种著名的过滤式特征选择算法,该方法设计了一个**“相关统计量”**度量特征的重要性。该统计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性由子集中每个特征所对应的相关统计量分量之和来决定。因此,最终只需要指定一个阈值τ\tau,然后选择比τ\tau大的相关统计量分量所对应的特征即可;或指定选择kk个特征,按大小确定前kk个特征。

该算法的关键在于确定“相关统计量”:对于给定的训练集D={(x1,y1),(x2,y2),,(xm,ym)}D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\},对于每个示例xix_i,其同类样本中的最近邻示例xi,nhx_{i,nh},称为 “猜中近邻”(near-hit);其异类样本中的最近邻xi,nmx_{i,nm}称为 “猜错近邻”(near-miss)。相关统计量对应于属性jj的分量为:

ξj=idiff(xij,xi,nhj)2+diff(xij,xi,nmj)2\xi^j=\sum_{i}-diff(x_i^j,x_{i,nh}^j)^2+diff(x_i^j,x_{i,nm}^j)^2

其中xajx_a^j表示样本xax_a在属性jj上的取值,diff(xajxbj)diff(x_a^j,x_b^j) 取决于属性j j的类型:若属性jj为离散型,则xaj=xbjx_a^j=x_b^jdiff(xaj,xbj)=0diff(x_a^j,x_b^j) = 0,否则为 1; 若属性jj为连续型,则diff(xaj,xbj)=xajxbjdiff(x_a^j,x_b^j) = |x_a^j - x_b^j| ,注意xaj,xbjx_a^j,x_b^j己规范化到[01][0 , 1] 之间。

从式中可看出,若xix_i与其猜中近邻xi,nhx_{i,nh} 在属性jj上的距离小于xix_i与其猜错近邻xi,nmx_{i,nm}的距离,说明属性jj对区分同类与异类样本是有益的,于是增大属性jj所对应的统计量分量;反之,说明属性jj起负面作用,于是减小属性jj所对应的统计量分量。最后,对基于不同样本得到的估计结果进行平均,就得到各属性的相关统计量分量。分量值越大,则对应属性的分类能力就越强。

3 包裹式选择

与过滤式特征选择不考虑后续学习器不同,包裹式特征选择直接把最终将要使用的学习器的性能作为特征子集的评价准则。换言之,包裹式特征选择的目的就是为给定学习器选择最有利于其性能、 "量身定做"的特征子集。

LVW是一类典型的包裹式特征选择方法。其使用随机策略来进行子集搜索,并以最终分类器的误差作为特征子集的评价准则,算法描述如下:

输入:
	数据集 D;
    特征集 A;
    学习算法S;
    停止条件控制参数T.
过程:
E= ∞;
d= IAI;
A* = A;
t = 0;
while t < T do 
	随机产生特征子集 A'; 
	d'= IA'I; 
	E' = CrossValidation(S(D^A')); 
	if (E'<E) ∪ ((E'=E) ∩ (d' < d)) then
		t = 0;
		E=E'; 
		d= d';
		A* =A' 
	else 
		t=t+1 
	end if 
end while
输出:特征子集 A* 。

该算法采用随机选取特征子集的策略,每次选取都需要重新训练训练器,计算开销很大。因此算法设置了停止条件控制参数TT。在评价时,采用交叉验证法估计学习器的误差,该误差在仅考虑特征子集AA'时得到的,即特征子集上的误差,若比AA^*上的误差更小,或者误差相当但是AA'中包含的特征数更小,则将其保存下来。

4 嵌入式选择与L1正则化

嵌入式选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择

给定数据集D={(x1,y1),(x2,y2),,(xm,ym)}D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\},我们考虑最简单的线性回归模型,以平方误差为损失函数,优化目标为:

minwi=1m(yiwTxi)2\min_w \sum_{i=1}^m(y_i-\bold w^T\bold x_i)^2

当特征数比较多时,但是样本数相对较小,上式很容易陷入过拟合。为缓解过拟合问题,可对上式引入正则化项,若使用L2L_2范数正则化,则有:

minwi=1m(yiwTxi)2+λw22\min_w \sum_{i=1}^m(y_i-\bold w^T\bold x_i)^2+\lambda||w||_2^2

其中,正则化参数λ>1\lambda>1,上式称为 “岭回归”:通过引入L2L_2范数正则化,确能显著降低过拟合的风险。若将L2L_2范数换为L1L_1范数,则上式即为LASSO回归

L1L_1范数和L2L_2范数正则化都有助于降低过拟合风险,但前者还会带来一个额外的好处:它比后者更易于获得 "稀疏" (sparse)解,即它求得的w\bold w会有更少的非零分量。

image.png

从上图可以看出来,L1L_1等值线与平方误差等值线折中时(即交点),往往在坐标轴上(即w1=0w2=0w_1=0或w_2=0),则比L2L_2更容易得到稀疏解(即完成了特征选择)。

L1正则化问题的求解可使用近端梯度下降的方法。具体来说,令\nabla表示微分算子,对优化目标

minxf(x)+λx1\min_x f(x)+\lambda||x||_1

f(x)f(x)可导,且f\bigtriangledown f满足L-Lipschitz条件,即存在常数L>0L>0使得

f(x)f(x)2Lxx2    (x,x)||\nabla f(x')- \nabla f(x)||_2 \le L||x'-x||_2 \space\space\space\space(\forall x,x')

则在xkx_k附近可以将f(x)f(x)通过二阶泰勒展式近似为:

f^(x)f(xk)+<f(xk),xxk>+L2xxk2=L2x(xk1Lf(xk))22+const\hat{f}(x) \simeq f(x_k)+<\nabla f(x_k),x-x_k>+\frac{L}{2}||x-x_k||^2\\ =\frac{L}{2}||x-(x_k-\frac{1}{L}\nabla f(x_k))||_2^2+const

上式的最小值在如下xk+1x_{k+1}时得到

xk+1=xk1Lf(xk)x_{k+1}=x_k-\frac{1}{L}\nabla f(x_k)

于是,通过梯度下降法对f(x)f(x)最小化,每一步梯度下降迭代实际熵等价于最小化二次函数f^(x)\hat{f} (x),类似将该想法推广至优化目标,得到:

xk+1=argminxL2x(xk1Lf(xk)22+λx1x_{k+1}=\mathop{\arg\min}_x \frac{L}{2}||x-(x_k-\frac{1}{L}\nabla f(x_k)||_2^2 +\lambda||x||_1

即在对f(x)f(x)做梯度下降迭代时,考虑L1L_1范数最小化。

z=xk1Lf(xk)z=x_k-\frac{1}{L}\nabla f(x_k)该式有闭式解:

xk+1i={ziλ/L,λ/L<zi0,ziλ/Lzi+λ/L,zi<λ/Lx_{k+1}^i=\begin{cases} z^i-\lambda/L,\lambda/L<z^i\\ 0,|z^i|\le \lambda/L\\ z^i+\lambda/L,z^i<\lambda/L \end{cases}

5 稀疏学习与字典学习

现在我们来考虑一种稀疏性:D所对应的矩阵中存在很多零元素,但这些零元素并不是以整列、整行形式存在的。在不少现实应用中我们会遇到这样的情形,例如在文档分类任务中,通常将每个文档看作一个样本,每个宇(词)作为一个特征,字(词)在文档中出现的频率或次数作为特征的取值;换言之,D所对应的矩阵的每行是一个文档,每列是一个字(词),行、列交汇处就是某字(词)在某文档中出现的频率或次数。那么,这个矩阵有多少列呢?以汉语为例,《康熙字典》中有 47035 个汉字,这意味着该矩阵可有4万多列,即使仅考虑《现代汉语常用字表》中的汉字,该矩阵也有3500列。然而,给定一个文档,相当多的字是不出现在这个文档中的,于是矩阵的每一行都有大量的0元素; 对不同的文档,零元素出现的列往往很不相同。

当样本具有这样的稀疏表达形式时,对学习任务来说会有不少好处,例如线性支持向量机之所以能在文本数据上有很好的性能,恰是由于文本数据在使用上述的字频表示后具有高度的稀疏性,使大多数问题变得线性可分。同时,稀疏样本并不会造成存储上的巨大负担,因为稀疏矩阵己有很多高效的存储方法。

字典学习(亦称稀疏编码),可以将稠密集转换为稀疏集。其过程如下:

给定数据集{x1,x2,,xm}\{x_1,x_2,\cdots,x_m\},字典学习最简单的形式:

minB,αii=1mxiBαi22+λi=1mαi1\min_{B,\alpha_i} \sum_{i=1}^m ||x_i-B\alpha_i||_2^2+\lambda \sum_{i=1}^m ||\alpha_i||_1
  • 其中,BB是字典矩阵,kk为字典的词汇量,通常由用户指定,αi\alpha_i是原样本的稀疏表示。上式中第一项希望能由αi\alpha_i很好地重构xix_i,第二项希望αi\alpha_i尽量稀疏。

上式的解法可采用变量交替优化的策略:

  • 第一步,固定字典BB,将上式按分量展开,可参照LASSO的解法求解下式,从而为每个样本xix_i找到相对应的αi\alpha_i

    minαixiBαi22+λαi1\min_{\alpha_i}||x_i-B\alpha_i||_2^2+\lambda||\alpha_i||_1
  • 第二步,再以αi\alpha_i为初值,更新字典BB

    minBXBAF2\min_{B} ||X-BA||_F^2

初始化字典矩阵BB之后反复迭代上述两步,最终即可求得字典BB和样本xix_i的稀疏表示αi\alpha_i。在上述字典学习过程中,用户能通过设置词汇量 k 的大小来控制字典的规模,从而影响到稀疏程度。

6 压缩感知

压缩感知(compressed sensing):

  • 假定有长度为mm的离散信号xx,不妨假定我们已远小于奈奎斯特采样定理要求的采样率进行采样,得到长度为nn的采样后信号yy,即

    y=Φxy=\Phi x
  • 不妨假设存在某个线性变换Ψ\Psi,使得y=ΦΨs=Asy=\Phi \Psi s=As,其中A=ΦΨA=\Phi \Psi。若能根据yy来恢复ss,可以通过x=Ψsx=\Psi s恢复xx

  • 粗看起来没有解决任何问题,因为恢复信号ss这个逆问题仍是欠定的。然而有趣的是,若ss具有稀疏性,则这个问题竟能很好地得解决。

与特征选择、稀疏表示不同,压缩感知关注的是如何利用信号本身所具有的稀疏性,从部分观测样本中恢复原信号。通常认为,压缩感知分为 "感知测量""重构恢复" 这两个阶段:

  • "感知测量"关注如何对原始信号进行处理以获得稀疏样本表示,这方面的内容涉及傅里叶变换、小波变换以及字典学习、稀疏编码等,不少技术在压缩感知提出之前就己在信号处理等领域有很多研究;
  • "重构恢复"关注的是如何基于稀疏性从少量观测中恢复原信号,这是压缩感知的精髓,当我们谈到压缩感知时,通常是指该部分。

压缩感知的相关理论比较复杂,下面仅简要介绍一下"限定等距性":

  • 对大小为n×mn\times m的矩阵AA,若存在常数δk(0,1)\delta_k\in(0,1)使得对于任意向量ssAA的所有子矩阵AkRn×kA_k\in R^{n\times k},有

    (1δk)s22Aks22(1+δk)s22(1-\delta_k)||s||^2_2 \le ||A_ks||_2^2 \le (1+\delta_k)||s||^2_2

    则称AA满足kk限定等距性。

  • 可以通过下面的优化问题近乎完美地从yy中恢复出稀疏信号ss,进而恢复出xx

    minss0s.t.   y=As\min_s ||s||_0\\ s.t. \ \ \ y=As
  • 上式涉及L0L_0范数最小化,这是个NP难问题。值得庆幸的是,L1L_1 范数最小化在一定条件下与L0L_0范数最小化问题共解。于是实际上只需关注:

    minss1s.t.   y=As\min_s ||s||_1\\ s.t. \ \ \ y=As
  • 上式可以转化为LASSO 的等价形式再通过近端梯度下降法求解,即使用"基寻踪去噪"。