周志华《机器学习》西瓜书
第11章 特征选择与稀疏学习
文章目录
一、特征选择
什么是特征
将样本属性称为“特征”(feature)。
- 相关特征:对当前学习任务有关的属性
- 无关特征:对当前学习任务无关的属性
- 冗余特征:所包含的信息能从其他特征中推演出来。很多时候冗余特征是不起作用的,去除它们会减轻学习过程的负担。但如果冗余特征恰好完成了学习任务所需的中间概念,则冗余特征是有益的
什么是特征选择
从给定的特征集合中选择出相关特征子集,是一种数据预处理
为什么要进行特征选择
- 减轻维数灾难问题(与降维的原因相同)
- 去除不相关特征往往会降低学习任务的难度
怎么进行特征选择
我们不能直接用排列组合进行遍历所有可能子集,这样会遭遇组合爆炸。所以我们选择产生一个“候选特征子集”,评价它的好坏,然后根据评价结果产生下一个候选特征子集,再进行评价,持续进行直到无法找到一个更好的子集为止。
怎么进行特征选择就转成了以下问题:
- 如何根据评价结果生成下一个候选特征子集?(子集搜索)
- 前向搜索:初始将每个特征当做一个候选特征子集,然后从当前所有的候选子集中选择出最佳的特征子集;接着在上一轮选出的特征子集中添加一个新的特征,同样地选出最佳特征子集;最后直至选不出比上一轮更好的特征子集。
- 后向搜索:从完整的特征集合开始,每次尝试去掉一个无关特征。
- 双向搜索:前向后向结合,每一轮逐渐增加选定相关特征,同时减少无关特征(前面增加的特征不会被去除)。
优点:思路简单,速度快,不用全部情况都遍历一遍。
缺点:使用贪心算法,不从总体上考虑其它可能情况,每次选取局部最优解,不再进行回溯处理,结果不一定是最好的。
- 如何评价候选特征子集的好坏?(子集评价)
信息增益Gain(A)越大,特征子集A包含的有助于分类的信息越多。对每个候选特征子集,可基于训练数据集D来计算其信息增益,以此作为评价准则。信息熵也是同理,只要能判断两个划分差异的机制都能用于特征子集评价。
将特征子集搜索机制和子集评价机制相结合,即可得到特征选择方法。
过滤式选择
先对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关。特征选择在这里的作用相当于过滤。
Relief(适用于二分类问题)
设计了相关统计量来度量特征的重要性。是一个向量,其每个分量分别对应一个初始特征(分量值越大,对应属性的分类能力越强),而特征子集的重要性则是由子集每个特征所对应的相关统计量分量之和决定的。
- 最终可以通过指定一个阈值t,然后选择比t大的相关统计量分量对应的特征即可
- 也可以指定选取特征的个数k,然后选择相关统计量分量最大的k个特征。
如何确定相关统计量
对每个示例 x i x_i xi
- 猜中近邻(near-hit):在同类样本中寻找最近邻 x i , n h x_{i,nh} xi,nh
- 猜错近邻(near-miss):在异类样本中寻找最近邻 x i , n m x_{i,nm} xi,nm
- 相关统计量对应于属性 j j j 为: δ j = ∑ i − diff ( x i j , x i , n h j ) 2 + diff ( x i j , x i , n m j ) 2 \delta^{\mathrm{j}}=\sum_{\mathrm{i}}-\operatorname{diff}\left(\mathrm{x}_{\mathrm{i}}^{\mathrm{j}}, \mathrm{x}_{\mathrm{i}, \mathrm{nh}}^{\mathrm{j}}\right)^{2}+\operatorname{diff}\left(\mathrm{x}_{\mathrm{i}}^{\mathrm{j}}, \mathrm{x}_{\mathrm{i}, \mathrm{nm}}^{\mathrm{j}}\right)^{2} δj=∑i−diff(xij,xi,nhj)2+diff(xij,xi,nmj)2
其中, x a j x_{a}^{j} xaj 代表样本 x a x_{a} xa 在属性 j j j 上的取值, diff ( x a j , x b j ) \operatorname{diff}\left(x_{a}^{j}, x_{b}^{j}\right) diff(xaj,xbj) 的计算取决于属性 j j j 的类型:
- 对离散型属性 j j j : diff ( x a j , x b j ) = { 0 , x a j = x b j 1 , x a j ≠ x b j \displaystyle \operatorname{diff}(x_a^j,x_b^j)= \left\{\begin{array}{l} 0,\ x_a^j=x_b^j \\ 1,\ x_a^j \neq x_b^j \end{array}\right. diff(xaj,xbj)={0, xaj=xbj1, xaj=xbj
- 对连续型属性: diff ( x a j , x b j ) = ∣ x a j − x b j ∣ \operatorname{diff}\left(x_{a}^{j}, x_{b}^{j}\right)=\left|x_{a}^{j}-x_{b}^{j}\right| diff(xaj,xbj)= xaj−xbj 。注: x a j , x b j x_{a}^{j}, x_{b}^{j} xaj,xbj 已经规范化到 [ 0 , 1 ] [0,1] [0,1] 区间。
直观上理解对于猜中近邻,两者 j j j 属性的距离越小越好,对于猜错近邻, j j j 属性距离越大越好。分别计算每个分量,最终取平均便得到了整个相关统计量,分量值越大,对于属性的分类能力越强(越是相关特征)。
Relief只需在数据集的采样上而不必在整个数据集上估计相关统计量,Relief的时间开销随采样次数及原始特征数线性增长,因此是一个运行效率很高的过滤式特征选择法
Relief-F(多分类问题)
对每个示例 x i x_i xi ,若它属于第k类
- ∣ Y ∣ |Y| ∣Y∣ :数据集中样本总类别数
- 猜中近邻(near-hit):不变,在同类样本中寻找最近邻 x i , n h x_{i,nh} xi,nh
- 猜错近邻(near-miss):在每一个异类样本中寻找最近邻 x i , l , n m ( l = 1 , 2 , … , ∣ Y ∣ ; l ≠ k ) x_{i,l,nm}(l=1,2,\dots,|Y|;l\neq k) xi,l,nm(l=1,2,…,∣Y∣;l=k)
- 相关统计量公式变为:
δ
j
=
∑
i
−
diff
(
x
i
j
,
x
i
,
n
h
j
)
2
+
∑
l
≠
k
(
p
l
×
diff
(
x
i
j
,
x
i
,
l
,
n
m
j
)
2
)
\delta^{\mathrm{j}}=\sum_{\mathrm{i}}-\operatorname{diff}\left(\mathrm{x}_{\mathrm{i}}^{\mathrm{j}}, \mathrm{x}_{\mathrm{i}, \mathrm{nh}}^{\mathrm{j}}\right)^{2}+\sum_{\mathrm{l} \neq \mathrm{k}}\left(\mathrm{p}_{\mathrm{l}} \times \operatorname{diff}\left(\mathrm{x}_{\mathrm{i}}^{\mathrm{j}}, \mathrm{x}_{\mathrm{i}, \mathrm{l}, \mathrm{nm}}^{\mathrm{j}}\right)^{2}\right)
δj=i∑−diff(xij,xi,nhj)2+l=k∑(pl×diff(xij,xi,l,nmj)2)其中
p
l
p_l
pl 为第
l
l
l 类样本在数据集
D
D
D 中所占比例。
包裹式选择
直接把最终将要使用的学习器的性能作为特征子集的评价准则,即目的是为给定学习器选择最有利于其性能的量身定做的特征子集。(直接针对给定学习器进行优化,从最终学习器性能来看,比过滤式更好,但多次训练学习器使得计算开销大得多)
LVW
拉斯维加斯方法和蒙特卡罗方法是两个以著名赌城名字命名的随机化方法.两者的主要区别是:若有时间限制,则拉斯维加斯方法或者给出满足要求的解,或者不给出解,而蒙特卡罗方法一定会给出解,虽然给出的解未必满足要求;若无时间限制,则两者都能给出满足要求的解.
LVW(Las Vegas Wrapper)是一个典型的包裹式特征选择方法。它在拉斯维加斯方法(Las Vegas method)框架下使用随机策略来进行子集搜索,并以最终分类器的误差为特征子集评价准则。算法描述如下:
- 初始化:
- E E E:算法误差,初始化为无穷大
- d d d:特征子集的特征(属性)个数,初始化为特征集的特征个数
- A ∗ A^* A∗:特征子集,初始化为特征集
- t t t:连续没有优化效果的特征子集数,初始化为0
- 循环部分:
- 随机产生一个特征子集 A ′ A' A′ ,用 A ′ A' A′ 的特征个数更新 d d d
- 使用交叉验证法计算学习器 L \mathfrak{L} L 在 A ′ A' A′ 下的误差
- { 更新 t , E , d , A ∗ ; 较目前最好的算法误差 E 小或者精度无提升但特征数变少 t = t + 1 , e l s e \displaystyle \left\{\begin{array}{l} 更新 t,E,d,A^*;\ 较目前最好的算法误差E小或者精度无提升但特征数变少 \\ t=t+1,\ else \end{array}\right. {更新t,E,d,A∗; 较目前最好的算法误差E小或者精度无提升但特征数变少t=t+1, else
- 重复循环部分,直到满足停止条件控制参数,输出当前最好的特征子集 A ∗ A^* A∗
嵌入式选择
将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动进行了特征选择。
L1/L2正则化
-
线性回归模型以平方误差为损失函数的优化目标: min w ∑ i = 1 m ( y i − w T x i ) 2 \displaystyle \min_w \sum_{i=1}^m (y_i - w^{\mathbf T}x_i)^2 wmini=1∑m(yi−wTxi)2
-
样本特征很多而样本数目相对较少时很容易陷入过拟合
-
引入L2正则化(岭回归): min w ∑ i = 1 m ( y i − w T x i ) 2 + λ ∥ w ∥ 2 2 \displaystyle \min_w \sum_{i=1}^m (y_i - w^{\mathbf T}x_i)^2+\lambda \|w\|_2^2 wmini=1∑m(yi−wTxi)2+λ∥w∥22 ( λ \lambda λ 决定惩罚力度,过高可能会欠拟合,过小无法解决过拟合)
- 作用:L1正则化有特征筛选的作用,对所有参数的惩罚力度都一样,可以让一部分权重变为零(降维),因此产生稀疏模型,能够去除某些特征(权重为0则等效于去除)
-
引入L1正则化(LASSO): min w ∑ i = 1 m ( y i − w T x i ) 2 + λ ∥ w ∥ 1 \displaystyle \min_w \sum_{i=1}^m (y_i - w^{\mathbf T}x_i)^2+\lambda \|w\|_1 wmini=1∑m(yi−wTxi)2+λ∥w∥1
- 作用:使各个维度权重普遍变小,减少了权重的固定比例,使权重平滑
L1 和 L2 正则化都有助于降低过拟合风险,但L1还会带来一个额外的好处:它比L2更易于获得 “稀疏”解,即求得的
w
w
w 会有更少的非零分量(即抹除了更多的特征属性)。
意味着初始的d个特征中仅有对应着w的非零分量的特征才会出现在最终模型中,于是求解L1范数正则化的结果是得到了仅采用一部分初始特征的模型,即基于L1正则化的学习方法就是一种嵌入式特征选择方法
总的来说:
- L1范数会趋向产生少量的特征,其他特征的权值都是0;
- L2会选择更多的特征,这些特征的权值都会接近于0。
这样L1范数在特征选择上就十分有用,而L2范数则具备较强的控制过拟合能力。
L1正则化问题的求解——近端梯度下降(Proximal Gradient Descent, PGD)
其核心思想是:利用“泰勒展开”将目标函数的求解问题,变为一个“二次函数的求解问题”。
利普希茨连续条件(L-Lipschitz条件);
K K K 对于 f : D ⊆ R → R f:D \subseteq \mathbb R \rightarrow \mathbb R f:D⊆R→R, 若存在常数 K K K 使得 ∥ f ( a ) − f ( b ) ∥ ≤ K ∣ a − b ∣ ∀ a , b ∈ D \| f(a)-f(b) \| \leq K |a-b| \hspace{1em} \forall a,b \in D ∥f(a)−f(b)∥≤K∣a−b∣∀a,b∈D, f f f 符合利普希茨条件,对于 f f f 最小的常数 K K K 称为 f f f 的利普希茨常数。
简单说来就是:存在一个实数 K K K,使得对于函数 f f f 上的任意两点的连线的斜率的绝对值不大于 K K K,最小的 K K K 称为该函数的Lipschitz常数。直观上,Lipschitz连续函数限制了函数改变的速度。符合利普希茨条件的函数的斜率,必小于一个称为利普希茨常数的实数(该常数依函数而定)。
二、稀疏表示与字典学习
稀疏性
不妨把数据集D考虑成一个矩阵,其每行对应于一个样本,每列对应于一个特征.
- 特征选择所考虑的问题是特征具有“稀疏性”:即矩阵中的许多列与当前学习任务无关,通过特征选择去除这些列,则学习器训练过程仅需在较小的矩阵上进行,学习任务的难度可能有所降低,涉及的计算和存储开销会减少,学得模型的可解释性也会提高.
- 样本稀疏表达:样本矩阵D中存在许多零元素,但不是整行整列的出现。样本拥有这样的稀疏表达形式时,使大多数问题变得线性可分,并且利于存储(稀疏矩阵有很多高效存储方法)。
数据集的稀疏表示——字典学习
为什么要进行字典学习
**将普通非稀疏数据转为“稀疏表示”形式—— 恰当稀疏。从而享有稀疏性带来的好处。**需注意的是,我们所希望的稀疏表示是“恰当稀疏”,而不是“过度稀疏”。仍以汉语文档为例:
- 基于《现代汉语常用字表》得到的可能是恰当稀疏,即其稀疏性足以让学习任务变得简单可行;
- 而基于《康熙字典》则可能是过度稀疏与前者相比,也许并未给学习任务带来更多的好处.
什么是字典学习
为普通稠密表达的样本找到合适的字典,将样本转化为合适的稀疏表示形式(稀疏编码),从而简化学习任务,降低模型复杂度。
给定数据集
{
x
1
,
x
2
,
…
,
x
m
}
\{x_1,x_2,\dots,x_m\}
{x1,x2,…,xm},字典学习最简单的形式为:
min
B
,
α
1
∑
i
=
1
m
∥
x
i
−
B
α
i
∥
2
+
λ
∑
i
=
1
m
∥
α
i
∥
1
\displaystyle \min_{\mathbf B,\alpha_1} \sum_{i=1}^m \| x_i - \mathbf B \alpha_i \|^2 + \lambda \sum_{i=1}^m \| \alpha_i \|_1
B,α1mini=1∑m∥xi−Bαi∥2+λi=1∑m∥αi∥1 其中:
- B ∈ R d × k \mathbf B \in \mathbb R^{d \times k} B∈Rd×k :字典矩阵
- k k k :字典的词汇量,通常由用户指定
- α i ∈ R k \alpha_i \in \mathbb R^k αi∈Rk:样本 x i ∈ R d x_i \in \mathbb R^d xi∈Rd 的稀疏表示
第一项希望能由
α
i
\alpha_i
αi 很好地重构
x
i
x_i
xi ,第二项希望
α
i
\alpha_i
αi 尽量稀疏。
上式的解法可采用变量交替优化的策略:
- 第一步,固定字典 B B B,将上式按分量展开,可参照LASSO的解法求解下式,从而为每个样本 x i x_i xi 找到相对应的 a i a_i ai。
- 第二步,再以 a i a_i ai 为初值,更新字典 B B B。
初始化字典矩阵 B B B 之后反复迭代上述两步,最终即可求得字典 B B B 和样本 x i x_i xi 的稀疏表示 α i \alpha_i αi。在上述字典学习过程中,用户能通过设置词汇量 k k k 的大小来控制字典的规模,从而影响到稀疏程度。
压缩感知
关注的是如何利用信号本身所具有的稀疏性,从部分观测样本中恢复原信号,通常压缩感知分为:
- 感知测量(关注如何对原始信号进行处理以获得稀疏样本表示)
- 重构恢复(关注的是如何基于稀疏性从少量观测中恢复原信号,通常压缩感知指的是这部分)两个阶段。