决策树是依托于决策一步步建立起来的树形数据模型。
建立决策树时需要解决的问题有:
- 1.数据如何分割
- 2.何时停止数据分割
- 3.如何剪枝
1. 数据划分
划分数据主要目的就是为了让数据集从无序变的有序,根据描述数据无序程度的方法不同,有多种划分数据的方法。
1.1 基于信息增益的节点划分方法 ID3
ID3是一种基于信息增益的数据分割方法
1.1.1 描述数据的无序程度——信息熵
熵(entropy)是度量集合纯度的一种常用指标,计算方法为:
Entropy(D)=−∑nk=1pklog2pk
其中n代表样本共有n类,
pk
表示第k类样本所占的比例。
例:节点D的数据集如下,该数据集根据描述了西瓜的各种特征并且标注了该瓜是不是好瓜:
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
则该节点的信息熵为:
Entropy(D)=−∑2k=1pklog2pk=−(817)∗log2(817)−(917)∗log2(917)=0.998
注:
计算熵时约定:若
p=0
,则
plog2p=0
Entropy(D)
最小值是0,最大值为
log2n
熵值越小,
D
的纯度就越高。
1.1.2 节点分裂——信息增益
对于离散特征
Gain(D,a)=Entropy(D)−∑nk=1|Dk||D|Entropy(Dk)
信息增益值越大,意味着用属性
a
来进行划分所获得的信息纯度提升越大。
同样,对于上面节点
用属性“色泽”对节点进行划分,可知该属性有3个可能的取值{ 青绿, 乌黑, 浅白 },用该属性对D进行划分,可得3个分支节点:
D1(色泽=青绿)
包含6个样本,3个是好瓜,3个否
D2(色泽=乌黑)
包含6个样本,4个是好瓜,2个否
D3(色泽=浅白)
包含5个样本,1个是好瓜、4个否
分别计算他们的信息熵:
Entropy(D1)=−(36)∗log2(36)−(36)∗log2(36)=1.000
Entropy(D2)=−(46)∗log2(46)−(26)∗log2(26)=0.918
Entropy(D3)=−(15)∗log2(15)−(45)∗log2(45)=0.722
属性“色泽”的信息增益为:
Gain(D,“色泽”)
=Entropy(D)−∑3k=1|Dk||D|Entropy(Dk)
=0.998−617∗1.000−617∗0.918−517∗0.722=0.109
同样的方法求出其他属性的信息增益:
Gain(D,“根蒂”)=0.143
Gain(D,“敲声”)=0.141
Gain(D,“纹理”)=0.381
Gain(D,“脐部”)=0.289
Gain(D,“触感”)=0.006
此处,“纹理”的信息增益值较大,所以用“纹理”作为节点划分的特征。
第一步划分结束,然后再根据第一步划分出的节点一步步继续划分下去。
1.2 基于信息增益率的节点划分方法 C4.5
C4.5采用信息增益率作为数据分割的依据。
回到上边的例子,假如我们把数据集
D
中的第一列“编号”也作为一个属性,基于该属性划分节点,就会产生17个节点,我们可以求出
远远大于其他的候选属性。
信息增益准则就是对可取数目较多的属性有所偏好。
为了消除这种情况C4.5算法采用“增益率(gain ratio)”来选择最佳的划分属性。信息增益率公式:
Gain_ratio(D,a)=Gain(D,a)IV(a)
其中
IV(a)=−∑nk=1|Dk||D|log2|Dk||D|
IV(a)
称为属性的固有值,对于上面的数据集
D
,求得
IV(根蒂)=−817log2817−717log2717−217log2217=1.402(n=3)
IV(敲声)=−517log2517−217log2217−1017log21017=1.333(n=3)
IV(纹理)=−317log2317−917log2917−517log2517=1.447(n=3)
IV(脐部)=−717log2717−417log2417−617log2617=1.549(n=3)
IV(触感)=−517log2517−1217log21217=0.874(n=2)
IV(编号)=−117log2117∗17=4.088(n=17)
得到各属性的信息增益率:
Gain_ratio(D,“色泽”)=0.069
Gain_ratio(D,“根蒂”)=0.102
Gain_ratio(D,“敲声”)=0.106
Gain_ratio(D,“纹理”)=0.263
Gain_ratio(D,“脐部”)=0.187
Gain_ratio(D,“触感”)=0.007
Gain_ratio(D,“编号”)=0.244
此处“纹理”的信息增益率最大,所以将该属性作为节点划分的属性。
1.3 CART
CART(Classification And Regression Trees, 分类回归树)
CART既能是分类树,又能是回归树。
1.3.1 GINI指数构建分类树
GINI指数计算公式
Gini(D)=∑nk=1∑k′≠kpkpk′=1−∑nk=1p2k
基尼指数表示了从数据集
D
中随机抽取两个样本,其类别标记不一致的概率,所以GINI值越小表示数据集的纯度越高。
对于数据集
在划分属性的时候,我们选择使得划分后的基尼指数最小的属性作为最优划分属性,即:
a∗=argmina∈A(Giniindex(D,a))
例,对于数据集
D′
:
编号 | 色泽 | 脐部 | 好瓜 |
---|---|---|---|
1 | 青绿 | 凹陷 | 是 |
2 | 乌黑 | 凹陷 | 是 |
3 | 乌黑 | 凹陷 | 是 |
4 | 青绿 | 凹陷 | 是 |
5 | 青绿 | 平坦 | 否 |
6 | 青绿 | 凹陷 | 否 |
Gini(D′)=1−(46)2−(26)2=0.444
用属性“色泽”划分
D′1(色泽=青绿)
包含4个样本,2个是好瓜,2个否
D′2(色泽=乌黑)
包含2个样本,2个是好瓜,0个否
则
Gini(D′1)=1−(2/4)2−(2/4)2=0.5
Gini(D′2)=1−(2/2)2−(0)2=0
最终,属性“色泽”的基尼指标为:
Gini(D′,色泽)=46∗0.5+26∗0=0.333
同样的方法可以求出:
Gini(D′,脐部)=56∗(1−(45)2−(15)2)+16∗(1−(11)2)=0.267
属性“脐部”的基尼指标较小,所以就选它作为分裂节点。
CART构成的决策树是二叉树,当某离散属性有多个取值时,处理办法是将其中一个离散值独立作为一个节点,其他的离散值生成另外一个节点。例如某属性共有{X,Y,Z}三个取值,则该属性的分裂方法是{X}{Y,Z}、{Y}{X,Z}、{Z}{X,Y},分别计算他们的样本基尼指数值。
GINI处理连续值
(1)可以将待计算的属性按照属性值排序。
(2)在两个相邻的属性值中选择中间值作为划分点,分别计算他们的GINI指数。
(3)进一步优化一下,可以只选择具有不同类标号的相邻记录之间的中间值作为测试的划分节点。
1.3.2 样本方差最小值构建决策树
回归方差计算公式:
σ2=∑i∈I(xi−μ)2=∑i∈Ixi−nμ2
方差越大,表示该节点的数据越分散,预测的效果就越差。
Gain=SST−(SSL+SSR)
其中
SST=∑i∈I(xi−μ)2
是根节点的方差和,
SSL
和
SSR
是左右节点的方差和。
例,对于数据集
E
:
密度 | 含糖率 |
---|---|
0.697 | 0.460 |
0.774 | 0.376 |
0.634 | 0.264 |
0.608 | 0.318 |
0.556 | 0.215 |
0.403 | 0.237 |
0.481 | 0.149 |
0.437 | 0.211 |
0.666 | 0.091 |
首先计算“含糖率”的方差和
通常情况下在依次分割中
SST
的值是固定的,所以只要找
(SSL+SSR)
的最小值即可。
SST−(SSL+SSR)
可以作为一个预剪枝的threshold,当方差的提升小于threshold时则停止继续向下分裂。
2. 分割停止
决策树节点停止分裂的一般性条件:
1. 最小节点数
当节点的数据量小于一个指定的数量时,不继续分裂。有两点原因:一是数据量较少时,再做分裂容易强化噪声数据的作用;二是降低树生长的复杂性。提前结束分裂一定程度上有利于降低过拟合的影响。
2. 熵或者基尼值小于阀值
由上述可知,熵和基尼值的大小表示数据的复杂程度,当熵或者基尼值过小时,表示数据的纯度比较大,如果熵或者基尼值小于一定程度数,节点停止分裂。
3. 决策树的深度达到指定的条件
节点的深度可以理解为节点与决策树跟节点的距离,如根节点的子节点的深度为1,因为这些节点与跟节点的距离为1,子节点的深度要比父节点的深度大1。决策树的深度是所有叶子节点的最大深度,当深度到达指定的上限大小时,停止分裂。
4. 所有特征已经使用完毕,不能继续进行分裂
被动式停止分裂的条件,当已经没有可分的属性时,直接将当前节点设置为叶子节点。
3. 剪枝
决策树是充分考虑了所有的数据点而生成的复杂树,有可能出现过拟合的情况,决策树越复杂,过拟合的程度会越高。
考虑极端的情况,如果我们令所有的叶子节点都只含有一个数据点,那么我们能够保证所有的训练数据都能准确分类,但是很有可能得到高的预测误差,原因是将训练数据中所有的噪声数据都”准确划分”了,强化了噪声数据的作用。
剪枝修剪分裂前后分类误差相差不大的子树,能够降低决策树的复杂度,降低过拟合出现的概率。
剪枝有预剪枝和后剪枝两种方法。
3.1 预剪枝
预剪枝就是在节点划分之前先进行估计,如果当前节点的划分不能带来决策树泛化性能的提升则停止划分并将当前节点标记为叶节点。
3.2 后剪枝
后剪枝是先从训练集中生成一颗完整的决策树,然后子弟向上的对非叶节点进行考察,然后根据一定的规则决定是否应将该节点变为叶节点。
后剪枝一般需要验证集。
下面介绍几种常用的后剪枝方法。
3.2.1 CCP
CCP(cost-complexity pruning 代价复杂度剪枝)方法,CART即采用这种剪枝方法。
CCP选择节点表面误差率增益值最小的非叶子节点,删除该非叶子节点的左右子节点,若有多个非叶子节点的表面误差率增益值相同小,则选择非叶子节点中子节点数最多的非叶子节点进行剪枝。CCP方法可以描述如下:
(1) 从原始的决策树开始生成一个子树序列(均非叶子节点)
{T0,T1,...,Tn}
,其中
Ti+1
从
Ti
产生,
Tn
为根节点。
(2) 计算所有节点的误差率增益值,选择误差率增益值最小的非叶子节点。
(3) 对选中的节点进行剪枝。
(4) 重复上边的步骤。
误差率增益值的计算公式为:
α=R(t)−R(T)N(T)−1
其中:
R(t)
:叶子节点的误差代价,
R(t)=r(t)p(t)
,
r(t)
为节点的错误率,
p(t)
为节点的数据量占比。
R(T)
:表示子树的误差代价,
R(T)=∑miri(t)pi(t)
,
ri(t)
为子节点
i
的错误率,
例,决策树如下所示,A、B表示训练集的两类,节点的类别标号为该节点中类别较多的那个类。
已知总的样本容量为80,对于非叶子节点
t4
的子树:
R(t)=r(t)∗p(t)=450∗5080=120
R(T)=∑ri(t)pi(t)=145∗4580+25∗580=380
N(T)=2
α=R(t)−R(T)N(T)−1=120−3802−1=0.0125
对于非叶子节点
t2
的子树:
R(t)=r(t)∗p(t)=1060∗6080=18
R(T)=∑ri(t)pi(t)=145∗4580+25∗580+06∗680+04∗480=380
N(T)=4
α=R(t)−R(T)N(T)−1=18−3804−1=0.0292
关于上面决策树的所有节点的
α
值计算结果为:
T0:
α(t4)=0.0125
α(t5)=0.0500
α(t2)=0.0292
α(t3)=0.0375
T1:
α(t5)=0.0500
α(t2)=0.0375
α(t3)=0.0375
T2:
α(t3)=0.0375
从上面可以看出,在原始树
T0
行,
t4
的
α
值最小,所以裁剪将
t4
节点变为叶节点,得到
T1
;在
T1
行,
t2
和
t3
的
α
值相同,但是裁减掉前者可以得到更小的决策树,所以裁剪将
t2
节点变为叶节点,得到
T2
。
3.2.2 REP
REP(reduced error pruning 降低误差剪枝)方法。
该方法的基本思路是:对于决策树
T
的每棵非叶子树
例:
对于节点
t4
的关于剪枝数据集的误差是0,而他的子树
t8
和
t9
的误差之和是1,则将
t4
转化为叶子节点。
REP 是当前最简单的事后剪枝方法之一,REP常作为一种基准来评价其它剪枝方法的性能.
3.2.3 PEP
PEP(pessimistic error pruning 悲观剪枝)方法,C4.5中就是使用该方法进行剪枝的。
悲观剪枝的主要思想是:如果决策树的精度在剪枝前后没有影响的话,则进行剪枝。怎样才算是没有影响?如果剪枝后的误差小于剪枝前经度的上限,则说明剪枝后的效果与剪枝前的效果一致,此时要进行剪枝。
PEP方法认为,如果公式:
e′(t)⩽e′(Tt)+S(e′(Tt))
满足,则将
Tt
应该被裁剪,变成叶节点。
其中
e′(t)
表示剪枝后节点的误差,
e′(t)=[e(t)+0.5]
e′(Tt)
表示剪枝前子树的误差,
e′(Tt)=∑e(ti)+Nt2
S(e′(Tt))=e′(Tt)∗n(t)−e′(Tt)n(t)−−−−−−−−−−−−−√
例:
对于图1中
t4
e′(t)=[e(t)+0.5]=4+0.5=4.5
e′(Tt)=∑e(ti)+Nt2=1+2+2/2=4
S(e′(Tt))=e′(Tt)∗n(t)−e′(Tt)n(t)−−−−−−−−−−−−−√=4∗50−450−−−−−−−√=1.92
由于
e′(t)=4.5⩽e′(Tt)+S(e′(Tt))=4+1.92=5.92
所以
t4
应该被剪掉。
应用PEP方法剪裁图1的计算结果:
非叶节点 | e′(t) | e′(Tt) | S(e′(Tt)) | 是否裁剪 |
---|---|---|---|---|
t1 | 25.5 | 8 | 2.68 | 否 |
t2 | 10.5 | 5 | 2.14 | 否 |
t3 | 5.5 | 3 | 1.60 | 否 |
t4 | 4.5 | 4 | 1.92 | 是 |
t5 | 4.5 | 1 | 0.95 | 否 |
PEP方法被认为是当前决策树事后剪枝方法中精度较高的算法之一,不需要分离的剪枝数据集,采用自顶向下的方式。
参考文献
《机器学习》 周志华 著
《数据挖掘导论》 Pang-Ning Tan 等著
《决策树剪枝方法的比较》 魏红宁