关于周志华老师的《机器学习》这本书的学习笔记
记录学习过程
本博客记录Chapter11
1 子集搜索与评价
特征选择(feature selection):从给定的特征集合中选择出相关特征子集的过程。
更形象地说明,例如,对于西瓜而言,其特征包括色泽、根蒂、敲声、纹理、触感等。但有经验的人往往只看根蒂和敲声就能判断其是否是好瓜。而从所有特征中挑选出“相关特征”的过程就是“特征选择”。
进行特征选择的原因主要分为:
- 解决“维数灾难”问题。(与降维有异曲同工之妙)
- 降低学习任务的难度(将纷繁复杂的因素抽丝剥茧,留下关键因素)
特征选择中所谓的无关特征是指与当前学习任务无关的特征。而冗余特征是指该特征的信息能从其他特征中推演出来。如立方体的体积可以由长度、宽度、高度推演出来。去除冗余特征可以减轻学习过程的负担。但当冗余特征恰好对应完成学习任务所需的“中间概念”时(例如,底面积和体积),则该冗余特征是有益的。所以为了简化讨论,本章暂定数据中不涉及冗余特征,并且假定初始的特征集合包含了所有的重要信息。
从初始的特征集合中选取一个包含了所有重要信息的特征子集,在实现中,我们可行的一个做法是生成一个“候选子集”,评价其好坏,基于评价结果产生一个候选子集,在对其评价……直至无法找到更好的候选子集。这个过程,涉及到两个关键环节:
- 如何根据评价结果获取下一个候选子集?
- 如何评价候选特征子集的好坏?
第一个环节是 “子集搜索”(subset search)。给定特征集合 { a 1 , a 2 , ⋯ , a n } \{a_1,a_2,\cdots,a_n\} {a1,a2,⋯,an},我们可将每个特征看作一个候选子集,对 d d d个候选单特征子集进行评价,假定 { a 2 } \{a_2\} {a2}最优,于是将其作为第一轮的选定集;然后,在上一轮的选定集中假如一个特征,构成包含两个特征的候选子集,假定 d − 1 d-1 d−1个候选两特征子集中 { a 2 , a 4 } \{a_2,a_4\} {a2,a4}最优,且优于 { a 2 } \{a_2\} {a2},则将 { a 2 , a 4 } \{a_2,a_4\} {a2,a4}作为本轮的候选集;……假定在第 k + 1 k+1 k+1轮中,最优的候选 ( k + 1 ) (k+1) (k+1)特征子集不如上一轮的选定集,则停止生成候选子集,并将上一轮的 k k k特征集合作为特征选择结果。这样逐渐增加相关特征的策略称为“前向”(forward)搜索。 类似地,每次去掉一个无关特征,逐渐减少特征的策略是“后向”搜索(backward)。
第二个环节是 “子集评价”(subset evaluation)。给定数据集
D
D
D,假定
D
D
D中第
i
i
i类样本所占的比例为
p
i
(
i
=
1
,
2
,
⋯
,
∣
Y
∣
)
p_i(i=1,2,\cdots,|Y|)
pi(i=1,2,⋯,∣Y∣),假定样本属性都属于离散型。对属性子集
A
A
A,假定根据其取值将D分为
V
V
V个子集
{
D
1
,
D
2
,
⋯
,
D
V
}
\{D^1,D^2,\cdots,D^V\}
{D1,D2,⋯,DV},每个子集中的样本在
A
A
A上的取值相同,于是我们可以计算属性子集
A
A
A的信息增益:
G
a
i
n
(
A
)
=
E
n
t
(
A
)
−
∑
i
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(A)=Ent(A)-\sum_{i=1}^V\frac{|D^v|}{|D|}Ent(D^v)
Gain(A)=Ent(A)−i=1∑V∣D∣∣Dv∣Ent(Dv)
其中,信息熵定义为:
E
n
t
(
D
)
=
−
∑
i
=
1
∣
Y
∣
p
k
log
2
p
k
Ent(D)=-\sum_{i=1}^{|Y|}p_k\log_2p_k
Ent(D)=−i=1∑∣Y∣pklog2pk
信息增益越大,意味着特征子集
A
A
A包含的有助于分类的信息越多。于是对于每个候选特征子集,我们可以根据训练集
D
D
D来确定其信息增益,以此作为评价标准。
常见的特征选择方法大致可以分为三类:过滤式(filter)、包裹式(wrapper)、嵌入式(embedding)
2 过滤式选择
过滤式方法先对数据集进行特征选择,然后再训练学习器,特征选择过程与后续学习器无关。这相当于先用特征选择过程对初始特征进行"过滤",再用过滤后的特征来训练模型。
Relief算法是一种著名的过滤式特征选择算法,该方法设计了一个**“相关统计量”**度量特征的重要性。该统计量是一个向量,其每个分量分别对应于一个初始特征,而特征子集的重要性由子集中每个特征所对应的相关统计量分量之和来决定。因此,最终只需要指定一个阈值 τ \tau τ,然后选择比 τ \tau τ大的相关统计量分量所对应的特征即可;或指定选择 k k k个特征,按大小确定前 k k k个特征。
该算法的关键在于确定“相关统计量”:对于给定的训练集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
m
,
y
m
)
}
D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
D={(x1,y1),(x2,y2),⋯,(xm,ym)},对于每个示例
x
i
x_i
xi,其同类样本中的最近邻示例
x
i
,
n
h
x_{i,nh}
xi,nh,称为 “猜中近邻”(near-hit);其异类样本中的最近邻
x
i
,
n
m
x_{i,nm}
xi,nm称为 “猜错近邻”(near-miss)。相关统计量对应于属性
j
j
j的分量为:
ξ
j
=
∑
i
−
d
i
f
f
(
x
i
j
,
x
i
,
n
h
j
)
2
+
d
i
f
f
(
x
i
j
,
x
i
,
n
m
j
)
2
\xi^j=\sum_{i}-diff(x_i^j,x_{i,nh}^j)^2+diff(x_i^j,x_{i,nm}^j)^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上的取值,
d
i
f
f
(
x
a
j
,
x
b
j
)
diff(x_a^j,x_b^j)
diff(xaj,xbj) 取决于属性$ j
的
类
型
:
若
属
性
的类型:若属性
的类型:若属性j
为
离
散
型
,
则
为离散型,则
为离散型,则x_aj=x_bj$ 时
d
i
f
f
(
x
a
j
,
x
b
j
)
=
0
diff(x_a^j,x_b^j) = 0
diff(xaj,xbj)=0,否则为 1; 若属性
j
j
j为连续型,则
d
i
f
f
(
x
a
j
,
x
b
j
)
=
∣
x
a
j
−
x
b
j
∣
diff(x_a^j,x_b^j) = |x_a^j - x_b^j|
diff(xaj,xbj)=∣xaj−xbj∣ ,注意
x
a
j
,
x
b
j
x_a^j,x_b^j
xaj,xbj己规范化到$[0 , 1] $之间。
从式中可看出,若 x i x_i xi与其猜中近邻 x i , n h x_{i,nh} xi,nh 在属性 j j j上的距离小于 x i x_i xi与其猜错近邻 x i , n m x_{i,nm} xi,nm的距离,说明属性 j j j对区分同类与异类样本是有益的,于是增大属性 j j j所对应的统计量分量;反之,说明属性 j j j起负面作用,于是减小属性 j j j所对应的统计量分量。最后,对基于不同样本得到的估计结果进行平均,就得到各属性的相关统计量分量。分量值越大,则对应属性的分类能力就越强。
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* 。
该算法采用随机选取特征子集的策略,每次选取都需要重新训练训练器,计算开销很大。因此算法设置了停止条件控制参数 T T T。在评价时,采用交叉验证法估计学习器的误差,该误差在仅考虑特征子集 A ′ A' A′时得到的,即特征子集上的误差,若比 A ∗ A^* A∗上的误差更小,或者误差相当但是 A ′ A' A′中包含的特征数更小,则将其保存下来。
4 嵌入式选择与L1正则化
嵌入式选择是将特征选择过程与学习器训练过程融为一体,两者在同一个优化过程中完成,即在学习器训练过程中自动地进行了特征选择。
给定数据集
D
=
{
(
x
1
,
y
1
)
,
(
x
2
,
y
2
)
,
⋯
,
(
x
m
,
y
m
)
}
D=\{(x_1,y_1),(x_2,y_2),\cdots,(x_m,y_m)\}
D={(x1,y1),(x2,y2),⋯,(xm,ym)},我们考虑最简单的线性回归模型,以平方误差为损失函数,优化目标为:
min
w
∑
i
=
1
m
(
y
i
−
w
T
x
i
)
2
\min_w \sum_{i=1}^m(y_i-\bold w^T\bold x_i)^2
wmini=1∑m(yi−wTxi)2
当特征数比较多时,但是样本数相对较小,上式很容易陷入过拟合。为缓解过拟合问题,可对上式引入正则化项,若使用
L
2
L_2
L2范数正则化,则有:
min
w
∑
i
=
1
m
(
y
i
−
w
T
x
i
)
2
+
λ
∣
∣
w
∣
∣
2
2
\min_w \sum_{i=1}^m(y_i-\bold w^T\bold x_i)^2+\lambda||w||_2^2
wmini=1∑m(yi−wTxi)2+λ∣∣w∣∣22
其中,正则化参数
λ
>
1
\lambda>1
λ>1,上式称为 “岭回归”:通过引入
L
2
L_2
L2范数正则化,确能显著降低过拟合的风险。若将
L
2
L_2
L2范数换为
L
1
L_1
L1范数,则上式即为LASSO回归。
L 1 L_1 L1范数和 L 2 L_2 L2范数正则化都有助于降低过拟合风险,但前者还会带来一个额外的好处:它比后者更易于获得 “稀疏” (sparse)解,即它求得的 w \bold w w会有更少的非零分量。
从上图可以看出来, L 1 L_1 L1等值线与平方误差等值线折中时(即交点),往往在坐标轴上(即 w 1 = 0 或 w 2 = 0 w_1=0或w_2=0 w1=0或w2=0),则比 L 2 L_2 L2更容易得到稀疏解(即完成了特征选择)。
L1正则化问题的求解可使用近端梯度下降的方法。具体来说,令
∇
\nabla
∇表示微分算子,对优化目标
min
x
f
(
x
)
+
λ
∣
∣
x
∣
∣
1
\min_x f(x)+\lambda||x||_1
xminf(x)+λ∣∣x∣∣1
若
f
(
x
)
f(x)
f(x)可导,且
▽
f
\bigtriangledown f
▽f满足L-Lipschitz条件,即存在常数
L
>
0
L>0
L>0使得
∣
∣
∇
f
(
x
′
)
−
∇
f
(
x
)
∣
∣
2
≤
L
∣
∣
x
′
−
x
∣
∣
2
(
∀
x
,
x
′
)
||\nabla f(x')- \nabla f(x)||_2 \le L||x'-x||_2 \space\space\space\space(\forall x,x')
∣∣∇f(x′)−∇f(x)∣∣2≤L∣∣x′−x∣∣2 (∀x,x′)
则在
x
k
x_k
xk附近可以将
f
(
x
)
f(x)
f(x)通过二阶泰勒展式近似为:
f
^
(
x
)
≃
f
(
x
k
)
+
<
∇
f
(
x
k
)
,
x
−
x
k
>
+
L
2
∣
∣
x
−
x
k
∣
∣
2
=
L
2
∣
∣
x
−
(
x
k
−
1
L
∇
f
(
x
k
)
)
∣
∣
2
2
+
c
o
n
s
t
\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
f^(x)≃f(xk)+<∇f(xk),x−xk>+2L∣∣x−xk∣∣2=2L∣∣x−(xk−L1∇f(xk))∣∣22+const
上式的最小值在如下
x
k
+
1
x_{k+1}
xk+1时得到
x
k
+
1
=
x
k
−
1
L
∇
f
(
x
k
)
x_{k+1}=x_k-\frac{1}{L}\nabla f(x_k)
xk+1=xk−L1∇f(xk)
于是,通过梯度下降法对
f
(
x
)
f(x)
f(x)最小化,每一步梯度下降迭代实际熵等价于最小化二次函数
f
^
(
x
)
\hat{f} (x)
f^(x),类似将该想法推广至优化目标,得到:
x
k
+
1
=
arg
min
x
L
2
∣
∣
x
−
(
x
k
−
1
L
∇
f
(
x
k
)
∣
∣
2
2
+
λ
∣
∣
x
∣
∣
1
x_{k+1}=\mathop{\arg\min}_x \frac{L}{2}||x-(x_k-\frac{1}{L}\nabla f(x_k)||_2^2 +\lambda||x||_1
xk+1=argminx2L∣∣x−(xk−L1∇f(xk)∣∣22+λ∣∣x∣∣1
即在对
f
(
x
)
f(x)
f(x)做梯度下降迭代时,考虑
L
1
L_1
L1范数最小化。
令
z
=
x
k
−
1
L
∇
f
(
x
k
)
z=x_k-\frac{1}{L}\nabla f(x_k)
z=xk−L1∇f(xk)该式有闭式解:
x
k
+
1
i
=
{
z
i
−
λ
/
L
,
λ
/
L
<
z
i
0
,
∣
z
i
∣
≤
λ
/
L
z
i
+
λ
/
L
,
z
i
<
λ
/
L
x_{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}
xk+1i=⎩⎪⎨⎪⎧zi−λ/L,λ/L<zi0,∣zi∣≤λ/Lzi+λ/L,zi<λ/L
5 稀疏学习与字典学习
现在我们来考虑一种稀疏性:D所对应的矩阵中存在很多零元素,但这些零元素并不是以整列、整行形式存在的。在不少现实应用中我们会遇到这样的情形,例如在文档分类任务中,通常将每个文档看作一个样本,每个宇(词)作为一个特征,字(词)在文档中出现的频率或次数作为特征的取值;换言之,D所对应的矩阵的每行是一个文档,每列是一个字(词),行、列交汇处就是某字(词)在某文档中出现的频率或次数。那么,这个矩阵有多少列呢?以汉语为例,《康熙字典》中有 47035 个汉字,这意味着该矩阵可有4万多列,即使仅考虑《现代汉语常用字表》中的汉字,该矩阵也有3500列。然而,给定一个文档,相当多的字是不出现在这个文档中的,于是矩阵的每一行都有大量的0元素; 对不同的文档,零元素出现的列往往很不相同。
当样本具有这样的稀疏表达形式时,对学习任务来说会有不少好处,例如线性支持向量机之所以能在文本数据上有很好的性能,恰是由于文本数据在使用上述的字频表示后具有高度的稀疏性,使大多数问题变得线性可分。同时,稀疏样本并不会造成存储上的巨大负担,因为稀疏矩阵己有很多高效的存储方法。
字典学习(亦称稀疏编码),可以将稠密集转换为稀疏集。其过程如下:
给定数据集
{
x
1
,
x
2
,
⋯
,
x
m
}
\{x_1,x_2,\cdots,x_m\}
{x1,x2,⋯,xm},字典学习最简单的形式:
min
B
,
α
i
∑
i
=
1
m
∣
∣
x
i
−
B
α
i
∣
∣
2
2
+
λ
∑
i
=
1
m
∣
∣
α
i
∣
∣
1
\min_{B,\alpha_i} \sum_{i=1}^m ||x_i-B\alpha_i||_2^2+\lambda \sum_{i=1}^m ||\alpha_i||_1
B,αimini=1∑m∣∣xi−Bαi∣∣22+λi=1∑m∣∣αi∣∣1
- 其中, B B B是字典矩阵, k k k为字典的词汇量,通常由用户指定, α i \alpha_i αi是原样本的稀疏表示。上式中第一项希望能由 α i \alpha_i αi很好地重构 x i x_i xi,第二项希望 α i \alpha_i αi尽量稀疏。
上式的解法可采用变量交替优化的策略:
-
第一步,固定字典 B B B,将上式按分量展开,可参照LASSO的解法求解下式,从而为每个样本 x i x_i xi找到相对应的 α i \alpha_i αi:
min α i ∣ ∣ x i − B α i ∣ ∣ 2 2 + λ ∣ ∣ α i ∣ ∣ 1 \min_{\alpha_i}||x_i-B\alpha_i||_2^2+\lambda||\alpha_i||_1 αimin∣∣xi−Bαi∣∣22+λ∣∣αi∣∣1 -
第二步,再以 α i \alpha_i αi为初值,更新字典 B B B。
min B ∣ ∣ X − B A ∣ ∣ F 2 \min_{B} ||X-BA||_F^2 Bmin∣∣X−BA∣∣F2
初始化字典矩阵 B B B之后反复迭代上述两步,最终即可求得字典 B B B和样本 x i x_i xi的稀疏表示 α i \alpha_i αi。在上述字典学习过程中,用户能通过设置词汇量 k 的大小来控制字典的规模,从而影响到稀疏程度。
6 压缩感知
压缩感知(compressed sensing):
-
假定有长度为 m m m的离散信号 x x x,不妨假定我们已远小于奈奎斯特采样定理要求的采样率进行采样,得到长度为 n n n的采样后信号 y y y,即
y = Φ x y=\Phi x y=Φx -
不妨假设存在某个线性变换 Ψ \Psi Ψ,使得 y = Φ Ψ s = A s y=\Phi \Psi s=As y=ΦΨs=As,其中 A = Φ Ψ A=\Phi \Psi A=ΦΨ。若能根据 y y y来恢复 s s s,可以通过 x = Ψ s x=\Psi s x=Ψs恢复 x x x。
-
粗看起来没有解决任何问题,因为恢复信号 s s s这个逆问题仍是欠定的。然而有趣的是,若 s s s具有稀疏性,则这个问题竟能很好地得解决。
与特征选择、稀疏表示不同,压缩感知关注的是如何利用信号本身所具有的稀疏性,从部分观测样本中恢复原信号。通常认为,压缩感知分为 “感知测量” 和 “重构恢复” 这两个阶段:
- "感知测量"关注如何对原始信号进行处理以获得稀疏样本表示,这方面的内容涉及傅里叶变换、小波变换以及字典学习、稀疏编码等,不少技术在压缩感知提出之前就己在信号处理等领域有很多研究;
- "重构恢复"关注的是如何基于稀疏性从少量观测中恢复原信号,这是压缩感知的精髓,当我们谈到压缩感知时,通常是指该部分。
压缩感知的相关理论比较复杂,下面仅简要介绍一下"限定等距性":
-
对大小为 n × m n\times m n×m的矩阵 A A A,若存在常数 δ k ∈ ( 0 , 1 ) \delta_k\in(0,1) δk∈(0,1)使得对于任意向量 s s s和 A A A的所有子矩阵 A k ∈ R n × k A_k\in R^{n\times k} Ak∈Rn×k,有
( 1 − δ k ) ∣ ∣ s ∣ ∣ 2 2 ≤ ∣ ∣ A k s ∣ ∣ 2 2 ≤ ( 1 + δ k ) ∣ ∣ s ∣ ∣ 2 2 (1-\delta_k)||s||^2_2 \le ||A_ks||_2^2 \le (1+\delta_k)||s||^2_2 (1−δk)∣∣s∣∣22≤∣∣Aks∣∣22≤(1+δk)∣∣s∣∣22
则称 A A A满足 k k k限定等距性。 -
可以通过下面的优化问题近乎完美地从 y y y中恢复出稀疏信号 s s s,进而恢复出 x x x
min s ∣ ∣ s ∣ ∣ 0 s . t . y = A s \min_s ||s||_0\\ s.t. \ \ \ y=As smin∣∣s∣∣0s.t. y=As -
上式涉及 L 0 L_0 L0范数最小化,这是个NP难问题。值得庆幸的是, L 1 L_1 L1 范数最小化在一定条件下与 L 0 L_0 L0范数最小化问题共解。于是实际上只需关注:
min s ∣ ∣ s ∣ ∣ 1 s . t . y = A s \min_s ||s||_1\\ s.t. \ \ \ y=As smin∣∣s∣∣1s.t. y=As -
上式可以转化为LASSO 的等价形式再通过近端梯度下降法求解,即使用"基寻踪去噪"。