决策树
问题框架
将具有p维离散特征的n个样本分到c个类别中去。
模型的测试:一棵树,对于输入按照树的指向来提问题,最终归入一个叶子节点实现分类。
模型的训练:每次对数据集的属性提出一个问题,把一个叶子节点变成分叉(而不是增加一个属性的分支),从而逐渐按照属性值形成分支。
数据集:西瓜数据集2.01
编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 是 |
5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 是 |
7 | 乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 是 |
8 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
10 | 青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 否 |
11 | 浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 否 |
13 | 青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 否 |
14 | 浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 否 |
15 | 乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 否 |
16 | 浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 否 |
17 | 青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 否 |
解决方法框架
通用的解决方法是,对于p种属性和当前的叶子节点(对应的子数据集),首先计算每种属性的划分在这个子数据集上带来的区分度,再选择区分度最大的一个属性进行区分。
从决策树的根节点开始,每一次划分是把决策树中的叶子节点划分成分支节点的一个过程。决策树中的叶子节点相当于归属同一属性的数据子集,而对叶子节点的拆分相当于选择区分度最大的属性划分数据子集,拆分后的分支节点相当于在此处对某个属性进行了测试,从而进一步划分数据子集。
叶子节点划分:每次只做一个节点的分裂,分裂选项是每一种可能分裂的属性(包括连续属性中的不同划分方法)。
区分度最大:对于每一种可能的分裂方式,计算一个指标,按照最大的指标值指示的属性来分类。
下面列举的几种方法也主要是区分度的计算方式不同。
- 上述方法其实蕴含了一种思想:小的决策树总比大的好
- 至于按照DFS还是BFS来扩展,其实无所谓,因为最后得到的结果一定是一样的(不考虑剪枝)。
实例分析
以下以信息增益准则举例,在上面的数据集上构建一棵决策树。
基于信息熵和信息增益:在每次数据集的划分上,选择产生信息增益最大的节点。
信息熵:衡量样本集合的纯度的指标。
E
n
(
D
)
=
−
∑
k
=
1
c
p
k
l
o
g
2
p
k
En(D) = -\sum_{k=1}^cp_klog_2{p_k}
En(D)=−k=1∑cpklog2pk
- 信息熵也描述了随机变量信息量。信息熵越大,对应的随机变量的随机性越强。
- 信息熵最小值为0,对应所有样本属于同一类/随机变量概率分布只有1个P=1;最大值为 l o g 2 c log_2{c} log2c,对应每种分类标签样本数相同/随机变量每个情况等可能。
举个例子(参考西瓜2.0数据集)
根节点的信息熵:因为一共17个样本,8个是9个否,所以 E n ( D ) = − 8 17 l o g 8 17 − 9 17 l o g 9 17 = 0.998 En(D) = -\frac{8}{17}log\frac{8}{17}-\frac{9}{17}log\frac{9}{17} = 0.998 En(D)=−178log178−179log179=0.998
信息增益:在将样本集合分类之后减少的信息量。从随机变量的角度看,就是把随机变量按类型分开之后,平均减少的随机性。
G a i n ( D , a ) = E n ( D ) − ∑ v = 1 V D v D E n ( D v ) Gain(D, a) = En(D) - \sum_{v=1}^V\frac{D_v}{D}En(D_v) Gain(D,a)=En(D)−v=1∑VDDvEn(Dv)
- 因为如果把样本数据集按分类标签分开,信息熵将会降为0,信息增益最大,所以信息增益也可以描摹特定划分属性和分类标签的相似度。
举个例子(参考西瓜2.0数据集)
按照色泽划分数据集后的信息熵
青绿的信息熵:一共6个样本,3个是3个否,所以 E n ( D 1 ) = − 3 6 l o g 3 6 − 3 6 l o g 3 6 = 1.000 En(D_1) = -\frac{3}{6}log\frac{3}{6}-\frac{3}{6}log\frac{3}{6} = 1.000 En(D1)=−63log63−63log63=1.000
乌黑的信息熵:一共6个样本,2个是4个否,所以 E n ( D 2 ) = − 4 6 l o g 4 6 − 2 6 l o g 2 6 = 0.918 En(D_2) = -\frac{4}{6}log\frac{4}{6}-\frac{2}{6}log\frac{2}{6} = 0.918 En(D2)=−64log64−62log62=0.918
浅白的信息熵:一共5个样本,1个是4个否,所以 E n ( D 3 ) = − 1 5 l o g 1 5 − 4 5 l o g 4 5 = 0.722 En(D_3) = -\frac{1}{5}log\frac{1}{5}-\frac{4}{5}log\frac{4}{5} = 0.722 En(D3)=−51log51−54log54=0.722
在按照色泽划分之后的平均信息熵: 6 17 ∗ 1.000 + 6 17 ∗ 0.918 + 5 17 ∗ 0.722 = 0.889 \frac{6}{17}*1.000 + \frac{6}{17}*0.918 + \frac{5}{17}*0.722 = 0.889 176∗1.000+176∗0.918+175∗0.722=0.889,信息增益 G a i n ( D , 色 泽 ) = 0.109 Gain(D, 色泽) = 0.109 Gain(D,色泽)=0.109
信息增益准则:在每次数据集的划分上,对于可以使用的各个属性计算信息增益,选择产生信息增益属性,对当前叶子节点进行划分。
举个例子(参考西瓜2.0数据集)
第一次划分之后,根据六个标签分别计算信息增益,选择信息增益最大的属性进行分支,然后各个叶子节点之间就没有联系了,他们内部再分别进行分支。
区分度的度量
除了信息增益之外,区分度还有很多种度量。
信息增益
划分后获得最大的信息增益(最小的平均信息熵)
上面描述得非常清楚了。在这里再放一下公式。
E
n
(
D
)
=
−
∑
k
=
1
c
p
k
l
o
g
2
p
k
En(D) = -\sum_{k=1}^cp_klog_2{p_k}
En(D)=−k=1∑cpklog2pk
G
a
i
n
(
D
,
a
)
=
E
n
(
D
)
−
∑
v
=
1
V
D
v
D
E
n
(
D
v
)
Gain(D, a) = En(D) - \sum_{v=1}^V\frac{D_v}{D}En(D_v)
Gain(D,a)=En(D)−v=1∑VDDvEn(Dv)
信息增益:分之前的信息熵和分之后的信息熵(加权平均)之差。
增益率
划分后获得最大的增益率
信息增益会偏向类型数比较多的情况,也会倾向于不平衡分裂(数据子集之间size差距很大)
G
a
i
n
_
R
a
d
i
o
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
Gain\_Radio(D, a) = \frac{Gain(D, a)}{IV(a)}
Gain_Radio(D,a)=IV(a)Gain(D,a)
I
V
(
a
)
=
−
∑
v
=
1
V
D
v
D
l
o
g
2
D
v
D
IV(a) = - \sum_{v=1}^V\frac{D_v}{D}log_2\frac{D_v}{D}
IV(a)=−v=1∑VDDvlog2DDv
信息率:针对属性计算属性的信息熵(IV),并用这个值修正信息增益。
Gini Index
划分后获得最小的平均Gini
Gini index偏向于类型数比较少的情况,倾向于平衡分裂,而且是这三个之中计算时间最大的。
G i n i ( D ) = ∑ k = 1 c ∑ k ′ ≠ k p k p k ′ Gini(D) = \sum_{k=1}^c\sum_{k'\neq k}p_kp_{k'} Gini(D)=k=1∑ck′=k∑pkpk′
Gini是数据子集纯度的表征,Gini越小,数据集纯度越高。
G i n i _ i n d e x ( D , a ) = ∑ v = 1 V D v D G i n i ( D v ) Gini\_index(D, a) = \sum_{v=1}^{V}\frac{D_v}{D}Gini(D_v) Gini_index(D,a)=v=1∑VDDvGini(Dv)
Gini index是数据集划分后平均纯度的表征,越小越好。
其他相关问题
剪枝
提前剪枝:建树建到一半就完。典型标志:
- 已经没有可分属性(节点中所有样本的特征值一致)
- 已经全部归为一类(节点中所有样本的标签值一致)
- 信息增益已经不再增加
- 数据集样本数已经小于阈值,或决策树高度已经超过高度阈值
后剪枝:完全建好之后,自底向上进行节点合并。
- 合并之后的节点是给True还是False?按照训练数据集投票,哪个多取用哪个。
- 合并停止的标志:仍然可以参考剪枝结束的方式。
- 合并之后泛化误差值不再减小。(泛化误差/loss怎么衡量?见下。)
- 数据集样本数已经符合样本数阈值,决策树高度已经符合高度阈值。
一种loss的定义方式
来自2
l
o
s
s
=
C
(
T
)
+
α
T
loss = C(T)+\alpha T
loss=C(T)+αT
loss分为两部分,前半部分
C
(
T
)
C(T)
C(T)表示决策树的复杂度。
C
(
T
)
=
∑
t
=
1
T
N
t
E
n
t
C(T)=\sum_{t=1}^{T}N_tEn_t
C(T)=t=1∑TNtEnt
N
t
N_t
Nt表示叶子节点t上的样本数,
E
n
t
En_t
Ent表示叶子节点t上通过样本标签值计算的信息熵,
T
T
T表示叶子节点数。
后半部分
α
T
\alpha T
αT中
α
>
0
\alpha>0
α>0为参数,这一项用来控制树的大小对loss造成的影响。
连续值处理
对于某个连续属性,划分成使信息增益最大的两部分。信息增益的计算和上面一样。
其实相当于不同的阈值划分导致样本二分上的差异,我们要在这么多二分方案中选择信息增益最大的那个方案,使属性离散化。离散化之后再去和别人比。
缺失值处理
为样本的每个可能值赋予一个概率,细节见西瓜书1的4.4.2.
经典算法概述
ID3
最基本的方法,用信息增益选择属性+不剪枝
ID3算法只有树的生成,而没有树的剪枝。这会导致决策树的过拟合。2
C4.5
用信息增益率选择属性,树构造完成后剪枝,有连续值和缺失值处理。
(如果只是换一下选择属性准则,那真的可谓换汤不换药了。)
CART
用Gini index选择属性,而且每次只进行二分。3
没错,因为只能二分,所以需要测试的种类数很多。
- 离散属性的二分:某些取值归左,其他取值归右,在 2 v − 2 2 \frac{2^v-2}{2} 22v−2种划分方案中取优
- 2^v表示全部划分情况,-2表示全左或者全右的情况,/2表示左右划分的对称。
- 连续属性的二分:按照阈值二分,在 n − 1 n-1 n−1种划分方案中取优。