一、基本流程
一般来说,一棵决策树包含一个根结点、若干个内部节点和若干个叶结点。
叶结点对应于决策结果,其他每个结点对应于一个属性测试。
每个结点包含的样本根据属性测试的结果被划分到子节点当中。
根节点包含样本全集。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树。
其伪代码如下:
决策树是一个递归的过程。
在决策树基本算法当中,有三种情形会导致递归返回:
- 当前结点包含的样本全部属于同一类别,无需划分。
- 当前属性集合为空,或者当前所有样本在所有属性上取值相同,无法划分。
- 当前结点包含的样本集合为空,不能划分。
二、划分选择
选择最优划分属性是决策树学习的关键。
一般而言,随着划分过程的不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。
划分选择主要有信息增益、信息熵和基尼指数三种。
1. 信息增益
信息熵:是度量样本集合纯度的一种指标。
假定当前样本集合D种第k类样本所占比例为pk(k = 1, 2, …, |y|),则D的信息熵定义为:
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k l o g 2 p k Ent(D) =- \sum_{k=1}^{|y|} {p_klog_2p_k} Ent(D)=−k=1∑∣y∣pklog2pkEnt(D)的值越小,则代表D的纯度越高。
例如,当随机变量只取两个值,例如1,0时,即 X 的分布为:
P
(
X
=
1
)
=
p
P(X = 1) = p
P(X=1)=p
P
(
X
=
0
)
=
1
−
p
P( X=0 ) = 1-p
P(X=0)=1−p
0
≤
p
≤
1
0≤p≤1
0≤p≤1信息熵为:
H
(
p
)
=
−
p
l
o
g
2
p
−
(
1
−
p
)
l
o
g
2
(
1
−
p
)
H(p)=-plog_2p-(1-p)log_2(1-p)
H(p)=−plog2p−(1−p)log2(1−p)这时,熵H( p )随概率变化的曲线如图所示(单位为比特):
离散属性a有V个可能的取值{a1, a2, …, aV},若使用a来对样本D进行划分,则会产生V给分支点,其中第v个分支结点包含了D 种所有在a属性上取值为av的样本,记为Dv。
给分支结点赋予权重|Dv|/|D|,可以计算出属性a对样本集D进行划分所获得的“信息增益”:
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
E
n
t
(
D
v
)
Gain(D, a) = Ent(D) - \sum_{v=1}^{V}{\frac{|D^v|}{|D|}Ent(D^v)}
Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)即:
G
a
i
n
(
D
,
a
)
=
E
n
t
(
D
)
−
E
n
t
(
D
∣
A
)
Gain(D, a) = Ent(D) - Ent(D|A)
Gain(D,a)=Ent(D)−Ent(D∣A)一般而言,信息增益越大,则意味着使用属性a来进行划分获得的“纯度提升”越大。因此我们可以利用信息增益来进行决策树的划分属性选择,即选择a* = arg max Gain(D, a),其中a∈A。
举例如下:
2. 增益率
利用信息增益来划分属性的办法有时会出bug。
例如,如果加入一个属性,叫做ID,代表每个样本的编号(1, 2, …, n),这个属性将会产生n个分支,每个分支仅包含一个样本 ,这些分支的纯度已经达到最大。但是显然这样的决策树完全不具有泛化能力,根部无法对新的样本进行有效预测。
因此,使用“增益率”来选择最优的划分属性。
G
a
i
n
_
r
a
t
i
o
=
G
a
i
n
(
D
,
a
)
I
V
(
a
)
Gain\_ratio = \frac{Gain(D, a)}{IV(a)}
Gain_ratio=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∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
但是值得注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率高的。
3. 基尼指数
CART决策树使用“基尼系数”来选择划分属性:
G
i
n
i
(
D
)
=
∑
k
=
1
∣
y
∣
∑
k
′
≠
k
p
k
p
k
′
=
1
−
∑
k
=
1
∣
y
∣
p
k
2
Gini(D) = \sum_{k=1}^{|y|}{\sum_{k^{'}≠k}^{}{p_k p_{k^{'}}}} = 1 - \sum_{k=1}^{|y|}{p_k^2}
Gini(D)=k=1∑∣y∣k′=k∑pkpk′=1−k=1∑∣y∣pk2基尼指数Gini(D)表示集合D的不确定性。因此,Gini(D)越大,则代表数据集D的不确定性也就越大;反之,越小。
直观来看,Gini指数反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。
属性a的基尼指数定义为:
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∑V∣D∣∣Dv∣Gini(Dv)因此,在选择侯选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即a* = arg min Gini_index(D, a),其中a∈A 。
例如:
综上所述:如下图所示的,从二分类问题当中可以看出基尼指数和熵的曲线很接近,都可以近似代表分类误差率。
三、剪枝处理
剪枝是决策树学习算法对付过拟合的主要手段,基本策略分为“预剪枝”和“后剪枝”。
剪枝往往通过极小化决策树整体的损失函数来实现。
设树T的叶结点个数为|T|,t 是树 T 的叶结点,该叶结点有Nt个样本点,其中 k 类的样本点有Ntk个,k = 1, 2, 3, …,K,Ht(T)为叶结点 t 上的经验熵,α ≥ 0为参数,则决策树学习的损失函数可以定义为:
1. 预剪枝
预剪枝是在决策树生成过程中,对每个结点在划分前进行估计,若当前结点的划分不能带来决策树泛化能力的提升,则停止划分并将当前结点作为叶结点。
预剪枝有以下几方面影响:
① 降低了过拟合风险,显著减少了决策树的训练时间开销和测试时间。
② 但另一方面,有些分支虽然当前分支不能提升泛化能力、甚至可能导致泛化性暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高。
③ 预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝的决策树带来了欠拟合的风险。
2. 后剪枝
后剪枝是从训练集生成一颗完整的决策树,然后自底向上地对非叶子结点进行考察,若将该结点对应的子树替换为叶子结点能带来决策树泛化能力的提升,则将该子树替换为叶结点。
后剪枝有以下影响:
① 后剪枝决策树欠拟合风险很小,泛化性能往往由于预剪枝决策树。
② 但是后剪枝过程是在完全决策树之后进行的,并且要从下向上对书中所有的非叶节点进行注意考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
四、连续值与缺失值
1. 连续值处理
由于连续属性可取值不再有限,因此连续属性离散化可排上用场。
最简单的策略是采用二分法对连续属性进行处理:
① 可将n个数据点从小到大排序。
② 然后取每个区间的中位点。
③ 把这n - 1个值作为候选划分点。
④ 随后,便可以像对待离散属性一样考察这些划分点,选取最优的划分点进行样本集合的划分。
G a i n ( D , a , t ) = E n t ( D ) − ∑ λ ∈ { − , + } ∣ D t λ ∣ ∣ D ∣ E n t ( D t λ ) Gain(D, a, t) = Ent(D) - \sum_{\lambda∈\{-,+\}}^{}{\frac{|D_t^\lambda|}{|D|}Ent(D_t^\lambda)} Gain(D,a,t)=Ent(D)−λ∈{−,+}∑∣D∣∣Dtλ∣Ent(Dtλ)Gain(D, a, t)是样本集D基于划分点 t 二分后的信息增益。
我们选择max Gain(D, a, t)对应的 t 作为最大化的划分点。
但是需要注意的是,与离散属性不同的是,若当前结点以连续属性作为划分属性,该属性仍然可以作为其后代结点的划分属性。
2. 缺失值处理
能够处理含有缺失值的数据是非常重要的。
需要解决的问题有两个:
① 如何在属性值确实的情况下,选择进行划分的属性?(即如何计算含有缺失值属性的信息增益)
② 给定划分属性,若样本在该属性有缺失值,如何对样本进行划分?(即如何把缺失值样本分配到合适的结点当中)
五、多变量决策树
决策树形成的分类边界有一个明显的特点:轴平行,即它的分类边界由若干个与坐标轴平行的分段组成,如下图所示:
以上的分类边界使得分类结果有较好的解释性,但是在学习任务的真是分类边界比较复杂时,必须划分很多段才可以较好的近似,此时的决策树回很复杂,由于要进行大量的属性测试,预测时间的开销会变得非常大,如下图所示:
若能够使用上述红色边界,那么决策模型将会大大简化。“多决策变量树”即可实现这样的划分。
在此类决策树当中,非叶结点不再是仅针对某一个属性,而是对多个属性的线性组合进行测试。
换句话说,每个非叶结点是一个形如 ∑ i = 1 d ω i a i = t \sum_{i=1}^{d}{\omega_i a_i}=t i=1∑dωiai=t的线性分类器。
d个属性描述的样本对应d为空间的一个数据点,a代表各个属性,wi 和 t 都是结合该样本集和属性集上学习到的。
与“传统单变量决策树”不同,在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器,如下图所示:
主要参考和引用资料:
周志华《机器学习》
李航《统计学习方法》