决策树(decision tree)是一种基本的分类与回归方法。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。
1. 决策树模型与学习
1.1 决策树模型
分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。
用决策树分类,从根结点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分到叶结点的类中。
图中圆和方框分别表示内部结点和叶结点:
1.2 决策树与if-then规则
可以将决策树看成一个if-then规则的集合。将决策树转换成if-then规则的过程是这样的:
由决策树的根结点到叶结点的每一条路径构建一条规则;路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。这就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。这里所谓覆盖是指实例的特征与路径上的特征一致或实例满足规则的条件。
1.3 决策树与条件概率分布
决策树还表示给定特征条件下类的条件概率分布。这一条件概率分布定义在特征空间的一个划分(partition)上。将特征空间划分为互不相交的单元(cell)或区域(region),并在每个单元定义一个类的概率分布就构成了一个条件概率分布。 决策树的一条路径对应于划分中的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。假设X为表示特征的随机变量,Y为表示类的随机变量,那么这个条件概率分布可以表示为P(Y|X)。X取值于给定划分下单元的集合,Y取值于类的集合。各叶结点(单元)上的条件概率往往偏向某一个类,即属于某一类的概率较大。决策树分类时将该结点的实例强行分到条件概率大的那一类去。
图5.2(a)示意地表示了特征空间的一个划分。图中的大正方形表示特征空间。这个大正方形被若干个小矩形分割,每个小矩形表示一个单元。特征空间划分上的单元构成了一个集合,X取值为单元的集合。为简单起见,假设只有两类:正类和负类,即Y取值为+1和–1。小矩形中的数字表示单元的类。图5.2(b)示意地表示特征空间划分确定时,特征(单元)给定条件下类的条件概率分布。图5.2(b)中条件概率分布对应于图5.2(a)的划分。当某个单元c的条件概率满足P(Y=+1|X=c)>0.5时,则认为这个单元属于正类,即落在这个单元的实例都被视为正例。图5.2(c)为对应于图5.2(b)中条件概率分布的决策树。
1.4 决策树学习
假设给定训练数据集,X为特征向量,n为特征个数,Y为类别标记。决策树学习的目标是根据给定的训练数据集构建一个决策树模型,使它能够对实例进行正确的分类。
决策树学习本质上是从训练数据集中归纳出一组分类规则。与训练数据集不相矛盾的决策树(即能对训练数据进行正确分类的决策树)可能有多个,也可能一个都没有。我们需要的是一个与训练数据矛盾较小的决策树,同时具有很好的泛化能力。从另一个角度看,决策树学习是由训练数据集估计条件概率模型。基于特征空间划分的类的条件概率模型有无穷多个。我们选择的条件概率模型应该不仅对训练数据有很好的拟合,而且对未知数据有很好的预测。
决策树学习用损失函数表示这一目标。如下所述,决策树学习的损失函数通常是正则化的极大似然函数。决策树学习的策略是以损失函数为目标函数的最小化。
当损失函数确定以后,学习问题就变为在损失函数意义下选择最优决策树的问题。因为从所有可能的决策树中选取最优决策树是NP完全问题,所以现实中决策树学习算法通常采用启发式方法,近似求解这一最优化问题。这样得到的决策树是次最优(sub-optimal)的。
决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
开始,构建根结点,将所有训练数据都放在根结点。选择一个最优特征,按照这一特征将训练数据集分割成子集,使得各个子集有一个在当前条件下最好的分类。如果这些子集已经能够被基本正确分类,那么构建叶结点,并将这些子集分到所对应的叶结点中去;如果还有子集不能被基本正确分类,那么就对这些子集选择新的最优特征,继续对其进行分割,构建相应的结点。如此递归地进行下去,直至所有训练数据子集被基本正确分类,或者没有合适的特征为止。最后每个子集都被分到叶结点上,即都有了明确的类。这就生成了一棵决策树。
以上方法生成的决策树可能对训练数据有很好的分类能力,但对未知的测试数据却未必有很好的分类能力,即可能发生过拟合现象。我们需要对已生成的树自下而上进行剪枝,将树变得更简单,从而使它具有更好的泛化能力。具体地,就是去掉过于细分的叶结点,使其回退到父结点,甚至更高的结点,然后将父结点或更高的结点改为新的叶结点。
如果特征数量很多,也可以在决策树学习开始的时候,对特征进行选择,只留下对训练数据有足够分类能力的特征。
可以看出,决策树学习算法包含特征选择、决策树的生成与决策树的剪枝过程。由于决策树表示一个条件概率分布,所以深浅不同的决策树对应着不同复杂度的概率模型。决策树的生成对应于模型的局部选择,决策树的剪枝对应于模型的全局选择。决策树的生成只考虑局部最优,相对地,决策树的剪枝则考虑全局最优。
决策树学习常用的算法有ID3、C4.5与CART,下面结合这些算法分别叙述决策树学习的特征选择、决策树的生成和剪枝过程。
2. 特征选择
2.1 特征选择问题
特征选择在于选取对训练数据具有分类能力的特征。这样可以提高决策树学习的效率。如果利用一个特征进行分类的结果与随机分类的结果没有很大差别,则称这个特征是没有分类能力的。经验上扔掉这样的特征对决策树学习的精度影响不大。通常特征选择的准则是信息增益或信息增益比。
2.2 信息增益
信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
定义5.2(信息增益)
特征A对训练数据集D的信息增益g(D,A),定义为集合D的经验熵H(D)与特征A给定条件下D的经验条件熵H(D|A)之差,即
一般地,熵H(Y)与条件熵H(Y|X)之差称为互信息(mutual information)。决策树学习中的信息增益等价于训练数据集中类与特征的互信息。
决策树学习应用信息增益准则选择特征。给定训练数据集D和特征A,经验熵H(D)表示对数据集D进行分类的不确定性。而经验条件熵H(D|A)表示在特征A给定的条件下对数据集D进行分类的不确定性。那么它们的差,即信息增益,就表示由于特征A而使得对数据集D的分类的不确定性减少的程度。显然,对于数据集D而言,信息增益依赖于特征,不同的特征往往具有不同的信息增益。信息增益大的特征具有更强的分类能力。
根据信息增益准则的特征选择方法是:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较它们的大小,选择信息增益最大的特征。
设训练数据集为D,|D|表示其样本容量,即样本个数。设有K个类,为属于类的样本个数。设特征A有n个不同的取值{a1,a2,…,an}。根据特征A的取值将D划分为n个子集D1,D2,…,Dn,|Di|为Di的样本个数。记子集Di中属于类Ck的样本的集合为Dik,即Dik=Di∩Ck,|Dik|为Dik的样本个数。于是信息增益的算法如
算法5.1 (信息增益的算法)
2.3 信息增益比
以信息增益作为划分训练数据集的特征,存在偏向于选择取值较多的特征的问题。当特征取值多的时候,计算出的信息增益往往较大。使用信息增益比(information gain ratio)可以对这一问题进行校正。这是特征选择的另一准则。
定义5.3 (信息增益比)
3.1 ID3算法
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。
具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一棵决策树。ID3相当于用极大似然法进行概率模型的选择。
算法5.2 (ID3算法)
- 输入:训练数据集,特征集,阈值;
- 输出:决策树T。
- 若中所有实例属于同一类,则为单结点树,并将类作为该结点的类标记,返回;
- 若,则为单结点树,并将中实例数最大的类作为该结点的类标记,返回;
- 否则,按算法5.1计算A中各特征对的信息增益,选择信息增益最大的特征;
- 如果的信息增益小于阈值,则置为单结点树,并将中实例数最大的类作为该结点的类标记,返回;
- 否则,对的每一可能值,依将分割为若干非空子集,将中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树,返回;
- 对第个子结点,以为训练集,以为特征集,递归地调用步(1)~步(5),得到子树,返回。
ID3算法只有树的生成,所以该算法生成的树容易产生过拟合。
3.2 C4.5的生成算法
C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进。C4.5在生成的过程中,用信息增益比来选择特征。
算法5.3(C4.5的生成算法)
- 输入:训练数据集,特征集,阈值;
- 输出:决策树。
- 如果中所有实例属于同一类,则置为单结点树,并将作为该结点的类,返回;
- 如果,则置为单结点树,并将中实例数最大的类作为该结点的类,返回;
- 否则,计算中各特征对的信息增益比,选择信息增益比最大的特征;
- 如果的信息增益比小于阈值,则置为单结点树,并将中实例数最大的类作为该结点的类,返回;
- 否则,对的每一可能值,依将分割为子集若干非空,将中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树,返回;
- 对结点,以为训练集,以为特征集,递归地调用步(1)~步(5),得到子树,返回。
4.决策树的剪枝
决策树生成算法递归地产生决策树,直到不能继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,即出现过拟合现象。过拟合的原因在于学习时过多地考虑如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为剪枝(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶结点,并将其根结点或父结点作为新的叶结点,从而简化分类树模型。
本节介绍一种简单的决策树学习的剪枝算法。
决策树的剪枝往往通过极小化决策树整体的损失函数(loss function)或代价函数(cost function)来实现。
剪枝,就是当α确定时,选择损失函数最小的模型,即损失函数最小的子树。当α值确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。
可以看出,决策树生成只考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减小模型复杂度。决策树生成学习局部的模型,而决策树剪枝学习整体的模型。
式(5.11)或式(5.14)定义的损失函数的极小化等价于正则化的极大似然估计。所以,利用损失函数最小原则进行剪枝就是用正则化的极大似然估计进行模型选择。
图5.6是决策树剪枝过程的示意图。下面介绍剪枝算法。
算法5.4 (树的剪枝算法)
- 输入:生成算法产生了整个树T,参数α;
- 输出:修剪后的子树。
- 计算每个结点的经验熵。
- 递归地从树的叶结点向上回缩。 设一组叶结点回缩到其父结点之前与之后的整体树分别为与,其对应的损失函数值分别是与,如果树的损失函数值小于等于的损失函数值,则进行剪枝,即将父结点变为新的叶结点。
- 返回第2步,直至不能继续为止,得到损失函数最小的子树Tα。
注意,新树与老树的损失函数值的比较只需考虑两个树的损失函数的差,其计算可以在局部进行。所以,决策树的剪枝算法可以由一种动态规划的算法实现。
5. CART算法
分类与回归树(classification and regression tree,CART)模型由Breiman等人在1984年提出,是应用广泛的决策树学习方法。CART同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。以下将用于分类与回归的树统称为决策树。
CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部结点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间即特征空间划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
- 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
- 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,这时用损失函数最小作为剪枝的标准。
5.1 CART生成
决策树的生成就是递归地构建二叉决策树的过程。对回归树用平方误差最小化准则,对分类树用基尼指数(Gini index)最小化准则,进行特征选择,生成二叉树。
回归树的生成
一棵回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值。
算法5.5(最小二乘回归树生成算法)
- 输入:训练数据集D;
- 输出:回归树f(x)。
在训练数据集所在的输入空间中,递归地将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树:
- 选择最优切分变量j与切分点s,求解使式5.19均方差最小的j,s。
- 用选定的对(j,s)划分区域并决定相应的输出值。
- 继续对两个子区域调用步骤(1),(2),直至满足停止条件。
- 将输入空间划分为M个区域R1,R2,…,RM,生成决策树。
分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值切分点。
定义5.4(基尼指数)
基尼指数值越大,样本集合的不确定性也就越大,这一点与熵相似。
算法5.6(CART生成算法)
- 输入:训练数据集D,停止计算的条件;
- 输出:CART决策树。
根据训练数据集,从根结点开始,递归地对每个结点进行以下操作,构建二叉决策树:
- 设结点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取的每个值a,根据样本点对A=a的测试为“是”或“否”将D分割成D1和D2两部分,利用式(5.25)计算A=a时的基尼指数。
- 在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征与最优切分点。依最优特征与最优切分点,从现结点生成两个子结点,将训练数据集依特征分配到两个子结点中去。
- 对两个子结点递归地调用(1),(2),直至满足停止条件。
- 生成CART决策树。
算法停止计算的条件是结点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
5.2 CART剪枝
CART剪枝算法从“完全生长”的决策树的底端剪去一些子树,使决策树变小(模型变简单),从而能够对未知数据有更准确的预测。CART剪枝算法由两步组成:首先从生成算法产生的决策树T0底端开始不断剪枝,直到T0的根结点,形成一个子树序列{T0,T1,…,Tn};然后通过交叉验证法在独立的验证数据集上对子树序列进行测试,从中选择最优子树。
5.2.1 剪枝,形成一个子树序列
对固定的α,一定存在使损失函数Cα(T)最小的子树,将其表示为Tα。Tα在损失函数Cα(T)最小的意义下是最优的。容易验证这样的最优子树是唯一的。当α大的时候,最优子树Tα偏小;当α小的时候,最优子树Tα偏大。极端情况,当α=0时,整体树是最优的。当α→∞时,根结点组成的单结点树是最优的。
5.2.2 在剪枝得到的子树序列T0,T1,…,Tn中通过交叉验证选取最优子树Tα
具体地,利用独立的验证数据集,测试子树序列T0,T1,…,Tn中各棵子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树T1,T2,…,Tn都对应于一个参数α1,α2,…,αn。所以,当最优子树Tk确定时,对应的αk也确定了,即得到最优决策树Tα。
算法5.7(CART剪枝算法)
- 输入:CART算法生成的决策树T0;
- 输出:最优决策树Tα。
- 设k=0,T=T0。
- 设α=+∞。
- 自下而上地对各内部结点t计算C(Tt),|Tt|以及g(t),α。这里,Tt表示以t为根结点的子树,C(Tt)是对训练数据的预测误差,|Tt|是Tt的叶结点个数。
- 对g(t)=α的内部结点t进行剪枝,并对叶结点t以多数表决法决定其类,得到树T。
- 设k=k+1,αk=α,Tk=T。
- 如果Tk不是由根结点及两个叶结点构成的树,则回到步骤(2);否则令Tk=Tn。
- 采用交叉验证法在子树序列T0,T1,…,Tn中选取最优子树Tα。