机器学习-决策树
机器学习—决策树
(一)决策树的基本流程
(二)决策树中节点的划分
(三)多变量决策树
四、决策树
正如西瓜书前言所述,从本章至第十章,主要介绍一些经典而常用的机器学习算法。这些方法大部分为分类方法,也穿插了少量回归算法(例如6.5节的支持向量回归);大部分为监督学习方法,少量为无监督学习方法(第九章的聚类和第十章的降维)。
(一)决策树的基本流程
1.1 决策树的基本概念
决策树(Decision Tree)是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一类常见的机器学习方法,也是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。Entropy = 系统的凌乱程度,使用算法ID3, C4.5和C5.0生成树算法使用熵。这一度量是基于信息学理论中熵的概念。
决策树是一种树形结构,其中树的最高层即为根节点,每个内部节点表示一个属性上的测试,每个分支代表一个测试输出(结果),而决策树的每一个叶节点代表一种类别。决策树是基于树结构来进行决策的,这恰是人类在面临决策问题时一种很自然的处理机制。
例如,我们针对西瓜问题中“是否为好瓜的判定作出决策,通常会进行一系列的判断或“子决策”:
- 我们先看,“色泽”这一属性,也即“该西瓜是什么颜色?”
=> 若“色泽”=“青绿色”
2. 则再看“根蒂”的属性,“西瓜的根蒂是什么形态?”
=> 若“根蒂”=“蜷缩”
3. 则判断“敲声”的属性,“西瓜敲起来是什么声音?”
=> 若“敲声”=“浊响”
4. 最后,结合以上判断,最终决策为,这是一个好瓜
以上,决策过程如下图所示:
在上图的决策树中,决策过程的每一次判定都是对某一属性的“测试”,决策最终结论则对应最终的判定结果。一般地,一棵决策树包含:唯一的根节点、若干个内部节点和若干个叶子节点。从而有:
- 叶节点对应于决策结果,其余,其余每个节点则对应于一个属性测试;
- 每个非叶子节点,表示一个特征属性测试。
- 每个分支,表示这个特征在某个值域上的输出、
- 每个叶子节点,存放一个类别。
- 每个节点包含的样本集合,通过属性测试被划分到子节点中,根节点包含样本全集。
决策树学习的目的:为了产生一棵泛化能力强,即处理未见示例能力强的决策树。
1.2 决策树的构造及基本流程
类似于树的数据结构,决策树学习的算法通常是一个递归地选择最优特征,并根据该特征对训练数据进行分割,使得各个子数据集有一个最好的分类的过程。这一过程对应着对特征空间的划分,也对应着决策树的构建。
终止条件: 在决策树基本算法中,有以下三种情形会导致递归返回:
情形(1) 叶节点(当前节点)包含的样本全属于同一类别,无需划分(这时直接将该节点标记为叶节点,并设为相应的类别)。
情形(2) 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分(这时将该节点标记为叶节点,并将其类别设为该节点所含样本最多的类别)。
情形(3) 当前节点包含的样本集合为空,不能划分(这时将该节点标记为叶节点,并将其类别设为父节点中所含样本最多的类别)。
说明:在情形(2)下,我们把当前节点标记为叶节点,并将其类别设定为该节点所含样本最多的类别;
在情形(3)下,同样把当前节点标记为叶节点,但将其类别设定为其父节点所含样本最多的类别。
注意这两种情形的处理实质不同:情形(2)是在利用当前节点的后验分布,而情形(3)则是把父节点的样本分布作为当前节点的后验分布。
决策树的基本流程遵循简单而直观的“分而治之”(divide-and-conquer)策略。
输入:训练集 D = \({(x_1,y_1), (x_2,y_2),\cdots,(x_m, y_m)}\);
属性集 A = \({a_1,a_2,\cdots,a_d}\).过程:函数 TreeGenerate(D,A)
1: 生成节点node:
2: if D中样本全属于同一类别C then
3: 将node标记为C类叶节点;
return; # 终止条件1(最好的情形)
4: end if5: if A = ∅ OR D中样本在A上取值相同then
6: 将node标记为叶节点,其类别标记为D中样本数最多的类;
return; # 终止条件2(属性用完或分不开的情形,使用后验分布)
7: end if8: 从A中选择最优划分属性\(a_{*}\);
9: for \(a_{*}\)的每一个值\(a_{*}^{v}\) do
10: 为node生成一个分支;令\(D_{v}\)表示D在D中在\(a_{*}\)上取值为\(a_{*}^{v}\) 的样本子集;
11: if \(D_{v}\) 为空 then
12: 将分支节点标记为叶节点,其类别标记为D中样本最多的类;
return; # 终止条件3(分支为空,使用先验分布)
13: else
14: 以TreeGenerate(\(D_{v}\), A \ { \(a_{*}\) })为分支节点
(若 \(a_{*}\)为连续属性,则不用去除,寻找下一个最优划分点可继续作为子节点的划分属性)
15: end if
16: end for
输出:以node为根节点的一棵决策树
从上述伪代码算法可以看出,决策树学习的关键在于算法的这一行:从A中选择最优划分属性\(a_{*}\);
由此可以看出:决策树学习的关键在于如何选择划分属性,不同的划分属性得出不同的分支结构,从而影响整颗决策树的性能。
所谓决策过程,就是不断根据某属性进行划分的过程(注意:每次决策时考虑范围是在上次决策结果的限定范围之内的),即“If...Else, If...Else”的决定过程。
但是数据集是不可能无限划分的,那么划分到什么时候就停止划分呢?这就是下面三个"return"代表的递归返回。
下面分别做一个解释:
首先,应该明白决策树的基本流程是根据某种原则(从A中选择最优划分属性\(a_{*}\))每次选择一个属性按属性的取值(例如西瓜的“触感”包括硬滑和软粘)进行划分(将所有“触感”为硬滑的西瓜分到一起,将所有“触感”为软粘的西瓜分到一起;根据该属性划分后,产生的各子集内部样本在该属性上的取值分别相同),依次再对各划分子集进行递归划分。
然而这里有几种特殊情况需要考虑:
(1) 划分期望得到的结果是各子集只包含同一类别的样本,例如好瓜(或坏瓜),若递归划分过程中某子集已经只含有某一类别的样本(例如只含好瓜),那么此时划分的目的已经达到了,无需再进行划分,这即为递归返回的情形(1);
(2)递归划分时每次选择一个属性,并且划分依据属性不能重复使用,例如本次根据“触感”对当前样本子集\(D\)进行划分时,那么后面对该子集\(D\)划分成的子集(以及子集的子集\(\cdots \cdots\))再次进行递归划分时不能再使用“触感”(TreeGenerate(\(D_{v}\), A \ { \(a_{*}\) })中的\(D_{v}\), A \ { \(a_{*}\) }表示从候选依据属性中将当前使用的依据属性去除,这是因为根据某属性划分之后,产生的各个子集在该属性上的取值相同);但样本的属性是有限的,因此划分次数不超过属性个数;若所有属性均已被作为划分依据,此时子集中仍含有多类样本(例如仍然同时含有好瓜和坏瓜),但是因已无属性可作为划分依据(即子集中样本在各属性上取值均相同,但却无法达到子集只包含同一类别的样本),此时只能少数服从多数,以此子集中样本数最多的类作为标记,此即为递归返回的情形(2)的A= ∅ ;
(3)迭代过程中,每递归一次,候选的属性个数就减少一个;假设现在还剩一个属性可用(比如“触感”),而且子集中仍含有多类样本(例如仍然同时含有好瓜和坏瓜),由于只剩一个属性可用,我们也只能在这个属性上划分,但是子集所有样本在该属性上的取值都相同(例如“触感”都是硬滑),就陷入了一个尴尬的境地,无法再继续划分了(无法继续划分的原因是因为属性取值都相同,其实剩余多个属性也类似的,划分就是根据属性的不同取值将当前样本集合分为多个子集,若当前样本集合在任何候选属性上的取值相同,则无法划分),此时也只能服从少数服从多数,以此子集中样本最多的类为标记,此即为递归返回的情形(2)中的“D中样本在A上取值相同”;
(4)根据某属性进行划分时,若该属性多个属性值中的某个属性值不包含任何样本(这可能是训练集的样本不够充分造成的),例如对当前子集D以“纹理”属性来划分,“纹理”共有三个值:清晰、稍糊、模糊,但发现当前子集D中并无样本“纹理”属性取值为稍糊(即子集D中样本或为清晰、或为稍糊),此时对于取值为清晰的子集和取值为稍糊的子集继续递归,而对于取值为模糊的分支,因为无样本落入,将其标记为叶节点,其类别标记为D中样本最多的类(即把父节点的样本分布作为当前节点的先验分布);
注意,此分支必须保留,因为测试时,可能会有样本落入该分支。此即递归返回的情形(3)如此用文字叙述还比较抽象,下面使用在表4.1西瓜数据集2.0上基于信息增益生成的图4.4决策树来具体说明:
(1) 根据“纹理”属性划分偶,发现“纹理”为模糊的3个样本全部是坏瓜,即递归返回的情形(1):当前节点包含的样本全属于同一类别,无需划分;
同理,接下来对“纹理”为清晰的样本,再次根据“根蒂”属性划分后,发现“根蒂”为蜷缩的样本全部是好瓜,“根蒂”为硬挺的样本全部是坏瓜,即递归返回的情形(1);此时只有“根蒂”为稍蜷的样本同时含有好瓜和坏瓜,因此需要继续进行划分:
(2) 接下来对“根蒂”为稍蜷的样本,再次根据“色泽”属性进行划分后,发现“色泽”为青绿的样本全部是好瓜,即递归返回的情形(1);发现没有“色泽”为浅白的样本,即递归返回情形(3):当前节点包含的样本集合为空,不能互粉;因此同样把当前节点标记为叶节点,将其类别设定为其父节点所含样本最多的类别,即好瓜(如下表所示,其父节点包含三个样本,其中两个为好瓜,一个不是好瓜):
(3) 注意:决策树的流程中没有出现递归返回情形(2),这是因为表4.1的西瓜数据集2.0样本数太少。假设表4.1的数据集只包含“纹理”和“根蒂”两个属性,则根据“纹理”划分之后,再对“纹理”为清晰的样本根据“根蒂”划分,发现两个属性都已使用,但“根蒂”为稍蜷的样本子集中仍同时包含好瓜和坏瓜,即递归返回的情形(2)的A = ∅.
此时将“根蒂”为稍蜷的节点标记为叶节点,并将其类别设定为该节点所含样本最多的类别,即“好瓜”(好瓜包含三个样本,其中两个为好瓜,一个不是好瓜)。
(4) 对于递归返回情形(2)的“D中样本在A上取值相同”,如下表所示(非表4.1数据,纯为解释该递归返回情形而编造的):
此时已根据“纹理”和“根蒂”两个属性进行划分,样本子集中仍同时包含好瓜和坏瓜,仍有“脐部”和“触感”两个属性可以使用,但当前子集中的样本在剩余的“脐部”和“触感”两个属性上的取值均相等(均为凹陷和硬滑),因此无法进行划分,因此将该节点标记为叶节点,并将其类别设定为该节点所含样本最多的类别,即“好瓜”(节点包含五个样本,其中三个为好瓜,两个不是好瓜)。
总结:(a) 划分期望得到的结果是各子集只包含同一类别的样本
(b) 使用的属性在后续各子集继续划分时不能再使用,因为各子集内的样本在该属性上取值相同,因为各子集内的样本在该属性上取值相同(仅针对离散属性,若是连续属性,则可以重复使用,如表4.3中的“密度”和“含糖率”);
(c) 对于递归返回情形(1),虽有可用属性但样本类别却已相同,可以理解为这些属性对当前划分不起作用;
(d) 对于递归返回情形(2),当前子集样本在所有属性上取值相同,但样本类别却不同,可以理解为样本集含的标记含有噪声(特征相同的样本,被标记的类别却不相同,可能是标记数据时弄错了),或应增加新特征(即当前的几种特征属性不足以描述样本);
(e) 决策树并不一定是二叉树,分支个数等于属性取值个数。
(二)决策树中节点的划分
2.1 三种度量节点“纯度”的指标:
什么样的划分属性是最优的?
我们希望决策树的分支结构所包含的样本尽可能属于同一类别,也即属性划分的目标是让各个划分出来的子节点尽可能地“纯”,节点的“纯度”越来越高,可以高效地从根节点到达叶节点,从而得到决策结果。
如何评价度量节点“纯度”?
三种度量节点“纯度”的指标:
- 信息增益 => ID3算法
- 增益率 => C4.5算法
- 基尼指数 => CART算法
2.1.1、信息增益
在信息论与概率统计中,熵(entropy)是表示随机变量不确定性的度量。
设X是一个取有限个值的离散随机变量,其概率分布为:
则随机变量X的熵定义为:
由定义可知,熵越大,随机变量的不确定性就越大。
“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为\(p_k(k = 1,2,\cdots,|K|)\),则D的信息熵定义为:
当样本集合D中只含某一类样本时信息熵Ent(D)最小:(若p = 0,则\(plog_2p = 0\))-
若D中只包含一类样本,则Ent(D)=0,此时纯度最高。
由定义关系式可知,信息熵Ent(D)的值越小,则D的纯度越高(\(p_k\)与Ent(D)成反比。
假定离散属性A有K个可能的取值\(\left\{a_1, a_2,\dots,a_K\right\}\),若使用A来对样本集D进行划分,则会产生K个分支结点,其中第k个分支节点包含了样本集D中所有在属性A上上取值为\(a_k\)的样本,记为\(D^{k}\)。
我们根据\(Ent(D) = -\sum \limits_{k=1}^{|y|} p_klog_2p_k\)计算出\(D^{k}\)的信息熵,再考虑到不同的分支节点所包含的样本数不同,给分支节点赋予权重\(\frac{|D^{k}|}{|D|}\),即样本数越多的分支节点的影响越多,于是可计算出用属性A对样本集D进行划分所获得的“信息增益”(information gain)
我们希望经过依据某属性划分后,划分所得各子集的纯度越高越好,即各子集的信息熵\(Ent(D^k)\)越小越好(若是各子集样本的类别相同,则所有子集的\(Ent(D^k)=0\)),也就是说,信息增益\(Gain(D,A)\)越大越好。
又由于划分所得各子集包含的样本个数有多有少,故以其所占比例\(\frac{|D^k|}{|D|}\)为权重进行加权。
设训练数据集为\(D\),\(|D|\)表示其样本容量(即样本个数)。
设有K个类\(C_k\),\(k = 1,2,\cdots,|C_k|\)为属于类\(C_k\)的样本个数,\(\sum \limits_{k=1}^{K} |C_k| = |D|\)。
设特征A有n个不同的取值\({a_1,a_2,\cdots,a_n}\),
根据特征A的取值将D划分为n个子集\(D_1,D_2,\cdots,D_n\),
\(|D_i|\)为\(D_i\)的样本个数,\(\sum \limits_{i=1}^{n} |D_i| = |D|\)。
记子集\(D_i\)中属于类\(C_k\)的样本的集合为\(D_{ik}\),即\(D_{ik} = D_i ∩ C_k\),\(|D_ik|\)为\(D_ik\)为\(D_ik\)的样本个数。
当熵和条件熵中的概率由数据估计(特别是极大似然估计)得到时,所对应的熵与条件熵分别称为经验熵(empirical entropy)和经验条件熵(empirical conditional entropy)。
此时,若概率为1或0,则令1log1=0或0log0=0。
信息增益(information gain)表示得知特征X的信息而使得类Y的信息的不确定性减少的程度。
[算法1]信息增益的算法
输入:训练数据集(当前样本集合)D和特征(离散属性)A
输出:特征A对训练数据D的信息增益\(g(D,A)\).
(1) 计算数据集D的经验熵\(H(D)\)(经验熵为《统计学习方法》的表述,等同于西瓜书的信息熵):
(2) 计算特征A对数据D的经验条件熵\(H(D|A)\):
(3) 计算信息增益:
一般来说,信息增益越大,则意味着使用属性A来进行划分所获得的“纯度提升”越大。
以下表中的西瓜数据集2.0为例,该数据集包含17个训练样例,用以学习一棵能预测没剖开的是不是好瓜的决策树。
若按照是否为“好瓜”进行分类决策,则此时\(|K|\) =2。在决策树学习开始时,根节点包含数据集\(D\)中的所有样例,其中正例(“好瓜”)占\(p_1\)= \(\frac {8}{17}\),反例(“坏瓜”)=\(\frac{9}{17}\)。
于是,根据公式\(Ent(D) = -\sum \limits_{k=1}^{|K|}p_klog_2p_k\)有:
然后,我们要计算出当前属性集合{色泽,根蒂,敲声,纹理,脐部,触感}中每个属性的信息增益。
以属性“色泽”为例,它有三个可能的取值:{青绿,乌黑,浅白}。
若使用该属性对数据集\(D\)进行划分,则可得到三个子集,分别记为:{\(D^{1}\)(色泽=青绿),\(D^{2}\)(色泽=乌黑),\(D^{3}\)(色泽=浅白)}。
子集\(D^{1}\)包含编号为{1,4,6,10,13,17}的6个样例,其中正例(“好瓜”)占\(p_1=\frac{3}{6}\),反例(“坏瓜”)占\(p_2=\frac{3}{6}\);
子集\(D^{2}\)包含编号为{2,3,7,8,9,15}的6个样例,其中正例(“好瓜”)占\(p_1=\frac{4}{6}\),反例(“坏瓜”)占\(p_2=\frac{2}{6}\);
子集\(D^{3}\)包含编号为{5,11,12,14,16}的6个样例,其中正例(“好瓜”)占\(p_1=\frac{1}{5}\),反例(“坏瓜”)占\(p_2=\frac{4}{5}\);
根据公式\(Ent(D) = -\sum \limits_{k=1}^{|K|}p_klog_2p_k\),可计算出用“色泽”划分之后所获得的3个分支节点的信息熵为:
于是,根据\(Ent(D) - \sum \limits_{k=1}^{K}\frac {|D^{k}|}{|D|}Ent(D^{k})\),可计算出属性“色泽”的信息增益为:
类似的,以属性“根蒂”为例,它有三个可能的取值:{蜷缩,稍蜷,硬挺}。
若使用该属性对数据集\(D\)进行划分,则可得到三个子集,分别记为:{\(D^{1}\)(根蒂=蜷缩),\(D^{2}\)(根蒂=稍蜷),\(D^{3}\)(根蒂=硬挺)}。
子集\(D^{1}\)包含编号为{1,2,3,4,5,12,16,17}的6个样例,其中正例(“好瓜”)占\(p_1=\frac{5}{8}\),反例(“坏瓜”)占\(p_2=\frac{3}{8}\);
子集\(D^{2}\)包含编号为{6,7,8,9,13,14,15}的7个样例,其中正例(“好瓜”)占\(p_1=\frac{3}{7}\),反例(“坏瓜”)占\(p_2=\frac{4}{7}\);
子集\(D^{3}\)包含编号为{10,11}的6个样例,其中正例(“好瓜”)占\(p_1=\frac{0}{2}\),反例(“坏瓜”)占\(p_2=\frac{2}{2}\);
根据公式\(Ent(D) = -\sum \limits_{k=1}^{|K|}p_klog_2p_k\),可计算出用“根蒂”划分之后所获得的3个分支节点的信息熵为:
于是,根据\(Ent(D) - \sum \limits_{k=1}^{K}\frac {|D^{k}|}{|D|}Ent(D^{k})\),可计算出属性“根蒂”的信息增益为:
同样的,我们可以计算出其他属性的信息增益:
我们选择信息增益最大的属性(“纹理”),作为划分属性,也即为最优特征。
下图为基于“纹理”对根节点进行划分的结果,各分支节点所包含的样例子集显示在节点中。
然后,决策树学习算法将对每个分支节点做进一步划分。
以上图第一个分支节点(“纹理”=“清晰”)为例,该节点包含的样例集合\(D^{1}\)中有编号为{1,2,3,4,5,6,8,10,15}的9个样例,可用属性集合为{色泽,根蒂,敲声,脐部,触感}
基于\(D_{1}\)计算出各属性的信息增益:
以上,“根蒂”,“脐部”,“触感”三个属性均取得了最大的信息增益,可任选其之一作为划分依据。类似的,对每个分支节点进行上述操作,最终得到决策树如下图所示。
例题[1] 根据信息增益准则选择最优特征
对下表所给出的训练数据集D,根据信息增益准则选择最优特征。(来源-统计学习方法)
下表数据包括贷款申请人的4个特征(属性):
第一个特征是年龄,有三个可能值{青年,中年,老年};
第二个特征是有工作,有两个可能值{是,否};
第三个特征是有自己的房子,有两个可能值{是,否};
第四个特征是信贷情况,有三个可能值{非常好,好,一般}。
表的最后一列是类别,是否同意贷款,取两个值{是,否}。
解:
首先计算经验熵H(D):以“类别”作为决策结果,则\(|K|=2\).
根据\(H(D) = -\sum \limits_{k=1}^{K} \frac{|C_k|}{D} log_2 \frac{C_k}{D}\)有:
然后分别计算各特征对数据集D的信息增益。分别记为:{\(A_1\)(年龄),\(A_2\)(有工作),\(A_3\)(有自己的房子),\(A_4\)(信贷情况)},则:
(1) 对于\(A_{1}\)(年龄),若使用该属性对数据集\(D\)进行划分,则可得到三个子集,分别记为:{\(D^{1}\)(年龄=青年),\(D^{2}\)(年龄=中年),\(D^{3}\)(年龄=老年)}。
子集\(D^{1}\)包含编号为{1,2,3,4,5}的5个样例,其中正例(“是”)占\(p_1=\frac{2}{5}\),反例(“否”)占\(p_2=\frac{3}{5}\);
子集\(D^{2}\)包含编号为{6,7,8,9,10}的5个样例,其中正例(“是”)占\(p_1=\frac{3}{5}\),反例(“否”)占\(p_2=\frac{2}{5}\);
子集\(D^{3}\)包含编号为{11,12,13,14,15}的5个样例,其中正例(“是”)占\(p_1=\frac{4}{5}\),反例(“否”)占\(p_2=\frac{1}{5}\);
根据公式\(H(D) = -\sum \limits_{k=1}^{K} \frac{|C_k|}{D} log_2 \frac{C_k}{D}\),可计算出用“年龄”划分之后所获得的3个分支节点的信息熵为:
类似地,
(2)对于\(A_{2}\)(有工作):若使用该属性对数据集\(D\)进行划分,则可得到两个子集,分别记为:{\(D^{1}\)(有工作=是),\(D^{2}\)(有工作=否)}
子集\(D^{1}\)包含编号为{3,4,8,13,14}的5个样例,其中正例(“是”)占\(p_1=\frac{5}{5}\),反例(“否”)占\(p_2=\frac{0}{5}\);
子集\(D^{2}\)包含编号为{1,2,5,6,7,9,10,11,12,15}的10个样例,其中正例(“是”)占\(p_1=\frac{4}{10}\),反例(“否”)占\(p_2=\frac{6}{10}\);
(3)对于\(A_{3}\)(有自己的房子):若使用该属性对数据集\(D\)进行划分,则可得到两个子集,分别记为:{\(D^{1}\)(有自己的房子=是),\(D^{2}\)(有自己的房子=否)}
子集\(D^{1}\)包含编号为{4,8,9,10,11,12}的6个样例,其中正例(“是”)占\(p_1=\frac{6}{6}\),反例(“否”)占\(p_2=\frac{0}{6}\);
子集\(D^{2}\)包含编号为{1,2,3,5,6,7,13,14,15}的9个样例,其中正例(“是”)占\(p_1=\frac{3}{9}\),反例(“否”)占\(p_2=\frac{6}{9}\);
(4)对于\(A_{4}\)(信贷情况):若使用该属性对数据集\(D\)进行划分,则可得到三个子集,分别记为:{\(D^{1}\)(信贷情况=一般),\(D^{2}\)(信贷情况=好),\(D^{3}\)(信贷情况=非常好)}
子集\(D^{1}\)包含编号为{1,4,5,6,15}的5个样例,其中正例(“是”)占\(p_1=\frac{1}{5}\),反例(“否”)占\(p_2=\frac{4}{5}\);
子集\(D^{2}\)包含编号为{2,3,7,8,12,13}的6个样例,其中正例(“是”)占\(p_1=\frac{4}{6}\),反例(“否”)占\(p_2=\frac{2}{6}\);
子集\(D^{3}\)包含编号为{9,10,11,14}的4个样例,其中正例(“是”)占\(p_1=\frac{4}{4}\),反例(“否”)占\(p_2=\frac{0}{4}\);
最后,比较各特征值的信息增益值{(\(A_1\)=0.083),(\(A_2\)=0.324),(\(A_3\)=0.420),(\(A_4\)=0.363)}。
由于特征值\(A_3\)(有自己的房子)的信息增益值最大,所以选择特征值\(A_3\)作为最优特征。
2.1.2、增益率
实际上,以信息增益作为划分训练数据集的特征,信息增益准则对可取值数目较多的属性有所偏好,存在偏向于选择取值较多的特征的问题。使用增益率(信息增益比)(information gain ratio)可以对这一问题进行校正。
增益率(信息增益比)的定义:
特征(属性)A对训练数据集(当前样本集合)D的增益率(信息增益比)\(g_{R}(D,A)\)定义为其信息增益\(g(D,A)\)与训练数据集D关于特征A的值的熵\(H_{A}(D)\)之比,也即
其中,
称为属性A的“固有值”(intrinsic value),n为特征取值的个数。
特征(属性)A的可能取值数目越多(也即V越大),则\(IV(A)\)的值通常会越大。
例如,对西瓜数据集2.0,有IV(触感)=0.874(V=2),IV(色泽)=1.580(V=3),IV(编号)=4.088(V=17)。
为理解上式(4.4)“固有值”的概念,可以将式(4.4)与(4.1)进行比较。
式(4.1)可重写为:
\(Ent(D) = -\sum \limits_{k=1}^{|\mathcal{Y}|}p_k log_2 p_k = - \sum \limits_{k=1}^{|\mathcal{Y}|} \frac{|\mathcal{D}^k|}{|\mathcal{D}|}log_2 \frac{|\mathcal{D}|}{|\mathcal{D}|}\).
其中\(p_k = \frac{|D^k|}{|D|}\),为第k类样本所占的比例。
与式(4.4)的表达式作对比:\(IV(A) = -\sum \limits_{v=1}^{V} \frac{\mathcal{D}^v}{|\mathcal{D}|}log_2 \frac{\mathcal{D}^v}{\mathcal{D}}\)
其中\(p_v = \frac{|D^v|}{|D|}\),为属性A等于第v个属性值的样本所占的比例。
即式(4.1)是按样本集合D的类别标记计算的信息熵,而式(4.4)是按属性A的取值计算的信息熵(相当于将属性A作为类别)。
这里考虑一种特殊情况:若属性A的取值与类别标记一一对应,则\(Ent(D) = IV(A)\),式(4.2)中第二项等于零,此时式(4.3)的增益率等于1。
需注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法的思想是:并不直接选择增益率最大的属性作为划分候选属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
2.1.3、基尼值&基尼指数
[注]在西瓜书中对于\(Gini(D)\)称为基尼值,对于\(Gini(D,A)\)称为基尼指数。实际上,在《统计学习方法》蓝皮书中没有严格区分,\(Gini(D)\)仅为\(Gini()\)
基尼值的定义:在分类问题中,假设有K个类,样本点属于第k类的概率为\(p_k\),
采用与信息熵\(Ent(D) = - \sum \limits_{k=1}^{K}p_klog_2p_k\)相同的符号,则数据集D概率分布(D的纯度)可用基尼值表示。定义为
(4.5)的推导:
假设数据集D中样例标记种类共有三类,每类样本所占比例分别为\(p_1,p_2,p_3\)。现从数据集D中随机抽取两个样本,如下表所示
\(p_1\) \(p_2\) \(p_3\) \(p_1\) \(p_1p_1\) \(p_1p_2\) \(p_1p_3\) \(p_2\) \(p_2p_1\) \(p_2p_2\) \(p_2p_3\) \(p_3\) \(p_3p_1\) \(p_3p_2\) \(p_3p_3\) 两个样本标记正好一致的概率为(即对角线元素之和):
\(p_1p_1 + p_2p_2 + p_3p_3 = \sum \limits_{k=1}^{|\mathcal{Y}|=3}p_k^2\)
两个样本标记不一致的概率为(即“基尼值”):
\(Gini(D) = p_1p_2 + p_1p_3 + p_2p_1 + p_2p_3 + p_3p_1 + p_3p_2 = \sum \limits_{k=1}^{|\mathcal{Y}|=3}\sum \limits_{k' \neq k}p_k p_{k'}\)
很容易证明(提取公因式即可,注意\(p_1+p_2+p_3 = 1\))
\((p_1p_1 + p_2p_2 + p_3p_3) +(p_1p_2 + p_1p_3 + p_2p_1 + p_2p_3 + p_3p_1 + p_3p_2) \\ =(p_1p_1 + p_1p_2 + p_1p_3) + (p_2p_1 + p_2p_2 + p_2p_3) + (p_3p_1 + p_3p_2 + p_3p_3) \\= p_1(p_1 + p_2 + p_3) + p_2(p_1 + p_2 + p_3) + p_3(p_1+p_2+p_3) \\ =p_1 + p_2 + p_3 = 1\)
即得式(4.5):
\(Gini(D) = \sum \limits_{k=1}^{|\mathcal{Y}|}\sum \limits_{k'\neq k} p_kp_{k'} = 1 - \sum \limits_{k=1}^{|\mathcal{Y}|}p_k^2\).
从一个数据集D中任取两个样本,类别标记一致的概率越大表示其纯度越高(即大部分样本属于同一类);
类别标记不一致的概率(即基尼值)越大表示纯度越差;因此选择使各划分子集的基尼值尽可能小的属性作为划分属性,基尼指数即各子集基尼值的加权平均。
对于二分类问题,若样本点属于一个类的概率为\(p\),则概率分布的基尼值为
对于给定的样本集合D,其基尼值为:
其中,\(C_k\)是D中属于第k类的样本子集,K是类的个数。
直观来说,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。
基尼指数的定义
如果样本集合D根据特征A是否取某一可能值a被分割成\(D_1\)和\(D_2\)两部分,即
采用与信息增益\(Gain(D,A) = Ent(D) - \sum \limits_{k=1}^{K} \frac{|D^{k}|}{|D|}Ent(D^{k})\)相同的符号表示,
则在特征A的条件下,集合D的基尼指数定义为
基尼指数Gini(D)表示集合D的不确定性,基尼指数Gini(D,A)表示经A=a分割后集合D的不确定性。
基尼指数的值越大,样本集合的不确定性也就越大,这一点与熵相似。
于是,我们在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,
即\(A_{*} = \underset{a∈A}{\arg \min}\)Gini_index(D,A).
下图显示二分类问题中基尼指数\(Gini(p)\)、熵(单位比特)的一半\(\frac{H(p)}{2}\)和分类误差率的关系。
其中,横坐标表示概率\(p\),纵坐标表示损失。可以看出基尼指数和\(\frac{H(p)}{2}\)的曲线很接近,都可以近似地代表分类误差率。
2.2 决策树的生成算法
三种主要的决策树算法:ID3, C4.5,CART
2.2.1、ID3决策树学习算法
ID3的构造准则是信息增益。
ID3算法的基本思想是,以信息熵为度量,用于决策树节点的属性选择,每次优先选取信息量最多的属性,亦即能使熵值变为最小的属性,以构造一棵熵值下降最快的决策树,到叶子节点处的熵值为0。此时,每个叶子节点对应的实例集中的实例属于同一类。
[算法2]ID3算法
输入:训练数据集D,特征集A阈值ε;
输出:决策树T。
(1)若D中所有实例属于同一类\(C_{k}\),则T为单节点树,并将类\(C_k\)作为该节点的类标记,返回T;
(2)若A=∅,则T为单节点树,并将D中实例数最大的类\(C_{k}\)作为该节点的类标记,返回T
(3)否则,按照信息增益准则算法计算特征集A中各特征对数据集D的信息增益,选择信息增益最大的特征值\(A_{g}\);
(4)如果A_g的信息增益小于阈值ε,则置T为单节点树,并将数据集D中实例数最大的类\(C_{k}\)作为该节点的类标记,返回T;
(5)否则,对\(A_g\)的每一个可能值\(a_{i}\),依据\(A_g\)=\(a_i\)将D分割为若干个非空子集\(D_i\),将\(D_i\)中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;
(6)对第i个子节点,以\(D_{i}\)为训练集,以\(A-{A_{g}}\)为特征集,递归地调用步骤(1)-步骤(5),得到子树\(T_{i}\),返回\(T_i\)
例题[2] 利用ID3算法建立决策树
对下表的训练数据集,利用ID3算法建立决策树(来源-统计学习方法)
根据[例1]的结果,由于特征\(A_3\)(有自己的房子)的信息增益值最大,所以选择特征\(A_3\)作为根节点的特征。
它将训练数据集D划分为两个子集\(D_1\)(有自己的的房子=是),\(D_2\)(有自己的房子=否)。由于\(D_1\)只有一类的样本点,所以将它作为叶节点,节点的类标记为“是”。
对\(D_2\)则需从特征\(A_1\)(年龄),\(A_2\)(有工作)和\(A_4\)(信贷情况)中选择新的特征。计算各个特征的信息增益:
选择信息增益最大的特征\(A_2\)(有工作)作为节点的特征。由于\(A_{2}\)有两个可能取值,从这一节点引出两个子节点:
一个对应“是”(有工作)的子节点,包含3个样本,它们属于同一类,因此这是一个叶节点,类标记为“是”;
另一个是对应“否”(无工作)的子节点,包含6个样本,它们也属于同一类,这也是一个叶节点,类标记为“否”。
由图可见,该决策树只用了两个特征(有两个内部节点)。
ID3算法只有树的生成,因此该算法生成的树容易产生过拟合。
2.2.2、C4.5决策树学习算法
C4,5算法与ID3算法相似,C4.5算法在ID3算法的基础上进行了改进。C4.5在生成过程中,使用增益率(信息增益比)来选择特征(划分属性)。
[算法3]C4.5的生成算法
输入:训练数据集D,特征集A阈值ε;
输出:决策树T。
(1)如果数据集D中所有实例属于同一类\(C_{k}\),则置T为单节点=树,并将\(C_{k}\)作为该节点的类,返回T;
(2)如果A=∅,则置T为单节点树,并将D中实例树最大的类\(C_{k}\)作为该节点的类,返回T;
(3)否则,按照\(g_R(D,A) = \frac{g(D,A)}{H_{A}(D)}\)计算A中各特征对D的信息增益比,选择信息增益比最大的特征\(A_{g}\);
(4)如果\(A_{g}\)的信息增益比小于阈值ε,则置T为单节点树,并将D中实例数最大的类\(C_{k}\)作为该节点的类,返回T;
(5)否则,对\(A_{g}\)的每一可能值\(a_{i}\),依\(A_{g} = a_{i}\)将D分割为子集若干非空\(D_{i}\),将\(D_{i}\)中实例数最大的类作为标记,构建子节点,由节点及其子节点构成树T,返回T;
(6)对节点\(i\),以\(D_{i}\)为训练集,以A-{\(A_{g}\)}为特征集,递归地调用步骤(1)~步骤(5),得到子树\(T_{i}\),返回\(T_{i}\)。
连续与缺失值
连续值处理
现实学习任务中常会遇到连续属性,有必要讨论如何在决策树学习中使用连续属性。
由于连续属性的可取值数目不再有限,因此,不能直接根据连续属性的可取值来对节点进行划分。此时,就要用到连续属性离散化技术。其中最简单的策略是采用二分法(bi-partition)对连续属性进行处理,这正是C4.5决策树算法中采用的机制。
给定样本集D和连续属性A,假定A在D上出现了n个不同的取值,将这些值从小到大排序,记为{\(a^{1},a^{2},\cdots,a^{n}\)}。基于划分点\(t\)可将D分为子集\(D_t^{-}\)和\(D_t^{+}\),其中\(D_t^{-}\)包含那些在属性A上取值不大于t的样本,而\(D_t^{+}\)则包含那些在属性A上取值大于t的样本。
显然,对相邻的属性取值\(a^{i}\)和\(a^{i+1}\)来说,\(t\)在区间[\(a^i,a^{a+1}\))中取任意值所产生的划分结果相同。因此,对于连续属性A,我们可考察包含n-1个元素的候选划分点集合。
即把区间[\(a^{i}\), \(a^{i+1}\))的中位点\(\frac{a^{i}+a^{i+1}}{2}\)作为候选划分点。然后,我们就可像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集合的划分。例如可对信息增益公式\(Gain(D,A) = Ent(D) - \sum \limits_{v=1}^{V} \frac{|D^{v}|}{|D|}Ent(D^{v})\)进行改造
基于\(Gain(D,A,t)\)是样本集合D基于划分点t二分后的信息增益。于是,我们就可选择使\(Gain(D,A,t)\)最大化的划分点。
对属性“密度”,在决策树学习开始时,根节点包含的17个训练样本在该属性上取值均不同。根据\(T_a = \left\{\frac{a^{i}+a^{i+1}}{2} \quad | 1 ≤ i ≤ n-1\right\}\),该属性的候选划分点集合包含16个候选值:\(T_{密度}=\){0.244,0.294,0.351,0.381,0.420,0.459,0.518,0.574,0.600,0.621,0.636,0.648,0.661,0.681,0.708,0.746}
由\(Gain(D,A) = \max \limits_{t∈T_a} Gain(D,A,t) = \max \limits_{t∈T_a} Ent(D) - \sum \limits_{\lambda∈{(-,+})} \frac{|D_t^{\lambda}|}{|D|}Ent(D_t^{\lambda})\)可计算出属性“密度”的信息增益为0.262,对应于0.381。
对属性“含糖率”,其候选划分点集合也包含16个候选值:
\(T_{含糖率}=\){0.049,0.074,0.095,0.101.0,126,0.155,0.179,0.204,0.213,0.226,0.250,0.265,0.292,0.344,0.373,0.418}.类似的,根据上式可计算出属性“含糖率”的信息增益为0.349,对应于划分点0.126。
再由于信息增益准则,可知表上数据各属性的信息增益为:
于是,“纹理”被选作根节点划分属性,此后节点划分过程递归进行,最终生成如下所示的决策树
需注意的是,与离散属性不同,若当前节点划分属性为连续属性,该属性还有可作为其后代节点的划分属性。
缺失值处理
现实任务中常会遇到不完整样本,即样本的某些属性值缺失。例如由于诊测成本、隐私保护等因素,患者的医疗数据在某些属性上的取值(如HIV测试结果)未知;尤其是在属性数目较多的情况下,往往会有大量样本出现缺失值。如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,显然是对数据信息极大的浪费。
例如,下表是西瓜数据集2.0出现缺失值的版本,如果放弃不完整样本,则仅有编号{4,7,14,16}的4个样本能被使用。显然,有必要考虑利用有缺失属性值的训练样例来进行学习。
我们需解决两个问题:
(1)如何在属性值缺少的情况下进行划分属性选择?
(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
给定训练集D和属性A,令\(\tilde{D}\)表示D在属性A上没有缺失值的样本子集。
对于问题(1),显然我们仅可根据\(\tilde{D}\)来判断属性A的优劣。假定属性A有V个可取值{\(a^1,a^2,\cdots,a^V\)},令\(\tilde{D^v}\)表示\(\tilde{D}\)中在属性a上取值为\(a^v\)的样本子集,\(\tilde{D_k}\)表示\(\tilde{D}\)中属于第k类(k=1,2,...,|y|)的样本子集,则显然有\(\tilde{D}= U_{k=1}^{|y|}\tilde{D_k}\),\(\tilde{D} = U_{v=1}^{V}\tilde{D^{v}}\)。假定我们为每个样本x赋予一个权重\(w_x\),并定义
直观地看,对于属性A,\(p\)表示无缺失值样本所占的比例,\(\tilde{p_k}\)表示无缺失样本中第k类所占的比例,\(\tilde{r_v}\)则表示无缺失值样本中在属性a上取值\(a^{v}\)的样本所占的比例。显然,\(\sum_{k=1}^{|y|}\tilde{p_k}=1\),\(\sum_{v=1}^{V}\tilde{r_v}=1\).
基于上述定义,我们可将信息增益的计算式推广为
其中由式\(Ent(D) = -\sum\limits_{k=1}^{|y|}p_klog_2p_k\).有
对于问题(2),若样本x在划分属性A上的取值已知,则将x划入与其取值对应的子节点,且样本权值在子节点中保持为\(w_x\)。若样本x在划分属性A上的取值未知,则将x同时划入所有子节点,且样本权植在与属性值\(a^v\)对应的子节点中调整为\(\tilde{r_v}*w_x\);
直观地看,这就是让同一个样本以不同的概率划入到不同的子节点中去。
接下来,我们以上面缺失数据的表为例来生成一棵决策树。
在学习开始时,根节点包含样本集D中全部17个样例,各样例的权值均为1。以属性“色泽”为例,该属性上无缺失值的样例子集\(\tilde{D}\)包含编号为{2,3,4,6,7,8,9,10,11,12,14,15,16,17}的14个样例。显然,\(\tilde{D}\)的信息熵为
令\(\tilde{D^1},\tilde{D^2}\)与\(\tilde{D^3}\)分别表示在属性“色泽”上取值为“青绿”,“乌黑”以及“浅白”的样本子集,有
因此,样本子集\(\tilde{D}\)上属性“色泽”的信息增益为
于是,样本集D上属性“色泽”的信息增益为
类似地,可计算出所有属性在D上的信息增益:
“纹理”在所有属性中取得了最大的信息增益,被用于对根节点进行划分。划分结果是使编号为{1,2,3,4,5,6,15}的样本进入“纹理=清晰”分支,编号为{7,9,13,14,17}的样本进入“纹理=稍糊”分支,而编号为{11,12,16}的样本进入“纹理=模糊”分支,且样本在各子节点中的权重保持为1。
需注意的是,编号为{8}的样本在属性“纹理”上出现了缺失值,因此它将同时将进入三个分支中,但权重在三个子节点中分别调整为\(\frac{7}{15}、\frac{5}{15}、\frac{3}{15}\)。编号为{10}的样本有类似划分结果。
上述节点划分过程递归执行,最终生成的决策树如下图所示。
2.2.3、CART决策树学习算法
CART决策树[分类与回归树(classification and regression tree,CART)] [Breiman et al.,1984]由Breiman等人在1984年提出,是应用广泛的决策树学习方法。使用“基尼指数”(Gini index)来选择划分属性(特征)。
CART同样由特征选择、树的生成及剪枝组成,既可以用于分类也可以用于回归。
CART是在给定输入随机变量X条件下输出随机变量Y的条件概率分布的学习方法。CART假设决策树是二叉树,内部节点特征的取值为“是”和“否”,左分支是取值为“是”的分支,右分支是取值为“否”的分支。这样的决策树等价于递归地二分每个特征,将输入空间(即特征空间)划分为有限个单元,并在这些单元上确定预测的概率分布,也就是在输入给定的条件下输出的条件概率分布。
CART算法由以下两步组成:
(1) 决策树生成:基于训练数据集生成决策树,生成的决策树要尽量大;
(2) 决策树剪枝:用验证数据集对已生成的树进行剪枝并选择最优子树,此时改用损失函数最小作为减枝的标准。
2.2.3.1 CART决策树生成
2.2.3.1.1 回归树的生成
对回归树用平均误差最小化准则。
假设X和Y分别为输入变量和输出变量,并且输出变量Y是连续变量,给定训练数据集
下面考虑如何生成回归树:
一棵回归树对应着输入空间(即特征空间)的一个划分以及在划分的单元上的输出值。假设已将输入空间划分为M个单元\(R_1,R_2,\cdots,R_M\),并且在每个单元\(R_m\)上有一个固定的输出值\(c_m\),于是回归树模型可表示为
接下来需要对输出空间X进行空间划分,这里采用启发式的方法:
选择第j个变量\(x^{(j)}\)作为切分变量(splitting variable),选择变量\(x^{(j)}\)的取值\(s\)作为切分点(splitting point),从而可以得到两个区域:
然后在空间区域中寻找最优切分变量\(j\)和最优切分点\(s\)。
具体求解如下:
当输入空间X的划分确定时,则可以平方误差\(\sum \limits_{x_{i} ∈ R_{m}}(y_i - f(x_i))^{2}\)来表示回归树对于训练数据的预测误差,用平方误差最小的准则来求解每个单元上的最优输出值。
遍历变量\(j\),对固定的切分变量\(j\)扫描切分点\(s\),选择使上式达最小值的对象\((j,s)\).
易知,单元\(R_m\)上的\(c_m\)的最优值\(\hat c_m\)是\(R_m\)上的所有输入实例\(x_i\)对应的输出\(y_i\)的均值,即
对固定输入变量\(j\)可以找到最优切分点\(s\)。
遍历所有输入变量,找到最优的切分变量\(j\),构成一个对\((j,s)\)。依次将输入空间X划分为两个区域。
接着,对每个区域重复上述划分过程,直到满足停止条件为止。这样就生成一棵“最小二乘回顾树”(least squares regression tree)。
[算法4](最小二乘回归树生成算法)
输入:训练数据集;
输出:回归树\(f(x)\)。
在训练数据集合所在的输入空间X中,递归地将每个区域划分为两个子区域并决定每个子区域熵的输出值,构建二叉决策树;
(1)选择最优切分变量\(j\)与切分点\(s\),求解
遍历变量\(j\),对固定的切分变量\(j\)扫描切分点\(s\),选择使上式达最小值的对象\((j,s)\).
(2)用选定的对\((j,s)\)划分区域并决定相应的输出值:
(3)继续对两个子区域调用步骤(1)(2),直到满足停止条件
(4)将输入空间划分为M个区域\(R_1,R_2,\cdots,R_M\),生成决策树:
2.2.3.1.2 分类树的生成
分类树用基尼指数选择最优特征,同时决定该特征的最优二值化切分点。
[算法5](CRAT生成算法)
输入:训练数据集D,停止计算的条件
输出:CART决策树
根据训练数据集D,从根节点开始,递归地对每个节点,进行以下操作,构建二叉决策树:
(1)设节点的训练数据集为D,计算现有特征对该数据集的基尼指数。此时,对每一个特征A,对其可能取得的每个值a,根据样本点对A = a的测试为“是”或“否”,将D分割为\(D_{1}\)和\(D_2\)两部分,利用基尼指数的定义式\(Gini(D,A) = \frac{|D_1|}{|D|}Gini(D_1) + \frac{|D_2|}{|D|}Gini(D_2)\)计算A=a时的基尼指数。
(2)在所有可能的特征A以及它们所有可能的切分点a中,选择基尼指数最小的特征及其对应的切分点作为最优特征和最优切分点。依最优特征与最优切分点,从现节点生成两个子节点,将训练数据集依特征分配到两个子节点中去。
(3)对两个子节点递归地调用步骤(1)(2),直到满足停止条件。
(4)生成CART决策树。
算法停止计算的条件是,节点中的样本个数小于预定阈值,或样本集的基尼指数小于预定阈值(样本基本属于同一类),或者没有更多特征。
例题[3]应用CART算法生成决策树。
根据下表所给训练数据集,应用CART算法生成决策树。
解 首先计算各特征的基尼指数,选择最优特征以及其最优切分点。j将A分别记为:{\(A_1\)(年龄),\(A_2\)(有工作),\(A_3\)(有自己的房子),\(A_4\)(信贷情况)}, 其中\(A_1\){(\(A_1=1\),青年),(\(A_1=2\),中年),(\(A_3=1\),老年)};\(A_2\){(\(A_2=1\),是),(\(A_2=2\),否)};\(A_3\){(\(A_3=1\),非常好),(\(A_3=2\),好)(,\(A_3=3\),一般)};
求特征\(A_1\)的基尼指数:
由于\(Gini(D,A_1 = 1)\)和\(Gini(D,A_1 = 3)\)相等,且最小,所以\(A_1 = 1\)和\(A_1 = 3\)都可以选作\(A_1\)的最优切分点。
求特征\(A_2\)和\(A_3\)的基尼指数:
由于\(A_2\)和\(A_3\)只有一个切分点,所以它们就是最优切分点。
求特征\(A_4\)的基尼指数:
\(Gini(D, A_4=3)\)最小,所以\(A_4=3\)为\(A_4\)的最优切分点。
在\(A_1\),\(A_2\),\(A_3\),\(A_4\)几个特征中,\(Gini(D, A_3 = 1)\) = 0.27最小,所以选择特征\(A_3\)为最优特征,\(A_3=1\)为其最优切分点。于是根节点生成两个子节点,一个是叶节点,对另外一个节点继续使用以上方法在\(A_1,A_2,A_4\)中选择最优特征及其最优切分点,结果是\(A_2=1\)。依次计算得知,所得节点都是叶节点。
以下,为生成的决策树,与按照ID3算法所生成的决策树完全一致。
2.2.3.2 CART决策树剪枝
CART剪枝算法的作用:从“完全生长”的决策树的低端剪去一些子树,使决策树变小(模型变简单),从而能够使得对未知数据有更准确的预测。
CART剪枝算法的步骤:
(1) 首先,从生成算法产生的决策树\(T_{0}\)底端开始不断剪枝,直到\(T_{0}\)的根节点,形成一个子树序列\({T_0,T_1,\cdots,T_n}\)
(2) 然后,通过交叉验证法在独立的验证数据集熵对子树序列进行测试,从中选择最优子树。
1.剪枝,形成一个子树序列
在剪枝过程中,计算子树的损失函数:
其中,T为任意子树,C(T)为对训练数据的预测误差(如基尼指数),\(|T|\)为子树的叶节点个数,\(\alpha≥0\)为参数,\(C_{\alpha}(T)\)为参数是\(\alpha\)时的子树T的整体损失。参数\(\alpha\)权衡训练数据的拟合程度与模型的复杂度。
对固定的\(\alpha\)为,一定存在使损失函数\(C_{\alpha}(T)\)最小的子树,将其表示为\(T_{\alpha}\)。\(T_{\alpha}\)在损失函数\(C_{\alpha}(T)\)最小的意义下是最优的。容易验证,这样的最优子树是唯一的。
[Breiman等人]证明:可以用递归的方法对树进行剪枝。
将\(\alpha\)从小增大,\(0 = \alpha_0 < \alpha_1 < \cdots< +∞\),产生一系列的区间[\(\alpha_i\), \(\alpha_{i+1}\)),\(i=0,1,\cdots,n\):剪枝后得到的子树序列对应着区间\(\alpha∈[\alpha_{i},\alpha_{i+1})\),\(i=0,1,\cdots,n\)的最优子树序列\({T_0,T_1,\cdots,T_n}\),序列中的子树是嵌套的。
具体地,从整体树\(T_0\)开始剪枝。
对\(T_0\)的任意内部节点t,以t为单节点树的损失函数是:
以\(t\)为根节点的子树\(T_t\)的损失函数是
当\(\alpha=0\)及\(\alpha\)充分小时,有不等式
当\(\alpha\)增大时,在某一\(\alpha\)有
当\(\alpha\)再增大时,不等式\(C_{\alpha}(T_{\alpha}) < C_{\alpha}(t)\)反向为\(C_{\alpha}(T_{\alpha}) > C_{\alpha}(t)\).
只要\(\alpha = \frac{C(t)-C(T_t)}{|T_t|-1}\),\(T_t\)与\(t\)有相同的损失函数值,而\(t\)的节点稍,因此\(t\)比\(T_t\)更可取,对\(T_t\)进行剪枝。
为此,对\(T_0\)中每一内部节点\(t\),计算
g(t)表示,剪枝后整体损失函数减少的程度。在\(T_0\)中剪去g(t)最小的\(T_t\),将得到的子树作为\(T_1\),同时将最小的\(g(t)\)设为\(\alpha_1\)。\(T_1\)为区间\([\alpha_1, \alpha_2)\)的最优子树。
如此剪枝下去,直至得到根节点。在这一过程中,不断地增加\(\alpha\)的值,产生新的区间。
2.在剪枝得到的子树序列\(T_0,T_1,\cdots,T_n\)中通过交叉验证选取最优子树\(T_{\alpha}\)。
具体地,利用独立的验证数据集,测试子树序列\(T_0,T_1,\cdots,T_n\)中各个子树的平方误差或基尼指数。平方误差或基尼指数最小的决策树被认为是最优的决策树。在子树序列中,每棵子树\(T_1,T_2,\cdots,T_n\)都对应一个参数\(\alpha_1,\alpha_2,\cdots,\alpha_n\)。所以,当最优子树\(T_{k}\)确定时,对应的\(\alpha_k\)也就确定了,也即得到了最优决策树\(T_{\alpha}\).
[算法](CART剪枝算法)
输入:CART算法生成的决策树T
输出:最优决策树\(T_{\alpha}\).
(1)设\(k = 0,T = T_0\).
(2)设\(\alpha = ∞\).
(3)自下而上地对各内部节点\(t\)计算\(C(T_t)\),\(|T_{t}|\)以及
其中,\(T_t\)表示以t为根节点的子树,\(C(T_t)\)是对训练数据的预测误差,\(|T_t|\)是\(T_{t}\)的叶节点个数。
(4)对\(g(t) = \alpha\)的内部节点t进行剪枝,并对叶节点t以多数表决法决定其类,得到树T
(5)设\(k = k+1,\alpha_k = \alpha,T_k = T\).
(6)如果\(T_k\)不是由根节点及两个叶节点构成的树,则回到步骤(2);否则令\(T_k = T_n\)。
(7)采用交叉验证法在子树序列\(T_0,T_1,\cdots,T_n\)中选择最优子树\(T_{\alpha}\).
2.3 决策树的剪枝算法
2.3.1 决策树剪枝的基本概念
决策树生成算法递归地产生决策树,直到不同继续下去为止。这样产生的树往往对训练数据的分类很准确,但对未知的测试数据的分类却没有那么准确,也即出现“过拟合”现象。过拟合的原因在于学习时过多的考虑如何提高对训练数据的正确分类,以至于把训练集自身的一些特点当作所有数据都具有的一般性质,从而构建出在于复杂的决策树。解决这个问题的办法是考虑决策树的复杂度,对已生成的决策树进行简化。
在决策树学习中将已生成的树进行简化的过程称为“剪枝”(pruning)。具体地,剪枝从已生成的树上裁掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。
这里介绍一种简单的决策树学习的剪枝算法。
决策树的剪枝叶往往通过极小化决策树整体的损失函数(loss function)代价函数(cost function)来实现。设树T的叶节点个数为|T|,t是树木T的叶节点,该叶节点有\(N_t\)个样本点,其中k类的样本点有\(N_{tk}\)个,\(k = 1,2,\cdots,K.\)\(H_{t}(T)\)为叶节点t上的经验熵,\(\alpha≥0\)为参数,则决策树学习的损失函数可以定义为:
其中,经验熵为
在损失函数中,将\(C_{\alpha}(T) = \sum \limits_{t=1}^{|T|}N_tH_t(T) + \alpha|T|\)中的\(\sum \limits_{t=1}^{|T|}N_tH_t(T)\)记作
这时有
其中,\(C(T)\)(表示模型对训练数据的预测误差,也即为模型与训练数据的拟合程度),\(|T|\)表示模型复杂度,
所谓剪枝,就是当\(\alpha\)确定时,选择损失函数最小的模型,即损失函数最小的子树。当\(\alpha\)值确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度就越低,但是往往与训练数据的拟合不好。损失函数正好表示了对两者的平衡。
从上面可以看出,决策树生成值考虑了通过提高信息增益(或信息增益比)对训练数据进行更好的拟合。而决策树剪枝通过优化损失函数还考虑了减少模型复杂度。决策树生成学习局部的模型,而决策树剪枝叶学习整体的模型。
\(C_{\alpha}(T) = \sum \limits_{t=1}^{|T|}N_tH_t(T) + \alpha|T|\)或\(C_{\alpha}(T) = C(T) + \alpha|T|\)定义的损失函数的极小化,等价于正则化的极大似然估计。所以,利用损失函数最小原则进行剪枝,就是用正则化的极大似然估计进行模型原则的。
下图为决策树剪枝过程的示意图。
[算法6](树的剪枝算法)
输入:生成算法产生的整个树T,参数\(\alpha\);
输出:修剪后的子树\(T_{\alpha}\)。
(1)计算每个节点的经验熵。
(2)递归地从树的叶节点向上回缩。
设一组叶节点回缩到其父节点之前与之后的整体树分别为\(T_{B}\)与\(T_{A}\),其对应的损失函数值分别是\(C_{\alpha}(T_A)\)与\(C_{\alpha}(T_B)\),如果\(C_{\alpha}(T_{A})≤ C_{\alpha}(T_B)\),则进行剪枝,也即为将父节点变为新的叶节点。
(3)返回(2),直至不能继续为止,得到损失函数最小的子树\(T_{\alpha}\)。
[注意]对于\(C_{\alpha}(T_{A})≤ C_{\alpha}(T_B)\)只需考虑两个树的损失函数的差,其计算可以在局部进行。所以,决策树的剪枝算法可以由一种动态规划的算法实现。
2.3.2 决策树剪枝的基本策略
决策树剪枝的基本策略有:“预剪枝”(pre-pruning)和“后剪枝”(post-pruning)[Quilan,1993]。
“预剪枝”是指在决策树生成过程中,对每个节点在划分前进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前节点标记为叶节点;
“后剪枝”则是先从训练集生成一棵完整的决策树,带来决策树泛化性能提升,则将该子树替换为叶节点。
如何判断决策树泛化性能是否提升呢?可以使用性能评估方法。
假定采用留出法,即预留一部分数据用作“验证集”以进行性能评估。
例如,对西瓜数据集2.0,我们将其随机划分为两部分,如下表所示。
编号为{1,2,3,6,7,10,14,15,16,17}的样例组成训练集,
编号为{4,5,8,9,11,12,13}的样例组成验证集。
假定我们采用信息增益准则来进行划分属性选择,则从西瓜数据集2.0将会生成一棵如下图所示的决策树
(1)预剪枝
基于信息增益准则,我们对于上图决策树,会选取属性“脐部”来对训练集进行划分,并产生三个分支。
如下图所示
然而,是否应该进行这个划分呢?预剪枝要对划分前后的泛化性能进行估计。
在划分之前,所有的样例集中在根节点。若不进行划分,则情况为{属性集A=∅ OR 训练集D中样本在A上取值相同},则{将该生成节点node标记为叶节点,其类别标记为D中样本数最多的类}。假设我们将这个节点标记为“好瓜”。并且,用西瓜数据集2.0划分的验证集对这个单节点决策树进行评估,则编号为{4,5,8}的样例被分类正确,另外4个样例分类错误,于是,验证集精度为\(\frac{3}{7}×100 = 42.9%\).
在用属性“脐部”划分之后,上图决策树中的节点②包含了{1,2,3,14}的训练样例,该节点被标记为“好瓜”
节点③包含了{6,7,15,17}的训练样例,该节点被标记为“好瓜”
节点④包含了{10,16}的训练样例,该节点被标记为“坏瓜”
此时,验证集中编号为{4,5,8,11,12}的样例被分类正确,验证集精度为\(\frac{5}{7}×100%\)=71.4% > 42.9%.于是,用“脐部”进行划分得以确定。
然后,决策树算法应该对节点②进行划分,基于信息增益准则将挑选出划分属性“色泽”。然后,在使用“色泽”划分后,编号为{5}的验证集样本分类结果会由正确转向错误,使得验证集精度下降为57.1%。于是,预先剪枝策略将禁止节点②被划分。
对于节点③,最优划分属性为“根蒂”,划分后验证精度仍为71.4%,这个划分不能提升验证集精度,于是,预剪枝策略禁止节点③被划分
对于节点④,其所含训练样例已属于同一类,不再进行划分。
于是,基于预剪枝策略所生成的决策树,其验证集合精度为71.4%。这是一棵仅有一层划分的决策树,亦称“决策树桩”(decision stump)。
对比以上,可以看出,预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销,但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于“贪心”本质,禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
(2)后剪枝
后剪枝先从训练集生成一棵完整决策树
后剪枝首先考察上图节点⑥。若能将其领衔的分支剪除,则相当于是把⑥替换为叶节点。于是,该叶节点的类别标记为“好瓜”,此时决策树验证集精度提高至57.1%,于是,后剪枝策略决定剪枝。
然后考察节点⑤,若将其领衔的子树替换为叶节点,则替换后的叶节点包含编号为{6,7,15}的训练样例,叶节点类别标记为“好瓜”,此时决策树验证集精度仍为57.1%,于是可以不进行剪枝。
对节点③和①,若将其领衔的子树替换为叶节点,则所得决策树的验证集精度分别为71.4%与42.9%,均未得到提高,于是将它们保留。
最终,基于后剪枝策略从西瓜数据2.0所生成的决策树,如下图所示,其验证集精度为71.4%.
对比可以看出,后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树只有进行的,并且要自底向上地对树中的所有非叶节点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
(三)多变量决策树
若我们把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),也即它的分类边界由若干个与坐标轴平行的分段组成。
以下表的西瓜数据3.0\(\alpha\)为例,
将它作为训练集合可得到下图所示的决策树
这棵树所对应的分类边界如下图所示
由上图可以看出,显然,分类边界的每一段都是与坐标轴平行的。这样的分类边界使得学习结果有较好的可解释性,因为每一段划分都直接对应了某个属性取值。但在学习任务的真实分类边界比较复杂时,必须使用很多段才能获得较好的近似。
对上图的解释:
对应着生成的决策树,来看一看上图的边界是怎么画出来的:
在下图中,黑色正斜杠( / )阴影部分表示已确定标记为坏瓜的样例,红色反斜杠( \ )阴影部分表示已确定标记好瓜的样例,空白部分表示需要进一步划分的样例。
第一次划分条件是“含糖率$\leq\(0.126?”,满足此条件的样例直接标记为坏瓜(如图(a)黑色阴影部分所示),而不满足此条件的样例还需要进一步划分(如图(a)空白部分所示); 在第一次划分的基础上对图(a)空白部分继续进行划分,第二次划分的条件是“密度\)\leq\(0.381?”,满足此条件的样例直接被标记为坏瓜(如图(b)黑色阴影部分所示),而不满足此条件的样例还需要进一步划分(如图(b)空白部分所示); 在第二次划分的基础上对图(b)空白部分继续进行划分,第三次划分条件是"含糖率\)\leq\(0.205?",不满足此条件的样例直接标记为好瓜(如图(c)新增红色阴影部分所示),而且,而满足此条件的样例还需进一步划分(如图(c)空白部分所示); 第三次划分的基础上对图(c)空白部分继续进行划分,第四次划分的条件是“密度\)\leq$0.560?”,满足此条件的样例直接标记为好瓜(如图(d)新增红色阴影部分所示),而不满足此条件的样例直接标记为坏瓜(如图(d)新增黑色阴影部分所示)。
经过四次划分已无空白部分,表示决策树生成完毕。
从图(d)中可以清晰地看出好瓜与坏瓜的分类边界。
复杂分类边界的分段近似如下图所示
显然,此时的决策树分类复杂,由于要进行大量的属性测试,预测时间开销会很大。
若能使用斜的划分边界。如上图红色线段所示,则决策树模型将大为简化。“多变量决策树”(multivariate decision tree)就是能实现这样的“斜划分”甚至更复杂划分的决策树。以实现斜划分的多变量决策树为例,在此类决策树中,非叶节点不再是仅对某个属性,而是对属性的线性组合进行测试;换言之,每个非叶节点是一个形如\(\sum_{i=1}^{d}w_ia_i = t\)的线性分类器,其中\(w_i\)是属性\(a_i\)的权重,\(w_i\)和\(t\)可在该节点所含的样本集和属性集上学得。于是,与传统的“单变量决策树”(univariate decision tree)不同,在多变量决策树的学习过程中,不是为每个非叶节点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。
例如对西瓜数据集3.0\(\alpha\),我们可学得下图所示的多变量决策树
其分类边界如下图所示
对上图的解释:
上图共有两条分类边界
左边一条为一次函数“-0.800×密度-0.044×含糖率 = -0.313”;
右边一条为一次函数"-0.365×密度-0.366×含糖率= -0.158";
为更方便理解,可将含糖率替换为\(y\),将密度替换为\(x\)。关于判断直线的哪一侧大于零,哪一侧小于令,简单来说,法向量方向即为大于零的区域。
例如直线“0.800×密度-0.044×含糖率+0.313=0”,法向量为(-0.800, -0.044),指向第三象限,为“-0.800×密度-0.044×含糖率+0.313>0”,因此上图左边左边直线的左侧为“坏瓜”,这是因为当“0.800×密度-0.044×含糖率+0.313$\leq$0”不成立时(即大于零)为坏瓜。
另外需要注意的是,这里所要划分的区域仅是第一象限,因为两个属性“含糖率”和“密度”的取值范围均为正值。
参考材料
[1]周志华《机器学习》
[2]李航《统计学习方法》