一、决策树介绍
1、基本实现
决策树(descision tree) 是一种常见的机器学习算法。以二分类任务为例,我们希望从给定训练数据集学得一个模型用以对新事例进行分类,这个过程可以看作是一种“决策”或“判定”,决策树就是基于树结构来进行决策的。在决策的过程中通常会进行一系列的判断或“子决策”。
2、基本组成
一棵决策树只有一个根节点、若干个内部节点和若干个叶结点;叶结点对应于决策结果,其它每个内部结点对用于一个属性测试;每个内部节点包含的样本集合根据属性测试的结果被划分到子结点中;根节点包含样本全集。从根节点到每个叶子节点的路径都对应了一个判定测试序列。
决策树学习的目的是为了产生一颗泛化能力强,即处理未见实例能力强的决策树,其基本列成遵循简单的“分而治之”(divide-and-conquer)策略,如下图
二、决策树划分选择
由算法4.2上图中可以看出,决策树 学习的关键是第8行,即如何选择最优划分属性。一般而言,随着划分过程不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即结点的“纯度”(purity)越来越高。
1、信息增益
(1.1)、“信息熵”(information entropy)
“信息熵”是度量样本纯度最常用的一种指标。
假定当前样本集合
D
D
D 中第
k
k
k 类样本所占的比例为
p
k
(
k
=
1
,
2
,
…
,
∣
Y
∣
)
p_k(k=1,2,…,|Y|)
pk(k=1,2,…,∣Y∣),则
D
D
D的信息熵定义为
E
n
t
(
D
)
=
−
∑
k
=
1
∣
Y
∣
p
k
log
2
p
k
(
2.1.1
)
Ent(D)=-\sum_{k=1}^{|Y|} p_k\log_2 p_k~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(2.1.1)
Ent(D)=−k=1∑∣Y∣pklog2pk (2.1.1)
E
n
t
(
D
)
Ent(D)
Ent(D) 的值越小,则
D
D
D 的纯度越高。
(1.2)、“信息增益”(information gain)
假定离散属性 a a a 有 V V V 个可能的取值{ a 1 , a 2 , … , a V a^1,a^2,…,a^V a1,a2,…,aV},使用 a a a 对样本集 D D D 进行划分,则会产生 V V V 个分支节点,其中第 v v v 个分支节点包含了 D D D 中所有在属性 a a a 上取值为 a v a^v av 的样本,记为 D v D^v Dv 。
根据式(1.1)计算出
D
v
D^v
Dv 的信息熵,考虑到不同分支结点所包含的样本数不同,给分支节点赋予权重
∣
D
v
∣
∣
D
∣
\frac{|D^v|}{|D|}
∣D∣∣Dv∣ ,即样本数越多的分支节点的影响越大, 于是可计算出属性
a
a
a 对样本集
D
D
D 进行划分所获得的“信息增益”
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
(
2.1.2
)
Gain(D,a)=Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v)~~~~~~~~~~~~~~~(2.1.2)
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv) (2.1.2)
信息增益就是选择属性a来进行样本划分所获得的"纯度提升"程度。
一般而言,信息增益越大,则意味着使用属性 a a a 来进行划分所获得的“纯度提升”越大。 因此,我们可以用信息增益来进行决策树的划分属性选项,即在(4.2)算法第8行选择属性 a ∗ = arg a ∈ A max G a i n ( D , a ) a_* = \arg _{a\in A} \max Gain(D,a) a∗=arga∈AmaxGain(D,a) ,ID3 算法就是使用信息增益准则来选择划分属性。
信息增益的缺点:对可取值数目较多的属性有所偏好。
2、信息增益率(information gain ratio)
当我们把编号(或 ID 号)也作为一个划分属性时,根据式(1.2)可以计算出它的信息增益,然而这个值远大于其它候选划分属性。因为每个编号都会成为一个分支,每个分支节点仅包含一个样本,这些分支节点的纯度已达到最大。 但是这样的决策树显然不具有泛化能力,无法对新样本进行有效预测。
因此不直接使用 “信息增益”,而是使用“增益率”来选择最优划分属性。
G
a
i
n
_
r
a
t
i
o
n
(
D
,
a
)
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
(
2.2.1
)
Gain\_ration(D,a)=\frac{Gain(D,a)}{IV(a)}~~~~~~~~~~~~~~~~~~~~(2.2.1)
Gain_ration(D,a)=IV(a)Gain(D,a) (2.2.1)
I
V
(
a
)
=
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
log
2
∣
D
v
∣
∣
D
∣
(
2.2.2
)
IV(a)=-\sum_{v=1}^V \frac{|D^v|}{|D|}\log_2{\frac{|D^v|}{|D|}}~~~~~~~~~~~~~~~~~~~~~~~~~~~(2.2.2)
IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣ (2.2.2)
I V IV IV 被称为属性 a a a 的固有值(intrinsic value),属性 a a a 的可能取值数目越多(即 V V V 越大),则 I V ( a ) IV(a) IV(a) 的值通常会越大。
“信息增益率” 解决了信息增益对可取值数目较多的属性有所偏好的缺点,C4.5决策树算法就使用增益率方法进行计算。
信息率的缺点:对可取值数目较少的属性有所偏好。
基于这个缺点,C4.5算法不是直接使用增益率最大的候选划分属性,而是使用了一 个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增 益率最高的。
3、基尼指数(Gini index)
CART 决策树学习算法使用 “尼基指数” 来选择划分属性。采用与式(2.1.1)相同符号,数据集的纯度可用基尼值来度量:
G
i
n
i
(
D
)
=
∑
k
=
1
∣
Y
∣
∑
k
′
≠
k
p
k
p
k
′
Gini(D)=\sum_{k=1}^{|Y|}\sum_{k^\prime \not=k}p_kp_k^\prime~~~~~~~~~~~~~~~~~~~~~~~~
Gini(D)=k=1∑∣Y∣k′=k∑pkpk′
=
∑
k
=
1
∣
Y
∣
∑
k
′
≠
k
p
k
(
1
−
p
k
)
~~~=\sum_{k=1}^{|Y|}\sum_{k^\prime \not=k}p_k(1-p_k)
=k=1∑∣Y∣k′=k∑pk(1−pk)
=
1
−
∑
k
=
1
∣
Y
∣
p
k
2
(
2.3.1
)
~~~~~~~~~~~~~~~=1-\sum_{k=1}^{|Y|}p_k^2~~~~~~~~~~~~~~~(2.3.1)
=1−k=1∑∣Y∣pk2 (2.3.1)
G i n i ( D ) Gini(D) Gini(D)反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率, G i n i ( D ) Gini(D) Gini(D) 值越小,数据集 D D D 的纯度越高。
采用与式(4.2)相同符号表示,属性
a
a
a 的基尼指数定义为
G
i
n
i
_
i
n
d
e
x
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
G
i
n
i
(
D
v
)
(
2.3.2
)
Gini\_index(D,a)=\sum_{v=1}^{V}\frac{|D^v|}{|D|}Gini(D^v)~~~~~~~~~~~~~~~(2.3.2)
Gini_index(D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv) (2.3.2)
在候选属性集合 A A A 中,选择使得划分后基尼指数最小的属性作为最优划分属性,即 a ∗ = arg a ∈ A G i n i _ i n d e x ( D , a ) 。 a_*=\arg_{a\in A} Gini\_index(D,a)。 a∗=arga∈AGini_index(D,a)。
三、剪枝处理
1、为什么要剪枝
剪枝(pruning)是决策树对付 “过拟合” 的重要手段。
过拟合的产生:在决策树学习中,为了尽可能正确分类训练样本,重复进行结点划分,有时会造成决策树分支过多,分类器会因训练样本学习的太好了,而把训练及自身的一些特点当作所有数据都具有的一般性质进而导致过拟合。
因此,可通过剪枝处理去掉一些分支来降低过拟合风险。
2、预剪枝
(2.1)、剪枝过程
在决策树生成过程中,对每个节点先判断,如果划分后决策树的泛化能力提升则进行划分;当划分后决策树的泛化能力没有提升,则停止划分并将当前节点标记为叶子结点。
判断泛化能力是否提升可使用模型评估方法,如留出法,预留一部分数据作为 “验证集” ,通过计算划分前后的验证集的精度来进行评估。
(2.2)、优点
- 降低过拟合风险
- 速度快,减少时间开销
(2.3)、缺点
- 有欠拟合风险
3、后剪枝
(3.1)、剪枝过程
生成一颗完整的决策树后,自底向上对非叶结点进行考察,若将该节点对应子树替换为叶结点能带来决策树泛化能力提升,则将该子树替换为叶结点。
(3.2)、优点
- 保留的分支多,欠拟合风险小
- 泛化能力优于预剪枝
(3.3)、缺点
- 训练时间开销大
四、连续值与缺失值
1、连续值处理
(1.1)、原理
由于连续值可取值数目不再有限,不能直接根据连续属性的可取值对结点进行划分,可以通过对连续值进行离散化,再进行划分。
(1.2)、离散化方法
二分法 ( C4.5决策树算法就采用这种机制)
给定样本集
D
D
D 和连续属性
a
,
a
a, a
a,a 在
D
D
D 上有
n
n
n 个不同取值,先将连续值从小到大排序记为{
a
1
,
a
2
,
…
,
a
n
a^1,a^2,…,a^n
a1,a2,…,an},基于划分点
t
t
t 进行二分,对相邻属性取值
a
i
a^i
ai 和
a
i
+
1
a^{i+1}
ai+1 来说,
t
t
t 在区间
[
a
i
,
a
i
+
1
]
\left[ a^i,a^{i+1}\right]
[ai,ai+1] 中去任何值所产生的划分结果相同。因此,对连续属性
a
a
a ,可考察
n
−
1
n-1
n−1 个元素的候选划分点集合
即把区间
[
a
i
,
a
i
+
1
]
\left[ a^i,a^{i+1}\right]
[ai,ai+1] 的中位点
a
i
+
a
i
+
1
2
\frac{a^i+~a^{i+1}}{2}
2ai+ ai+1 作为候选划分点,然后像离散属性值一样来考虑这些划分点,选取最优划分点进行样本集合划分,如对信息增益 (2.1.2) 稍加改造
其中
G
a
i
n
(
D
,
a
)
Gain(D,a)
Gain(D,a) 是样本集
D
D
D 基于划分点
t
t
t 二分后的 “信息增益”,从中选择最大的划分点。
2、缺失值处理
对于缺失值的处理需要解决以下两个问题:
(2.1)、如何在属性值缺失的情况下进行划分属性选择
给定训练集
D
D
D 和属性
a
a
a ,令
D
~
\tilde{D}
D~ 表示
D
D
D 中在属性
a
a
a 上没有缺失值的样本子集。假定属性
a
a
a 有
V
V
V 个可取值{
a
1
,
a
2
,
…
,
a
V
a^1,a^2,…,a^V
a1,a2,…,aV },令
D
~
v
\tilde{D}^v
D~v 表示
D
~
\tilde{D}
D~ 中在属性
a
a
a 上取值为
a
v
a^v
av 的样本子集,
D
~
k
\tilde{D}_k
D~k 表示
D
~
\tilde{D}
D~ 中属于第
k
k
k 类
(
k
=
1
,
2
,
…
,
∣
Y
∣
)
\left( k=1,2,…,|Y|\right)
(k=1,2,…,∣Y∣)的样本子集,给每个样本
x
x
x 赋予一个权重
w
x
w_x
wx,并定义
ρ
=
∑
x
∈
D
~
w
x
∑
x
∈
D
w
x
(
4.2.1
)
\rho=\frac{{\sum_{x\in\tilde{D}}w_x}}{\sum_{x\in D}w_x}~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~(4.2.1)
ρ=∑x∈Dwx∑x∈D~wx (4.2.1)
p
k
~
=
∑
x
∈
D
k
~
w
x
∑
x
∈
D
~
w
x
(
1
≤
k
≤
∣
Y
∣
)
(
4.2.2
)
\tilde{p_k}=\frac{{\sum_{x\in\tilde{D_k}}w_x}}{\sum_{x\in\tilde{D}}w_x}~~~(1\leq k \leq |Y|)~~~~~~~~~~~~(4.2.2)
pk~=∑x∈D~wx∑x∈Dk~wx (1≤k≤∣Y∣) (4.2.2)
r
v
~
=
∑
x
∈
D
v
~
w
x
∑
x
∈
D
~
w
x
(
1
≤
k
≤
V
)
(
4.2.3
)
\tilde{r_v}=\frac{{\sum_{x\in\tilde{D^v}}w_x}}{\sum_{x\in\tilde{D}}w_x}~~(1\leq k \leq V)~~~~~~~~~~~~~~~(4.2.3)
rv~=∑x∈D~wx∑x∈Dv~wx (1≤k≤V) (4.2.3)
ρ \rho ρ 表示无缺失值样本所占的比例
p k ~ \tilde{p_k} pk~ 表示无缺失值样本中第 k k k 类所占的比例
r v ~ \tilde{r_v} rv~ 则表示无缺失值样本中在属性 a a a 上取值 a v a^v av 的样本所占的比例。
将(2.1.2)式进行推广
G
a
i
n
(
D
,
a
)
=
ρ
∗
G
a
i
n
(
D
~
,
a
)
Gain(D,a)=\rho * Gain(\tilde{D},a)~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Gain(D,a)=ρ∗Gain(D~,a)
=
ρ
∗
(
E
n
t
(
D
~
)
−
∑
v
=
1
V
r
v
~
E
n
t
(
D
v
~
)
)
(
4.2.4
)
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~=\rho * \left( Ent(\tilde{D})-\sum_{v=1}^V \tilde{r_v}Ent(\tilde{D^v})\right)~~~~~(4.2.4)
=ρ∗(Ent(D~)−v=1∑Vrv~Ent(Dv~)) (4.2.4)
由式(2.1.1)可知
E n t ( D ~ ) = − ∑ k = 1 ∣ Y ∣ p k ~ log 2 p k ~ Ent(\tilde{D})=-\sum_{k=1}^{|Y|}\tilde{p_k}\log_2 \tilde{p_k} Ent(D~)=−k=1∑∣Y∣pk~log2pk~
(2.2)、给定划分属性,样本在该属性上值缺失,样本如何划分
x x x 在划分属性 a a a 上取值未知,则将 x x x 同时划入所有子节点,且样本权值在属性值 a v a^v av 对应的子节点中调整为 r v ~ ⋅ w x \tilde{r_v}\cdot w_x rv~⋅wx,这就是让同一个样本以不同的概率划入不同的子节点中去,这个概率就是结点中各种类别样本所占的比例。
五、多变量决策树
每个属性可视为坐标空间中的一个坐标轴,则
d
d
d 个属性描述的样本对应了
d
d
d 维空间中的一个数据点,样本分类就是在这个坐标空间中寻找不同类样本之间的分类边界,决策树形成的分类边界都有一个特点:轴平行(axis-parallel),即它的分类边界由若干个于坐标轴平行的分段组成。
单变量决策树分类边界的每一段都与坐标轴平行,每段划分都对应某个属性取值,其所得的学习结果有很好的可解释性。但在学习任务真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似, 如下图所示;此时的决策树会很复杂,预测时间开销会很大。
多变量决策树(multivariate descision tree)可以使用斜的划分边界进行划分。此时,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试,即每个结点是一个形如
∑
i
=
1
d
w
i
a
i
=
t
\sum_{i=1}^d w_ia_i=t
∑i=1dwiai=t 的线性分类器,其中
w
i
w_i
wi 是属性,
a
i
a_i
ai 是权重,
w
i
w_i
wi 和
t
t
t 可在该节点所包含的样本集和属性集上学得。