第4章 决策树
基本流程
决策树(decision tree)是常用的机器学习方法,它基于树结构来进行决策,决策的最终结论对应我们预期的判定结果,决策过程提出的每个判定问题都是对某个属性的测试,每个测试的结果或是导出最终结论,或是导出进一步的判定问题。一棵决策树包含一个根结点、若干内部结点、若干叶结点;叶结点对应决策结果,其他的每个内部结点对应于一个属性测试,每个结点包含的样本集合根据属性测试的结果被划分到子结点中;根结点包含样本全集。从根结点到每个叶结点的路径对应了一个判定测试序列。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循分而治之(divide-and-conquer) 策略。决策树的生成是一个递归过程,导致递归返回有三种情形:当前结点所有样本属于同一类,无需划分;当前属性集为空或是当前样本属性取值完全相同,无法划分;当前结点包含的样本集合为空,不能划分。
划分选择
决策树的学习关键是如何选择最优的划分属性。一般来说,随着划分的进行,我们希望分支结点所包含的样本尽可能属于同一类别,即纯度(purity)越来越高。
1 信息增益
信息熵(information entropy)是度量样本集合纯度的常用指标。在样本集合
D
D
中第类样本所占的比例为
pk
p
k
,则
D
D
的信息熵定义为:
Ent(D) E n t ( D ) 的值越小,则纯度越高。对离散属性 a a 有个可能的取值,使用 a a 对样本进行划分,会产生个分支结点,其中第 v v 个结点包含了中所有在属性 a a 上取值为的样本,记为 Dv D v ,考虑到不同分支结点包含的样本数不同,给予权重 |Dv|/|D| | D v | / | D | ,表示样本数越多,分支结点的影响越大,则可计算出属性 a a 对样本进行划分获得的信息增益(information gain)
信息增益越大,意味着使用
a
a
来进行划分所获得的纯度提升越大。在划分时优先选取信息增益大的属性进行划分。ID3算法基于此。
2 增益率
信息增益对可取值较多的属性有所偏好,为减少这种偏好带来的不利影响,C4.5算法就使用了增益率(gain ratio)来选择最优划分属性:
IV(a)
I
V
(
a
)
是属性
a
a
的固有值(intrinsic value),的可能取值数目越多(
V
V
越大)则固有值通常会越大。
3 基尼指数
CART决策树算法使用基尼指数(Gini index)来选择划分属性。用基尼值来度量数据集的纯度:
它反映了从数据集D中随机抽取两个样本其类别标记不一致的概率,因此 Gini(D) G i n i ( D ) 值越小,数据集的纯度越高。属性 a a 的基尼指数定义为:
于是可以选择使得基尼指数最小的属性作为最优划分属性。
剪枝处理
剪枝(pruning)是决策树学习算法应对过拟合的手段,即决策树分支过多。这时就需要主动去掉一些分支。基本策略有预剪枝(prepruning)和后剪枝(postpruning)。预剪枝是每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能使泛化性能提示,则替换为叶结点。可用之前介绍的性能评估方法来评价泛化性能。
预剪枝使得很多分支没有展开,降低了过拟合风险,减少了训练时间;后剪枝比预剪枝保留了更多得分支,一般情况下泛化性能优于预剪枝,但其所需时间大大增加。
连续与缺失值
1 连续值处理
连续属性的可取数目无限,不能依此来进行结点划分,可用连续属性离散化,最简单的使二分法。对连续属性
{a1,a2,...an}
{
a
1
,
a
2
,
.
.
.
a
n
}
,相邻的属性取值,可把其区间的中位点作为候选划分点,然后再像离散属性值那样来考察这些划分点。
2 缺失值处理
遇到不完整的样本,某些属性值缺失,需要解决两个问题:如何在属性值缺失的情况下进行划分属性选择;给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分。
多变量决策树
若把每个属性视为坐标空间中的一个坐标轴,则 d 个属性描述的样本就对应了 d 维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻
找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel) ,即它的分类边界由若干个与坐标轴平行的分段组成。
此时决策树会比较复杂,要进行大量的属性测试,时间开销非常大。
若能使用斜的划分边界则决策树模型将大为简化,多变量决策树 (multivariate decision tree) 就是能实现这样的斜划分甚至更复杂划分的决策树。以实现斜划分的多变量决策树为例,在此类决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试;换言之,每个非叶结点是一个线性分类器,与传统的单变量决策树(univariate decision tree) 不同,在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最性,而是试图建立一个合适的线性分类器。
第5章 神经网络
神经元模型
神经网络(neural networks)的研究由来已久,己成为一个相当大的、多学科交叉的学科领域,最广泛的一种定义是:神经网络是由具有适应性的简单单元组成的广泛并行互连的网络,它的组织能够模拟生物神经系统对真实世界物体所作出的交互反应。在机器学习中谈论神经网络时指的是“神经网络学习”,或者说,是机器学习与神经网络这两个学科领
域的交叉部分。
神经网络最基本的成分是神经元(neuron)模型,即上述定义中的简单单元。在生物神经网络中,每个神经元与其他神经元相连,当它兴奋时,就会向相连的神经元发送化学物质,从而改变这些神经元内的电位;如果某神经元的电位超过了一个阈值,那么它就会被激活,即兴奋起来,向其他神经元发送化学物质。
一直沿用至今的M-P神经元模型,神经元收到来自n个其他神经元传递过来的输入信号,通过带权重的连接进行传递,接收到的总输入值将与神经元的阈值进行比较,然后通过激活函数(activation function)处理以产生输出。
理想的激活函数是阶跃函数,将输入值映射为0或1,分别对应神经元的抑制或兴奋,但是阶跃函数不连续、不光滑,实际常用Sigmoid函数作为激活函数,它可以把较大范围内变化的输入值压缩到(0,1)的输出范围内,也称为挤压函数(squashing function)。把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。
感知机与多层网络
感知器(Perceptron)由两层神经元组成,输入层接收外界输入信号后传递给输出层,输出层是M-P神经元,亦称阈值逻辑单元(threshold logic unit)。感知器容易实现逻辑与或非的运算。
对于
y=f(∑iwixi−θ)
y
=
f
(
∑
i
w
i
x
i
−
θ
)
,假设
f
f
是阶跃函数:
· 与:令 ,则
y=f(1∗x1+1∗x2−2)
y
=
f
(
1
∗
x
1
+
1
∗
x
2
−
2
)
,仅当
x1=x2=1
x
1
=
x
2
=
1
时,
y=1
y
=
1
。
· 或:令
w1=w2=1,θ=0.5
w
1
=
w
2
=
1
,
θ
=
0.5
,则
y=f(1∗x1+1∗x2−0.5)
y
=
f
(
1
∗
x
1
+
1
∗
x
2
−
0.5
)
,仅当
x1或x2=1
x
1
或
x
2
=
1
时,
y=1
y
=
1
。
· 非:令
w1=0.6,w2=0,θ=−0.5
w
1
=
0.6
,
w
2
=
0
,
θ
=
−
0.5
,则
y=f(−0.6∗x1+0∗x2+0.5)
y
=
f
(
−
0.6
∗
x
1
+
0
∗
x
2
+
0.5
)
,当
x1=1
x
1
=
1
时,
y=0
y
=
0
;当
x1=0
x
1
=
0
时,
y=1
y
=
1
一般的,对给定数据集,权重
wi(i=1,2,...,n)
w
i
(
i
=
1
,
2
,
.
.
.
,
n
)
和阈值
θ
θ
可通过学习得到,阈值
θ
θ
可看作一个固定输入为
−1.0
−
1.0
的哑结点(dummy node)对应权重
wn+1
w
n
+
1
,这样就将学习统一为权重的学习。对样例
(x,y)
(
x
,
y
)
若当前感知器输出为
y~
y
~
,则调整权重:
式中
η
η
称为学习率(learning rate)。当感知器对样例训练准确,即
y=y~
y
=
y
~
,则感知器不发生变化。注意感知器只有输出层神经元进行激活函数处理,即只有一层功能神经元(functional neuron),学习能力非常有限。可证明,线性可分(linearly separable)问题(如与或非)感知器的学习过程一定会收敛(converge)而求得适当的权重;否则将会发生振荡(fluctuation),权重难以稳定下来,甚至不能解决异或问题。
要解决非线性可分问题,需要使用多层功能单元。比如两层感知器就能解决异或问题。输出层与输入层之间的一层神经元,称为隐含层(hidden layer),它和输出层神经元都是拥有激活函数的功能神经元。
更一般的是层级结构,每层神经元与下一层神经元全互连,不存在同层连接和跨层连接,这样的结构称为多层前馈神经网络(multi-layer feedforward neural networks),输入层仅接受输入,不进行函数处理,隐含层与输出层包含功能神经元。神经网络的学习过程,就是根据训练集来调整神经元之间的连接权(connection weight)以及每个功能神经元的阈值。
误差逆传播算法
多层网络的学习能力比单层感知机强得多,也需要更强大的学习算法,反向传播或误差逆传播(error BackPropagation, BP)算法就是其中最杰出的代表,它是迄今最成功的神经网络学习算法。BP 算法不仅可用于多层前馈神经网络,还可用于其他类型的神经网络。
对训练集
即输入示例由
d
d
个属性描述,输出维实值向量。下图为
d
d
个输入神经元,个输出神经元,
q
q
个隐含层神经元的多层前馈网络。输出层第个神经元阈值为
θj
θ
j
,隐含层第
h
h
个神经元阈值为,输入层第
i
i
个神经元与隐含层第个神经元之间的连接权重为
vih
v
i
h
,隐含层第
h
h
个神经元与输出层第个神经元之间的连接权为
whj
w
h
j
。隐含层第
h
h
个神经元的输出为
对训练例
(xk,yk)
(
x
k
,
y
k
)
,假设神经网络输出为
y~k=(y~k1,y~k2,...,y~kl)
y
~
k
=
(
y
~
1
k
,
y
~
2
k
,
.
.
.
,
y
~
l
k
)
,即
y~kj=f(βj−θj)
y
~
j
k
=
f
(
β
j
−
θ
j
)
,则网络在
(xk,yk)
(
x
k
,
y
k
)
上的均方误差为
上图中的网络有
(d+l+1)q+l
(
d
+
l
+
1
)
q
+
l
个参数需要确定,BP是一个迭代学习算法,每一轮迭代采用广义的感知器学习规则对参数进行更新估计,基于梯度下降(gradient descent)策略,以目标的附体地方向对参数进行调整,根据学习率
η∈(0,1)
η
∈
(
0
,
1
)
来控制每一轮迭代的更新步长,太大会造成振荡,太小则收敛慢。
BP算法的工作流程:在(0,1)范围内随机初始化网络中所有的连接权和阈值;对每个训练样例,先将输入示例提供给输入层神经元,然后逐层将信号前传,直到产生输出层的结果;然后计算输出层的误差,再将误差逆向传播至隐层神经元,最后根据隐层神经元的误差来对连接权和阈值进行调整。该迭代过程循环进行,直到达到某些停止条件为止,倒如训练误差己达到一个很小的值。
BP算法的目的是要最小化训练集上的累积误差
E=1m∑mk=1Ek
E
=
1
m
∑
k
=
1
m
E
k
。而上述标准算法每次仅针对一个训练样例来更新阈值和连接权,即基于单个
Ek
E
k
推导而得。基于累积误差最小化的更新规则叫做累积误差逆传播(accumulated error backpropagation)算法。
一般来说,标准 BP 算法每次更新只针对单个样例,参数更新得非常频繁,而且对不同样例进行更新的效果可能出现抵消现象.因此,为了达到同样的累积误差极小点,标准 BP 算法往往需进行更多次数的迭代。累积 BP 算法直接针对累积误差最小化,它在读取整个训练集一遍后才对参数进行更新,其参数更新的频率低得多。但在很多任务中,累积误差下降到一定程度之后,进一步下降会非常缓慢。
只需一个包含足够多神经元的隐层,多层前馈网络就能以任意精度逼近任意复杂度的连续函数。然而,如何设置隐层神经元的个数仍是个未决问题,实际应用中通常靠试错法(trial-by-error) 调整。
BP 神经网络经常遭遇过拟合,其训练误差持续降低,但测试误差却可能上升。有两种策略常用来缓解 BP 网络的过拟合。早停(early stopping) 将数据分成训练集和验证集,训练集用来计算梯度、更新连接权和阈值,验证集用来估计误差,若训练集误差降低但验证集误差升高,则停止训练,同时返回具有最小验证集误差的连接权和阈值。第二种正则化(regularization) 基本思想是在误差目标函数中增加一个用于描述网络复杂度的部分,例如连接权与阈值的平方和。
全局最小与局部极小
神经网络的训练过程可看作是一个参数寻优过程,即在参数空间中寻找一组最优参数使得在训练集上的误差
E
E
最小。常见的有局部极小(local minimum)和全局最小(global minimum)。
直观地看,局部极小解是参数空间中的某个点,其邻域点的误差函数值均不小于该点的函数值;全局最小解则是指参数空间中所有点的误差函数值均不小于该点的误差函数值。
参数空间内梯度为零的点,只要其误差函数值小于邻点的误差数值,就是局部极小点;可能存在多个局部极小值,但却只会有一个全局最小值。也就是说,“全局最小”一定是“局部极小”,反之则不成立。在参数寻优过程中是希望找到全局最小。
基于梯度的搜索是使用最为广泛的参数寻优方法。从某些初始解出发,迭代寻找最优参数值。每次迭代中,先计算误差函数在当前点的梯度,然后根据梯度确定搜索方向.例如,由于负梯度方向是函数值下降最快的方向,因此梯度下降法就是沿着负梯度方向搜索最优解。若误差函数在当前点的梯度为零,则己达到局部极小,参数的迭代更新将在此停止。如果误差函数仅有一个局部极小,那么此时找到的局部极小就是全局最小,否则会陷入多个局部极小的情况。
解决方法有:·
1 以多组不同参数值初始化多个神经网络,按标准方法训练后,取其中误差最小的解作为最终参数。
2 使用模拟退火(simulated annealing) 技术,在每一步都以一定的概率接受比当前解更差的结果,从而有助于“跳出”局部极小、在每步迭代过程中,接受“次优解”的概率要随着时间的推移而逐渐降低,从而保证算法稳定。
3 使用随机梯度下降。随机梯度下降法在计算梯度时加入了随机因素.于是,即便陷入局部极小点,它计算出的梯度仍可能不为零,这样就有机会跳出局部极小继续搜索。
4 遗传算法(genetic algorithms) 也常用来训练神经网络以更好地逼近全局最小。
其他常见神经网络
1 RBF网络
径向基函数(Radial Basis Function,RBF)是一种单隐层前馈神经网络,使用径向基函数作为隐层的激活函数,输出层是对隐层神经元输出的线性组合。
2 ART网络
竞争型学习(competitive learning)是常用的无监督学习策略,其输出神经元相互竞争,每一时刻仅有一个竞争获胜的神经元被激活。这种机制称为胜者通吃(winner-take-all)。自适应谐振理论(Adaptive Resonance Theory, ART)网络就是竞争型学习的代表。
竟争的最简单方式是,计算输入向量与每个识别层神经元所对应的模式类的代表向量之间的距离,距离最小者胜。获胜神经元将向其他识别层神经元
发送信号,抑制其激活。若输入向量与获胜神经元所对应的代表向量之间的相似度大于识别阈值,则当前输入样本将被归为该代表向量所属类别,同时,网络连接权将会更新,使得以后在接收到相似输入样本时该模式类会计算出更大的相似度,从而使该获胜神经元有更大可能获胜;若相似度不人于识别阈值,则重置模块将在识别层增设一个新的神经元,其代表向量设置为当前输入向量。
3 SOM网络
自组织映射(Self-Organizing Map)是一种竞争学习型的无监督神经网络,它能将高维输入数据映射到低维空间(通常为二维),同时保持输入数据在高维空间的拓扑结构,即将高维空间中相似的样本点
映射到网络输出层中的邻近神经元。
4 级联相关网络
一般的神经网络模型通常假定网络结构是事先固定的,训练的目的是利用训练样本来确定合适的连接权、阈值等参数。与此不同,结构自适应网络则将网络结构也当作学习的目标之一,并希望能在训练过程中找到最符合数据特点的网络结构。级联相关 (Cascade-Correlation) 网络是结构自适应网络的重要代表。
5 Elman网络
与前馈神经网络不同,递归神经网络(recurrent neural networks) 允许网络中出现环形结构,从而可让一些神经元的输出反馈回来作为输入信号。Elman网络是最常用的递归神经网络之一,它的结构与多层前馈网络很相似,但隐层神经元的输出被反馈回来,与下一时刻输入层神经元提供的信号一起,作为隐层神经元在下一时刻的输入。
6 Boltzmann机
神经网络中有一类模型是为网络状态定义一个能量(energy) ,能量最小化时网络达到理想状态,而网络的训练就是在最小化这个能量函数。Boltzmann 机 就是一种基于能量的模型(energy-based model) ,其神经元分为两层:显层与隐层。显层用于表示数据的输入与输出,隐层则被理解为数据的内在表达。Boltzmann 机中的神经元都是布尔型的,即只能取0、1两种状态,状态 1 表示激活,状态 0 表示抑制。
深度学习
理论上,参数越多的模型复杂度高、容量(capacity) 越大,这意味着能完成更复杂的学习任务。但一般情形下,复杂模型的训练效率低,易陷入过拟合,而随着云计算、大数据时代的到来,计算能力的大幅提高可缓解训练低效性,训练数据的大幅增加则可降低过拟合风险,因此,以深度学习(deep learning) 为代表的复杂模型开始受到人们的关注。
典型的深度学习模型就是很深层的神经网络。对神经网络模型,提高容量的一个简单办法是增加隐层的数目,模型复杂度也可通过单纯增加层神经元的数目来实现,增加隐层的数目比增加层神经元的数目更有效,因为增加隐层数不仅增加了拥有激活函数的神经元数目,还增加了激活函数嵌套的层数,然而,多隐层神经网络难以直接用经典算法进行训练,因为误差在多隐层内逆传播时,往往会发散(diverge) 而不能收敛到稳定状态。
无监督逐层训练(unsupervised layer-wise training)是多隐层网络训练的有效手段。基本思想是每次训练一层隐结点,训练时将上一层隐结点的输出作为输入,称为预训练(pre-training) ;在预训练全部完成后,再对整个网络进行微调(fine-tuning) 训练。
另一种策略是权共享(weight sharing),即让一组神经元使用相同的连接权。这个策略在卷积神经网络(Convolutional Neural Network, CNN)中发挥了重要作用。
从另一个角度理解深度学习,其多隐层堆叠、每层对上一层的输出进行处理的机制,可看作是在对输入信号进行逐层加工,从而把初始的、与输出目标之间联系不太密切的输入表示,转化成与输出目标联系更密切的表示,使得原来仅基于最后一层输出映射难以完成的任务成为可能。换言之,通过多层处理,逐渐将初始的“低层”特征表示转化为“高层”特征表示后,用“简单模型”即可完成复杂的分类等学习任务。由此可将深度学习理解为进行特征学习(feature learning) 或表示学习(representation learning)
第6章 支持向量机
间隔与支持向量
给定训练集,分类学习的基本思想就是基于
D
D
在样本空间中找到一个超平面划分,将不同类别的样本分开,但存在多个超平面时,要如何选择是我们需要研究的问题。
在样本空间中,通过线性方程描述超平面:。其中
w=(w1;w2;...;wd)
w
=
(
w
1
;
w
2
;
.
.
.
;
w
d
)
为法向量,决定平面的方向;
b
b
为位移项,决定超平面与原点之间的距离。将这个超平面标记为,则样本空间中任意点
x
x
到超平面的距离为:
超平面能够正确分类时,有
使上式成立的训练样本点距离超平面最近,称为支持向量(support vector)。两个异类支持向量到超平面的距离之和为:
γ=2/||w||
γ
=
2
/
|
|
w
|
|
,称为间隔(margin)
我们的目的就是要找到具有最大间隔(maximum margin)的划分超平面。即最大化
||w||−1
|
|
w
|
|
−
1
,等价于最小化
||w||2
|
|
w
|
|
2
。这就是支持向量机(support vector machine)的基本模型。
对偶问题
对超平面模型 f(x)=wTx+b f ( x ) = w T x + b ,求得
上式本身使一个凸二次规划(convex quadratic programming)问题,对其使用拉格朗日乘子法可得到对偶问题(dual problem)。显示出支持向量机的一个重要性质:训练完成后,大部分的训练样本都不需要保留,最终模型仅与支持向量有关。
核函数
现实情况下(线性不可分),需要将样本从原始空间映射到一个更高维的特征空间,使得在这个高维空间内线性可分。如果原始空间是有限维,即属性有限,那么一定存在一个高维特征空间使样本可分。
将
x
x
映射后的向量为,于是特征空间中的超平面为
f(x)=wTϕ(x)+b
f
(
x
)
=
w
T
ϕ
(
x
)
+
b
,类似的求
||w||2
|
|
w
|
|
2
最小化与对偶问题,涉及到计算样本
xi
x
i
与
xj
x
j
映射到特征空间之后的内积,直接计算它将十分困难,因此可以设想出一个函数简化这个计算,即核函数(kernel function)。SVM模型的最优解可通过训练样本的核函数展开,即支持向量展式(support vector expansion)。
有定理表明,只要一个对称函数所对应的核矩阵(kernel matrix)半正定,就能作为核函数使用,核函数本身隐式地定义了一个特征空间。如何选择核函数成为支持向量机的最大变数。常用的核函数如下:
另外,还可以通过核函数之间的组合得到新的核函数,如线性组合、直积等。
软间隔与正则化
现实任务中,很难确定合适的核函数使得样本在特征空间中线性可分,即使找到某个核函数,也有可能是由于过拟合造成的。缓解该问题的方法就是允许一些样本的出错,称为软间隔(soft margin)。
前面所介绍的硬间隔(hard margin)要求所有的样本必须划分正确,而软间隔允许某些样本不满足约束条件,但不满足的个数应尽可能少,所以要引入损失函数。人们通常用其他一些函数来代替,称为替代损失(surrogate loss),他们具有较好的数学性质:
正则化(regularization)问题。可以理解为一种“惩罚函数”,对不希望得到的结果施以惩罚,从而使得优化过程趋向于希望目标,可以认为是提供了模型的先验概率。
支持向量回归
对回归问题,传统的回归模型直接基于模型输出和真实输出之间的差别来计算损失,当且仅当他们相同时,损失才为零。支持向量回归(support vector regression, SVR)假设能容忍模型输出
f(x)
f
(
x
)
与真实输出
y
y
之间最多的偏差,即差别大于
ε
ε
时才计算损失,这相当于构建了一个宽度为
2ε
2
ε
的间隔带,若样本落入其中,则认为预测是正确的。
核方法
对训练样本,不考虑偏移项
b
b
<script type="math/tex" id="MathJax-Element-1540">b</script>时,无论SVM或SVR,习得的模型总能表示为核函数的线性组合。表示定理(representer theorem)是对此更一般的结论,即意味着对一般的损失函数和正则化项,优化问题的最优解都可以表示为核函数的线性组合。
由此发展出一系列基于核函数的学习方法,称为核方法(kernel methods)。通过核化将线性学习器拓展为非线性学习器。如线性判别分析(Kernelized Linear Discriminant Analysis, KLDA)。