引言
本文是统计学习方法第二版的读书笔记。主要学习了决策树的生成算法。
决策树主要优点是模型具有可读性,分类速度快。
建议先看下机器学习入门——决策树图解(附代码)
决策树模型与学习
决策树模型
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点和有向边组成。结点有两种类型:内部节点和叶节点。内部节点表示一个特征或属性,叶节点表示一个类。
上图是一个决策树的示意图,圆和方框分别表示内部结点和叶结点。
决策树与if-then规则
可以将决策树看成一个if-then规则的集合。由决策树的根节点到叶节点的每一条路径构建一条规则;路径上内部节点的特征对应着规则的条件,而叶节点对应着规则的结论。 决策树对应的if-then规则集合具有一个重要的性质:互斥并且完备。即每个实例都被一条规则所覆盖,而且只被一条规则所覆盖。覆盖是指实例的特征满足规则的条件。
决策树与条件概率分布
决策树还表示给定特征条件下类的条件概率分布。
上图(a)表示了特征空间的一个划分,1x1的大正方形表示特征空间。这个正方形被4个小矩形分隔,每个小矩形表示一个单元,也就是决策树的一个规则。X取值为单元的集合,这里假设Y的取值为+1,−1。小矩形中的数字表示单元的类。
当决策树满足上面这条规则时,得到的划分就如下图所示:
决策树学习
假设给定训练数据集
D={(x1,y1),(x2,y2),⋯,(xN,yN)}
其中,xi=(xi1,xi2,⋯,xin)为输入实例(特征向量),n为特征个数,yi∈{1,2,⋯,K}为类标记,i=1,2,⋯,N ,N为样本容量。
决策树学习的目标是根据给定的训练数据构建一个决策树模型,是它能够实例进行正确的分类。
决策树学习本质上是从训练数据中归纳出一组分类规则。能对训练数据进行正确分类的决策树可能有多个,也可能一个都没有。我们需要一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。
决策树学习用损失函数表示这一目标。决策树学习的损失函数通常是正则化的极大似然函数。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。该过程对应着特征空间的划分,也对应着决策树的构建。
开始,构建根节点,将所有训练数据都放在根节点。选择一个最优特征,按照该特征将训练数据分隔成子集,使得各个子集有一个在当前条件下最好的分类。
若这些子集已经能被基本正确分类,那么构建叶节点,将这些子集分到所对应的叶节点中去; 如果还有子集不能被基本正确分类,那么针对这些子集选择新的最优特征,继续对其进行分割,构建相应的节点。
如果递归地进行下去,直到所有训练数据子集都被基本正确分类,或没有适合的特征为止。这样就生成了一颗决策树。
以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据却未必有很好的分类能力,即可能发生过拟合现象。我们需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力。
如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
可以看出,决策树学习算法包含特征选择、决策树的生成与决策树的剪枝过程。
决策树学习常用的算法有ID3、C4.5与CART。
特征选择
特征选择问题
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。通常特征选择的准则是信息增益或信息增益比。
下面通过一个例子来说明特征选择问题。下面是一个由15个样本组成的贷款申请训练数据。数据包含贷款申请人的4个特征:年龄,有3个可能值;有工作,有2个可能值;有自己的房子,有2个可能值;以及信贷情况,有3个可能值。
最后一列是类别,是否同意贷款。
希望通过所给的训练数据学习一个贷款申请的决策树,用来对未来的贷款申请进行分类,当新客户提出贷款申请时,根据申请人的特征利用决策树决定是否批准贷款申请。
首先要做的是特征选择,即决定用哪个特征来划分特征空间。直观上,如果一个特征具有更好的分类能力,按照这一特征将训练数据分割成子集,使得各个子集在当前条件下有最好的分类,那么就应该选择这个特征。信息增益(information gain)就能够很好地表示这一直观的准则。
信息增益
在信息论中,熵(entropy)表示随机变量不确定性的度量。设X是一个取有限个值的离散随机变量,其概率分布为
P(X=xi)=pi,i=1,2,⋯,n
则随机变量X的熵定义为
H(X)=−i=1∑npilogpi(5.1)
在上式中,若pi=0,则定义0log0=0。通常上式的对数以2为底或以e为底(自然对数),这时熵的单位为别称作比特或纳特。由定义可知,熵只依赖于X的分布,而与X的取值无关,所以也将X的熵记为H(p),即
H(p)=−i=1∑npilogpi(5.2)
熵越大,随机变量的不确定性越大。当随机变量只取两个值,例如1,0时,即X的分布为:
P(X=1)=p,P(X=0)=1−p,0≤p≤1
熵为
H(p)=−plog2p−(1−p)log2(1−p)(5.4)
这时,熵H(p)随概率p的曲线如图所示
当p=0或p=1时H(p)=0,随机变量完全没有不确定性。当p=0.5时,H(p)=1,熵取最大值,随机变量不确定性最大。
条件熵H(Y∣X)表示在已知随机变量X的条件下随机变量Y的不确定性。H(Y∣X)定义为X给定条件下Y的条件概率分布的熵对X的数学期望
H(Y∣X)=i=1∑npiH(Y∣X=xi)(5.5)
这里pi=P(X=xi),i=1,2,⋯,n
当熵和条件熵中的概率由极大似然估计得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
信息增益表示得知特性X的信息而使得类Y的信息不确定性减少的程度。
特征A对训练数据集D的信息增益g(D,A)定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D∣A)之差,即
g(D,A)=H(D)−H(D∣A)(5.6)
一般地,熵H(Y)与条件熵H(Y∣X)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
给定训练集D和特征A,经验熵H(D)表示对数据集D进行分类的不确定性。而经验条件熵H(D∣A)表示在特征A给定的条件下对数据集D进行分类的不确定性。 那么它们的差,即信息增益,就表示由于特征A而使得对数据集D的分类的不确定性减少的程度。显然,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。
那么就得到根据信息增益准则的特征选择方法:对训练数据集(或子集)D,计算每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
设训练数据集为D,∣D∣表示样本个数。设有K个类Ck,k=1,2,⋯,K,∣Ck∣为属于类Ck的样本个数,所有类别的样本个数之和等于样本总数,即∑k=1K∣Ck∣=∣D∣。设特征A有n个不同的取值{a1,a2,⋯,an},根据特征A的取值将D划分为n个子集D1,D2,⋯,Dn,∣Di∣为Di的样本个数,有∑i=1n∣Di∣=∣D∣。 子集Di中属于类Ck的样本集合为Dik,∣Dik∣为Dik的样本个数。
于是就可以表示信息增益的算法了:
- 计算数据集D的经验熵H(D)
H(D)=−k=1∑K∣D∣∣Ck∣log2∣D∣∣Ck∣(5.7)
- 计算特征A对数据集D的经验条件熵H(D∣A)(其实就是H(Di)的加权和)
H(D∣A)=i=1∑n∣D∣∣Di∣H(Di)=−i=1∑n∣D∣∣Di∣k=1∑K∣Di∣∣Dik∣log2∣Di∣∣Dik∣(5.8)
- 计算信息增益
g(D,A)=H(D)−H(D∣A)(5.9)
对例子中给出的训练数据集D,根据信息增益准则来选择最优特征。
首先计算经验熵H(D),根据每个类别的占比计算即可:
H(D)=−159log2159−156log2156=0.971
然后计算各特征对数据集D的信息增益。分别以A1,A2,A3,A4表示年龄、有工作、有自己的房子和信贷情况4个特征,D1,D2,D3分别是D中A1(年龄)取值为青年、中年和老年的样本子集。
以H(D1)为例,表示年龄取值为青年的情况
总共有5个,其中3个类别为否;2个类别为是。把样本子集D1代入公式(5.7)中,得
H(D1)=−(52log252+53log253)=0.971
哈哈,这里巧了,和H(D)是一样的,但是还要乘以一个权重,这个权重就是年龄为青年的样本数量占总样本数量的比重。这里是155。
同理可以计算出H(D2)和H(D3)。
此时计算特征A1对数据集D的信息增益就好理解了,为下式:
g(D,A1)=H(D)−[155H(D1)+155H(D2)+155H(D3)]=0.971−[155(−52log252−53log253)+155(−53log253−52log252)+155(−54log254−51log251)]=0.971−0.888=0.083
同理可计算g(D,A2)
g(D,A2)=H(D)−[155H(D1)+1510H(D2)]=0.971−[155×0+1510(−104log2104−106log2106)]=0.324
g(D,A3)
g(D,A3)=0.971−[156×0+159(−93log293−96log296)]=0.971−0.551=0.420
g(D,A4)=0.971−0.608=0.363
最后,比较各特征的信息增益。由于特征A3(有自己的房子)的信息增益最大,所以选择特征A3作为最优特征。
信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。使用信息增益比(information gain ratio)可以对这一问题进行校正。这是特征选择的另一准则。
特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益g(D,A)与训练数据集D关于特征A的值的熵HA(D)之比,即
gR(D,A)=HA(D)g(D,A)(5.10)
其中,HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,n是特征A的取值个数。
决策树的生成
ID3算法
输入:训练数据集D,特征集A阈值ε;
输出:决策树T
- 若D中所有实例属于同一类Ck,则T为单节点树,并将类Ck作为该节点的类标记,返回T;
- 若A为空集,则T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T;
- 否则,按上面介绍的算法计算A中各特征对D的信息增益,选择信息增益最大的特征Ag;
- 如果Ag的信息增益小于阈值ε(设置阈值防止分的过细),则置T为单节点树,并将D中实例数最大的类Ck作为该节点的类标记,返回T;
- 否则,对Ag的每一可能值ai,依Ag=ai将D分割为若干非空子集Di,将Di中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;
- 对第i个子节点,以Di为训练集,以A−{Ag}为特征集,递归地调用步1~5,得到子树Ti,返回Ti。
C4.5算法
C4.5算法除了在生成的过程中使用信息增益比来选择特征,其他过程和ID3算法是一样的。
在这两个算法中通过设定阈值来控制生成的树的深度或宽度,这种做法称为预剪枝。还有一种做法是生成决策树以后,再进行剪枝,叫做后剪枝。
决策树的剪枝
上面介绍的决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。 解决这个问题的办法是考虑降低决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝。剪枝从已生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数来实现。
决策树损失函数
Cα(T)=C(T)+α∣T∣(5.11)
其中
C(T)=t=1∑∣T∣NtHt(T)
树T的叶节点个数为∣T∣,t呢是树T的叶节点,该叶节点有Nt个样本点,其中k类的样本点有Ntk个。Ht(T)为叶节点t上的经验熵,α≤0为参数,是对树规模的一个惩罚。
C(T)表示模型对训练数据的预测误差,即模型与训练数据的拟合程度,当叶子节点的熵越小,也就是损失越小,代表混乱程度越低,分类的时候越好分;
∣T∣表示模型复杂度。当叶子节点数越大,说明决策树越复杂,泛化能力越差。较大的α促使选择较简单的树。当α=0意味着只考虑模型与训练数据的拟合程度,不考虑复杂度。
剪枝,就是当α确定时,选择损失函数最小的模型。决策树生成算法学习局部的模型,而决策树剪枝学习整体的模型。
下面介绍剪枝算法。简单来说就是如果减去某个分支,使该分支变成叶子节点,得到的新树对应的损失函数更小,那么就可以剪枝,否则不能剪枝。
树的剪枝算法
- 计算每个节点的经验熵
- 递归地从树的根节点向上回缩
- 如果一组叶节点回缩到父节点之后和之前的整体树分别为TA与TB,对应的损失函数分别是Cα(TA)与Cα(TB),若Cα(TA)≤Cα(TB),则进行剪枝,将父节点变成新的叶节点
- 返回步骤2,直到不能继续为止,得到损失函数最小的子树Tα
CART算法
分类与回归树(classification and regression tree,CART)模型是应用广泛的决策树学习方法。既可以用于分类也可以用于回归。
它生成的决策树是一颗二叉树。上面介绍的ID3算法和C4.5算法中,如果其中一个特征有多个(大于两个)类别,那么就要分多个分支。但是CART算法不管有多少个类别,只分成两部分。
还是以这个数据为例,如果以有工作这个特征来分,只有两个分支,是和否;但是如果以年龄来分,此时有三个分支了,要怎么分呢,其实很简单,可以左边分支是青年(或中年、老年),右边是非青年(或非中年、非老年)。只能从这个三个里面选择一种作为分类的依据,CART此时是通过基尼指数来判断选择哪个分支作为分类的依据。
基尼指数
分类问题中,假设有K个类,样本点属于第k个类的概率为pk,则概率分布的基尼指数定义为
Gini(p)=k=1∑Kpk(1−pk)=1−k=1∑Kpk2(5.12)
这里用到了∑k=1Kpk=1
对于二分类问题,若样本点属于第1个类的概率是p,则概率分布的基尼指数为
Gini(p)=2p(1−p)(5.13)
对于给定的样本集合D,其基尼指数为
Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2(5.14)
如果样本集合D根据特征A是否取某一可能值a被分割成D1和D2两部分,即
D1={(x,y)∈D∣A(x)=a},D2=D−D1
则在特征A的条件下,集合D的基尼指数定义为
Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)(5.15)
基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)表示经A=a分割后集合D的不确定性。基尼指数越大,不确定性就越大。
CART生成算法
根据训练数据集,从根节点开始,递归地对每个节点进行以下操作,构建二叉决策树:
- 设节点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割为D1和D2两部分,利用式(5.15)计算A=a时的基尼指数。
- 在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。根据最优特征和最优切分点,从现节点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
- 对两个子节点递归地调用步骤1,2,直到满足停止条件
- 生成CART决策树
其中算法停止计算的条件是节点中的样本数小于预定阈值,或样本集的基尼指数小于预定阈值,或没有更多特征。
还是通过这个例子来熟悉一下吧,应用CART算法生成决策树。
和上文一样,分别以A1,A2,A3,A4表示年龄、有工作、有自己的房子和信贷情况4个特征,并以1,2,3表示年龄的值为青年、中年和老年,以1,2表示有工作和有自己的房子的值为是和否,以1,2,3表示信贷情况的值为非常好、好和一般。
先求特征A1的基尼指数
A1表示值为青年,以该值将数据集分为青年和非青年两部分。其中青年部分有5个样本,非青年部分有10个样本。在年龄为青年中类别为否的有3个;为是的有2个。 二在非青年中类别为是的有7个;为否的有3个。根据式(5.15)和式(5.13),得:
Gini(D,A1=1)=155(2×52×(1−52))+1510(2×107×(1−107))=0.44
同理求得
Gini(D,A1=2)=0.48
Gini(D,A1=3)=0.44
由于Gini(D,A1=1)和Gini(D,A1=3)相等且最小,所以A1=1和A1=3都可以选作A1的最优切分点。
求特征A2和A3的基尼指数:
Gini(D,A2=1)=155(2×1×(1−1))+1510(2×104×(1−104))=0.32
Gini(D,A3=1)=0.27
由于A2和A3只有一个切分点(它们都只能分出两个分支),所以它们就是最优切分点。
再求特征A4的基尼指数:
Gini(D,A4=1)=0.36
Gini(D,A4=2)=0.47
Gini(D,A4=3)=0.32
Gini(D,A4=3)最小,所以A4=3为A4的最优切分点。
在A1,A2,A3,A4几个特征中,Gini(D,A3=1)=0.27最小,所以选择特征A3作为最优特征,A3=1作为最优切分点。
于是根节点生成两个子节点,一个是叶节点。
对另一个节点继续使用以上方法在A1,A2,A4中选择最优特征及其最优切分点,结果是A2=1。并且依据计算可知,所得节点都是叶节点。
参考
- 李航.统计学习方法第二版