4. 决策树的优化
一棵过于复杂的决策树很可能出现过拟合的情况,如果完全按照3中生成一个完整的决策树可能会出现预测不准确的情况,因此需要对决策树进行优化,优化的方法主要有两种,一是剪枝,二是组合树,将在本系列的剪枝和组合树中分别讲述。
1、决策树定义
由节点和边两种元素组成的结构。理解树,就需要理解几个关键词:根节点、父节点、子节点和叶子节点。
父节点和子节点是相对的,说白了子节点由父节点根据某一规则分裂而来,然后子节点作为新的父亲节点继续分裂,直至不能分裂为止。而根节点是没有父节点的节点,即初始分裂节点,叶子节点是没有子节点的节点,如下图所示:
图1.1 树的结构示意图
决策树利用如上图所示的树结构进行决策,每一个非叶子节点是一个判断条件,每一个叶子节点是结论。从跟节点开始,经过多次判断得出结论。
2、决策树如何决策
表2.1 银行用户信息表
职业 | 年龄 | 收入 | 学历 | 是否贷款 |
自由职业 | 28 | 5000 | 高中 | 是 |
工人 | 36 | 5500 | 高中 | 否 |
工人 | 42 | 2800 | 初中 | 是 |
白领 | 45 | 3300 | 小学 | 是 |
白领 | 25 | 10000 | 本科 | 是 |
白领 | 32 | 8000 | 硕士 | 否 |
白领 | 28 | 13000 | 博士 | 是 |
自由职业 | 21 | 4000 | 本科 | 否 |
自由职业 | 22 | 3200 | 小学 | 否 |
工人 | 33 | 3000 | 高中 | 否 |
工人 | 48 | 4200 | 小学 | 否 |
决策树用树结构实现上述的判断流程,如图2.1所示:
图2.1 银行贷款意向分析决策树示意图
3. 决策树的构建
那么问题就来了,如何构建如图2.1所示一棵决策树呢?决策树的构建是数据逐步分裂的过程,构建的步骤如下:
步骤1:将所有的数据看成是一个节点,进入步骤2;
步骤2:从所有的数据特征中挑选一个数据特征对节点进行分割,进入步骤3;
步骤3:生成若干孩子节点,对每一个孩子节点进行判断,如果满足停止分裂的条件,进入步骤4;否则,进入步骤2;
步骤4:设置该节点是子节点,其输出的结果为该节点数量占比最大的类别。
从上述步骤可以看出,决策生成过程中有两个重要的问题:
(1)数据如何分割
(2)如何选择分裂的属性
(3)什么时候停止分裂
3.1 数据分割
假如我们已经选择了一个分裂的属性,那怎样对数据进行分裂呢?
分裂属性的数据类型分为离散型和连续性两种情况,对于离散型的数据,按照属性值进行分裂,每个属性值对应一个分裂节点;对于连续性属性,一般性的做法是对数据按照该属性进行排序,再将数据分成若干区间,如[0,10]、[10,20]、[20,30]…,一个区间对应一个节点,若数据的属性值落入某一区间则该数据就属于其对应的节点。
3.2 分裂属性的选择
我们知道了分裂属性是如何对数据进行分割的,那么我们怎样选择分裂的属性呢?
决策树采用贪婪思想进行分裂,即选择可以得到最优分裂结果的属性进行分裂。那么怎样才算是最优的分裂结果?最理想的情况当然是能找到一个属性刚好能够将不同类别分开,但是大多数情况下分裂很难一步到位,我们希望每一次分裂之后孩子节点的数据尽量”纯”,以下图为例:
从图3.1和图3.2可以明显看出,属性2分裂后的孩子节点比属性1分裂后的孩子节点更纯:属性1分裂后每个节点的两类的数量还是相同,跟根节点的分类结果相比完全没有提高;按照属性2分裂后每个节点各类的数量相差比较大,可以很大概率认为第一个孩子节点的输出结果为类1,第2个孩子节点的输出结果为2。
选择分裂属性是要找出能够使所有孩子节点数据最纯的属性,决策树使用信息增益或者信息增益率作为选择属性的依据。
(1)信息增益
用信息增益表示分裂前后跟的数据复杂度和分裂节点数据复杂度的变化值,计算公式表示为:
其中Gain表示节点的复杂度,Gain越高,说明复杂度越高。信息增益说白了就是分裂前的数据复杂度减去孩子节点的数据复杂度的和,信息增益越大,分裂后的复杂度减小得越多,分类的效果越明显。(Gaini累加的时候应先乘以n/N,其中n表示该节点数据量,N表示父节点数据量)
节点的复杂度可以用以下两种不同的计算方式:
a)熵
熵描述了数据的混乱程度,熵越大,混乱程度越高,也就是纯度越低;反之,熵越小,混乱程度越低,纯度越高。 熵的计算公式如下所示:
其中Pi表示类i的数量占比。以二分类问题为例,如果两类的数量相同,此时分类节点的纯度最低,熵等于1;如果节点的数据属于同一类时,此时节点的纯度最高,熵 等于0。
注:对数是以2为底
b)基尼值
基尼值计算公式如下:
其中Pi表示类i的数量占比。其同样以上述熵的二分类例子为例,当两类数量相等时,基尼值等于0.5 ;当节点数据属于同一类时,基尼值等于0 。基尼值越大,数据越不纯。
2)信息增益率
使用信息增益作为选择分裂的条件有一个不可避免的缺点:倾向选择分支比较多的属性进行分裂。为了解决这个问题,引入了信息增益率这个概念。信息增益率是在信息增益的基础上除以分裂节点数据量的信息增益(听起来很拗口),其计算公式如下:
其中 表示信息增益,
表示分裂子节点数据量的信息增益,其计算公式为:
其中m表示子节点的数量,表示第i个子节点的数据量,N表示父节点数据量,说白了, 其实
是分裂节点的熵,如果节点的数据链越接近,
越大,如果子节点越大,
越大,而
就会越小,能够降低节点分裂时选择子节点多的分裂属性的倾向性。信息增益率越高,说明分裂的效果越好。
3.3 停止分裂的条件
决策树不可能不限制地生长,总有停止分裂的时候,最极端的情况是当节点分裂到只剩下一个数据点时自动结束分裂,但这种情况下树过于复杂,而且预测的经度不高。一般情况下为了降低决策树复杂度和提高预测的经度,会适当提前终止节点的分裂。
以下是决策树节点停止分裂的一般性条件:
(1)最小节点数
当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。
(2)熵或者基尼值小于阀值。
由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。
(3)决策树的深度达到指定的条件
节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。
(4)所有特征已经使用完毕,不能继续进行分裂。
被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。
3.4 决策树的构建方法
根据决策树的输出结果,决策树可以分为分类树和回归树,分类树输出的结果为具体的类别,而回归树输出的结果为一个确定的数值。
决策树的构建算法主要有ID3、C4.5、CART三种,其中ID3和C4.5是分类树,CART是分类回归树,将在本系列的ID3、C4.5和CART中分别讲述。
其中ID3是决策树最基本的构建算法,而C4.5和CART是在ID3的基础上进行优化的算法。
4. 决策树的优化
一棵过于复杂的决策树很可能出现过拟合的情况,如果完全按照3中生成一个完整的决策树可能会出现预测不准确的情况,因此需要对决策树进行优化,优化的方法主要有两种,一是剪枝,二是组合树,将在本系列的剪枝和组合树中分别讲述。
5.剪枝
为甚么要剪枝?
决策树是充分考虑了所有的数据点而生成的复杂树,有可能出现过拟合的情况,决策树越复杂,过拟合的程度会越高。
考虑极端的情况,如果我们令所有的叶子节点都只含有一个数据点,那么我们能够保证所有的训练数据都能准确分类,但是很有可能得到高的预测误差,原因是将训练数据中所有的噪声数据都”准确划分”了,强化了噪声数据的作用。
剪枝修剪分裂前后分类误差相差不大的子树,能够降低决策树的复杂度,降低过拟合出现的概率。
怎样剪枝?
两种方案:先剪枝和后剪枝
先剪枝说白了就是提前结束决策树的增长,跟上述决策树停止生长的方法一样。
后剪枝是指在决策树生长完成之后再进行剪枝的过程。这里介绍三种后剪枝方案:
(1)REP—错误率降低剪枝
顾名思义,该剪枝方法是根据错误率进行剪枝,如果一棵子树修剪前后错误率没有下降,就可以认为该子树是可以修剪的。
REP剪枝需要用新的数据集,原因是如果用旧的数据集,不可能出现分裂后的错误率比分裂前错误率要高的情况。由于使用新的数据集没有参与决策树的构建,能够降低训练数据的影响,降低过拟合的程度,提高预测的准确率。
(2)PEP—悲观剪枝
悲观剪枝认为如果决策树的精度在剪枝前后没有影响的话,则进行剪枝。怎样才算是没有影响?如果剪枝后的误差小于剪枝前经度的上限,则说明剪枝后的效果与剪枝前的效果一致,此时要进行剪枝。
进行剪枝必须满足的条件:
其中:
表示剪枝前子树的误差;
表示剪枝后节点的误差;
两者的计算公式如下:
令子树误差的经度满足二项分布,根据二项分布的性质, (ei是子树的叶子节点的误差值),
(公式中的n仍有疑问) ,其中
,N为子树的数据量;同样,叶子节点的误差
(剪枝后的叶子节点,e是剪枝后叶子节点的误差值)。
算例:
由于 ,所以应该进行剪枝。
(3)CCP—代价复杂度剪枝
代价复杂度选择节点表面误差率增益值最小的非叶子节点,删除该非叶子节点的左右子节点,若有多个非叶子节点的表面误差率增益值相同小,则选择非叶子节点中子节点数最多的非叶子节点进行剪枝。
可描述如下:
令决策树的非叶子节点为。
a) 计算所有非叶子节点的表面误差率增益值
b)选择表面误差率增益值最小的非叶子节点(若多个非叶子节点具有相同小的表面误差率增益值,选择节点数最多的非叶子节点)。
c)对选中的非叶子节点进行剪枝
表面误差率增益值的计算公式:
其中:
表示叶子节点(剪枝后叶子节点,未剪枝时子树的根节点)的误差代价,
,
为节点(子树根节点)的错误率,
为节点(子树根节点)数据量的占比;
表示子树的误差代价,
,
为子节点(子树叶子节点)i的错误率,
表示节点(子树叶子节点)i的数据节点占比(占训练集的比例);
表示子树叶子节点个数。
算例:
下图是决策树A的其中一颗子树,决策树的总数据量为40。
该子树的表面误差率增益值可以计算如下:
求出该子树的表面错误覆盖率为 1/40,只要求出其他子树的表面误差率增益值就可以对决策树进行剪枝.
6.CID3
6.1选择最优分裂属性
ID3采用信息增益作为选择最优的分裂属性的方法,选择熵作为衡量节点纯度的标准,信息增益的计算公式如下:
其中, 表示父节点的熵;
表示节点i的熵,熵越大,节点的信息量越多,越不纯;
表示子节点i的数据量与父节点数据量之比。
越大,表示分裂后的熵越小,子节点变得越纯,分类的效果越好,因此选择
最大的属性作为分裂属性。
对上述的例子的跟节点进行分裂,分别计算每一个属性的信息增益,选择信息增益最大的属性进行分裂。
6.2停止分裂的条件
停止分裂的条件已经在决策树中阐述,这里不再进行阐述。
(1)最小节点数
当节点的数据量小于一个指定的数量时,不继续分裂。两个原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。
(2)熵或者基尼值小于阀值。
由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度时,节点停止分裂。
(3)决策树的深度达到指定的条件
节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。
(4)所有特征已经使用完毕,不能继续进行分裂。
被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。
7.C4.5
C4.5在ID3的基础上对上述三个方面进行了相应的改进:
a) C4.5对节点进行分裂时采用信息增益率作为分裂的依据;
b) 能够对连续数据进行处理;
c) C4.5采用剪枝的策略,对完全生长的决策树进行剪枝处理,一定程度上降低过拟合的影响。
7.1.采用信息增益率作为分裂的依据
信息增益率的计算公式为:
其中表示信息增益,
表示分裂子节点数据量的信息增益,计算公式为:
其中m表示节点的数量,Ni表示第i个节点的数据量,N表示父亲节点的数据量,说白了,其实是分裂节点的熵。
信息增益率越大,说明分裂的效果越好。
7.2.对连续型属性进行处理
C4.5处理离散型属性的方式与ID3一致,新增对连续型属性的处理。处理方式是先根据连续型属性进行排序,然后采用一刀切的方式将数据砍成两半。
那么如何选择切割点呢?很简单,直接计算每一个切割点切割后的信息增益,然后选择使分裂效果最优的切割点。
以温度为例:
从上图可以看出,理论上来讲,N条数据就有N-1个切割点,为了选取最优的切割垫,要计算按每一次切割的信息增益,计算量是比较大的,那么有没有简化的方法呢?有,注意到,其实有些切割点是很明显可以排除的。比如说上图右侧的第2条和第3条记录,两者的类标签(逛街)都是“是”,如果从这里切割的话,就将两个本来相同的类分开了,肯定不会比将他们归为一类的切分方法好,因此,可以通过去除前后两个类标签相同的切割点以简化计算的复杂度,如下图所示:
从图中可以看出,最终切割点的数目从原来的11个减少到现在的6个,降低了计算的复杂度。
确定了分割点之后,接下来就是选择最优的分割点了,注意,对连续型属性是采用信息增益进行内部择优的,因为如果使用信息增益率进行分裂会出现倾向于选择分割前后两个节点数据量相差最大的分割点,为了避免这种情况,选择信息增益选择分割点。选择了最优的分割点之后,再计算信息增益率跟其他的属性进行比较,确定最优的分裂属性。
7.3. 剪枝
C4.5采用悲观剪枝方法(PEP)
总结:
要记住,C4.5是分类树最终要的算法,算法的思想其实很简单,但是分类的准确性高。可以说C4.5是ID3的升级版和强化版,解决了ID3未能解决的问题。要重点记住以下几个方面:
1.C4.5是采用信息增益率选择分裂的属性,解决了ID3选择属性时的偏向性问题;
2.C4.5能够对连续数据进行处理,采用一刀切的方式将连续型的数据切成两份,在选择切割点的时候使用信息增益作为择优的条件;
3.C4.5采用悲观剪枝的策略,一定程度上降低了过拟合的影响。
CART,又名分类回归树,是在ID3的基础上进行优化的决策树,学习CART记住以下几个关键点:
(1)CART既能是分类树,又能是分类树;
(2)当CART是分类树时,采用GINI值作为节点分裂的依据;当CART是回归树时,采用样本的最小方差作为节点分裂的依据;
(3)CART是一棵二叉树。
接下来将以一个实际的例子对CART进行介绍:
表1 原始数据表
看电视时间 | 婚姻情况 | 职业 | 年龄 |
3 | 未婚 | 学生 | 12 |
4 | 未婚 | 学生 | 18 |
2 | 已婚 | 老师 | 26 |
5 | 已婚 | 上班族 | 47 |
2.5 | 已婚 | 上班族 | 36 |
3.5 | 未婚 | 老师 | 29 |
4 | 已婚 | 学生 | 21 |
从以下的思路理解CART:
分类树?回归树?
分类树的作用是通过一个对象的特征来预测该对象所属的类别,而回归树的目的是根据一个对象的信息预测该对象的属性,并以数值表示。
CART既能是分类树,又能是决策树,如上表所示,如果我们想预测一个人是否已婚,那么构建的CART将是分类树;如果想预测一个人的年龄,那么构建的将是回归树。
CART如何选择分裂的属性?
分裂的目的是为了能够让数据变纯,使决策树输出的结果更接近真实值。那么CART是如何评价节点的纯度呢?如果是分类树,CART采用GINI值衡量节点纯度;如果是回归树,采用样本方差衡量节点纯度。节点越不纯,节点分类或者预测的效果就越差。
GINI值的计算公式:
节点越不纯,GINI值越大。以二分类为例,如果节点的所有数据只有一个类别,则 ,如果两类数量相同,则
。
回归方差计算公式:
方差越大,表示该节点的数据越分散,预测的效果就越差。如果一个节点的所有数据都相同,那么方差就为0,此时可以很肯定得认为该节点的输出值;如果节点的数据相差很大,那么输出的值有很大的可能与实际值相差较大。
因此,无论是分类树还是回归树,CART都要选择使子节点的GINI值或者回归方差最小的属性作为分裂的方案。即最小化(分类树):
或者(回归树):
如何剪枝?
CART采用CCP(代价复杂度)剪枝方法。代价复杂度选择节点表面误差率增益值最小的非叶子节点,删除该非叶子节点的左右子节点,若有多个非叶子节点的表面误差率增益值相同小,则选择非叶子节点中子节点数最多的非叶子节点进行剪枝。
总结:
(1)CART是一棵二叉树,每一次分裂会产生两个子节点,对于连续性的数据,直接采用与C4.5相似的处理方法,对于离散型数据,选择最优的两种离散值组合方法。
(2)CART既能是分类数,又能是二叉树。如果是分类树,将选择能够最小化分裂后节点GINI值的分裂属性;如果是回归树,选择能够最小化两个节点样本方差的分裂属性。
(3)CART跟C4.5一样,需要进行剪枝,采用CCP(代价复杂度的剪枝方法)。