1. 基本流程
决策树(decision tree)是一种常见的机器学习算法,以二分类为例,我们希望从给定的数据集学得一个模型用于对新实例进行分类,我们把对样本的分类看成 “这个样本是否为正例?” 这个问题的决策过程,从而,我们可以的到一个基于树结构的判别过程,这和人类再面临决策问题时的处理机制非常相似。下图展示了对于西瓜判定问题的树结构:
决策过程的最终结论对应了我们所希望的判定结果,决策过程中提出的每个判定问题都是对于某个属性的 “测试” ,每个测试的结果或是导出最终结论,或是导出进一步的判定问题,新的判定问题的判定范围是在上次决策结果的限定范围之内。
一般的,一棵决策树包含一个根节点、若干个内部节点和若干个叶节点;叶节点对应于决策结果,其他的每个节点对应于一个属性测试;每个节点包含的样本集合根据属性测试的结果被划分到子节点中;根节点包含样本的全集。从根节点到每个叶节点的路径对应了一个判定测试序列。决策树学习的 目的 是:为了产生一棵泛化能力强,即处理未来示例能力强的决策树,其基本流程如下:
决策树的生成是一个递归过程。在决策树基本算法中,有三种情况会导致递归返回:
- 当前结点包含的样本全属于同一类别,无需划分
- 当前属性集为空,或是所有样本在所有属性上取值相同,无法划分
- 当前结点包含的样本集合为空,不能划分
2. 划分选择
决策树每次判定都需要选择一个属性作为 划分属性,一个数据集可能有很多样本,我们每次应该选择哪个样本作为第一个划分,哪一个作为第二个划分,对应于上图的算法第 8 行的问题,我们应该如何选择最优划分属性。一般来说,随着划分过程的不断进行,我们希望决策树的分支节点所包含的样本尽可能属于同一类别,即节点的 “纯度”(purity)越来越高。也就是每次划分后,得到的每部分的样本中,纯度尽可能大,下面我们通过衡量通过每种属性进行划分后得到结果的纯度来决定将哪个属性作为首先选择的属性划分。
2.1 信息增益
“信息熵”(information entropy) 是度量样本集合纯度最常用的一种指标。假定当前样本集合
D
D
D 中第
k
k
k 类样本所占的比例为
p
k
(
k
=
1
,
2
,
⋯
,
∣
Y
∣
)
p_k(k=1,2,\cdots,|\mathcal{Y}|)
pk(k=1,2,⋯,∣Y∣) ,则
D
D
D 的 信息熵 定义为
Ent
(
D
)
=
−
∑
k
=
1
∣
Y
∣
p
k
log
2
p
k
\operatorname{Ent}(D)=-\sum_{k=1}^{|\mathcal{Y}|} p_{k} \log _{2} p_{k}
Ent(D)=−k=1∑∣Y∣pklog2pk
Ent ( D ) \operatorname{Ent}(D) Ent(D) 的值越小,则 D D D 的纯度越高。
假定离散属性 a a a 有 V V V 个可能的取值 { a 1 , a 2 , ⋯ , a V } \{a^1,a^2,\cdots,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 。所以,我们也可以根据上式计算出 C v C^v Cv 的信息熵。在考虑不同的分支结点所包含的样本数不一样,给分支结点赋予权重 ∣ D v ∣ ∣ D ∣ \frac{|D^v|}{|D|} ∣D∣∣Dv∣ ,即样本数越多的分支结点的影响越大,于是可以计算出用属性 a a a 对样本集 D D D 进行划分所获得的 “信息增益(information gain)
Gain ( D , a ) = Ent ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ Ent ( D v ) \operatorname{Gain}(D, a)=\operatorname{Ent}(D)-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Ent}\left(D^{v}\right) Gain(D,a)=Ent(D)−v=1∑V∣D∣∣Dv∣Ent(Dv)
一般而言,信息增益越大,意味着使用属性 a a a 来划分所获得的 “纯度提升” 越大,因此,我们可以用信息增益来进行决策树的划分属性选择,即选择属性 a ∗ = arg max Gain ( D , a ) a_*=\operatorname{arg}\operatorname{max}\operatorname{Gain}(D, a) a∗=argmaxGain(D,a) 作为每一步的划分属性。
以西瓜分类为例,对于下图所示的西瓜数据集,显然
∣
Y
∣
=
2
|\mathcal{Y}|=2
∣Y∣=2 对于每个属性,我们首先求得对于每个属性取值中,正例和反例的比例
p
k
p_k
pk ,然后就可以根据每个属性值的信息熵,再根据所有属性值的信息熵,计算改属性的信息增益,通过比较不同属性的信息增益,选择将哪个属性作为开始的划分属性。依次类推,我们可以对每个分支结点进行属性划分,最终构成决策树。
2.3 信息增益
事实上,信息增益准则对可能取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,我们可以使用 “增益率”(gain ratio) 来选择最优划分属性。增益率定义为
Gain_ratio ( D , a ) = Gain ( D , a ) IV ( a ) \text { Gain\_ratio }(D, a)=\frac{\operatorname{Gain}(D, a)}{\operatorname{IV}(a)} Gain_ratio (D,a)=IV(a)Gain(D,a)
其中
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ \mathrm{IV}(a)=-\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \log _{2} \frac{\left|D^{v}\right|}{|D|} IV(a)=−v=1∑V∣D∣∣Dv∣log2∣D∣∣Dv∣
称为属性 a a a 的 “固有属性”(intrinsic value)。属性 a a a 的可能取值数目越多(即 V 越大),则 I V ( a ) \mathrm{IV}(a) IV(a)的值通常会越大,这样就可以避免属性值较多对属性选择造成的影响。
增益率准则对可取值数目较少的属性有所偏好,因此我们可以使用一个启发式方法:先从候选划分属性中找出增益率高于平均水平的属性,再从中选择增益率最高的。
2.4 基尼指数
CART决策树(Classification and Regression)使用 “基尼指数”(Gini index) 来选择划分属性。数据集
D
D
D 的纯度可用 基尼值 来度量:
Gini
(
D
)
=
∑
k
=
1
∣
Y
∣
∑
k
′
≠
k
p
k
p
k
′
=
1
−
∑
k
=
1
∣
Y
∣
p
k
2
\begin{aligned} \operatorname{Gini}(D) &=\sum_{k=1}^{|\mathcal{Y}|} \sum_{k^{\prime} \neq k} p_{k} p_{k^{\prime}} \\ &=1-\sum_{k=1}^{|\mathcal{Y}|} p_{k}^{2} \end{aligned}
Gini(D)=k=1∑∣Y∣k′=k∑pkpk′=1−k=1∑∣Y∣pk2
基尼值反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率,因此,基尼值越小,数据集 D D D 的纯度越高。
属性
a
a
a 的基尼指数定义为
Gini_index
(
D
,
a
)
=
∑
v
=
1
V
∣
D
v
∣
∣
D
∣
Gini
(
D
v
)
\text { Gini\_index }(D, a)=\sum_{v=1}^{V} \frac{\left|D^{v}\right|}{|D|} \operatorname{Gini}\left(D^{v}\right)
Gini_index (D,a)=v=1∑V∣D∣∣Dv∣Gini(Dv)
我们可以在候选属性集合中,选择使得划分后基尼指数最小的属性作为最有划分属性,即 a ∗ = arg min a ∈ A G i n i i n d e x ( D , a ) a_{*}=\underset{a \in A}{\arg \min } \operatorname{Gini_index}(D, a) a∗=a∈AargminGiniindex(D,a) 。
3. 剪枝处理
剪枝(pruning)是决策树学习算法中对付 “过拟合” 的主要手段。在决策树中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,这时就可能因训练样本学的过好,以至于把训练集自身的一些 特点当作所有数据都具有的一般性质而导致过拟合,所以,可以通过主动去掉一些分支来降低过拟合的风险。
决策树剪枝的基本策略有 “预剪枝”(prepruning) 和 “后剪枝”(postpruning)。预剪枝 是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前节点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶节点;后剪枝 则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶节点可以提高决策树的泛化性能,则将该子树替换为叶节点。
对泛化性能的评估可以使用留出法。也就是预留出一部分数据用作验证集,以进行性能的评估。预剪枝先找到划分属性,然后使用未划分之前的模型进行验证,再使用划分后的模型进行验证泛化性能,决定是否对此进行划分。后剪枝是先生成一棵完整的决策树,然后对每个结点进行依次删除,计算删除结点前后对验证集的测试结果,决定是否将该叶节点删去。
后剪枝决策树通常比预剪枝决策树保留了更多的分支,一般情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树,但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对所有非叶节点进行逐一考察,所以训练的时间开销会更大。
4. 连续与缺失值
4.1 连续值处理
前面我们讨论的都是基于离散属性来生成决策树,在现实中,我们常常遇到连续属性,由于有连续属性的可取值数目不是有限的,所以不能直接根据连续属性的可取值来对结点进行划分。这时我们可以对连续属性进行离散化,最简单的策略是采用 二分法(bi-partition) 对连续属性进行处理。
给定样本集
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,\cdots,a^n\}
{a1,a2,⋯,an} 。基于划分点
t
t
t 可将
D
D
D 分为子集
D
t
−
D_t^-
Dt− 和
D
t
+
D_t^+
Dt+,其中
D
t
−
D_t^-
Dt− 包含在属性
a
a
a 上取值不大于
t
t
t 的样本,而
D
t
+
D_t^+
Dt+ 包含在属性
a
a
a 上取值大于
t
t
t 的样本。因此,对连续属性
a
a
a ,我们可以考察有
n
−
1
n-1
n−1 个候选划分点,他们组成候选划分点集合
T
a
=
{
a
i
+
a
i
+
1
2
∣
1
⩽
i
⩽
n
−
1
}
T_{a}=\left\{\frac{a^{i}+a^{i+1}}{2} \mid 1 \leqslant i \leqslant n-1\right\}
Ta={2ai+ai+1∣1⩽i⩽n−1}
也就是我们可以把区间
[
a
i
,
a
i
+
1
)
[a^i,a^{i+1})
[ai,ai+1) 的中位点
a
i
+
a
i
+
1
2
\frac{a^i+a^{i+1}}{2}
2ai+ai+1 作为候选划分点,然后我们就可以像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集合的划分。这时,基于划分点
t
t
t 的信息增益可以定义为
Gain
(
D
,
a
)
=
max
t
∈
T
a
Gain
(
D
,
a
,
t
)
=
max
t
∈
T
a
Ent
(
D
)
−
∑
λ
∈
{
−
,
+
}
∣
D
t
λ
∣
∣
D
∣
Ent
(
D
t
λ
)
\begin{aligned} \operatorname{Gain}(D, a) &=\max _{t \in T_{a}} \operatorname{Gain}(D, a, t) \\ &=\max _{t \in T_{a}} \operatorname{Ent}(D)-\sum_{\lambda \in\{-,+\}} \frac{\left|D_{t}^{\lambda}\right|}{|D|} \operatorname{Ent}\left(D_{t}^{\lambda}\right) \end{aligned}
Gain(D,a)=t∈TamaxGain(D,a,t)=t∈TamaxEnt(D)−λ∈{−,+}∑∣D∣∣∣Dtλ∣∣Ent(Dtλ)
4.2 缺失值处理
现实中我们常常会遇到不完整的样本,即样本的某些属性值缺失,如果简单的将不完整的样本放弃,是对数据信息的浪费,所以我们需要从缺失属性值的训练样本进行学习。
要想实现从确实属性值的训练样本进行学习,我们需要解决两个问题
- 如何在属性确实的情况下进行划分属性的选择?
- 给定划分属性,若样本在该属性上的值确实,如何对样本进行划分?
对于第一个问题,给定训练集
D
D
D 和属性
a
a
a,令
D
~
\widetilde{D}
D
表示
D
D
D 中在属性
a
a
a 上没有缺失值的样本子集。我们可以仅仅根据
D
~
\widetilde{D}
D
来判别属性
a
a
a 的优劣。假定属性
a
a
a 有
V
V
V 个可取值
{
a
1
,
a
2
,
⋯
,
a
V
}
\{a^1,a^2,\cdots,a^V\}
{a1,a2,⋯,aV} ,令
D
~
v
\widetilde{D}^v
D
v 表示
D
~
\widetilde{D}
D
中在属性
a
a
a 上取值为
a
v
a^v
av 的样本子集,
D
~
k
\widetilde{D}_k
D
k 表示
D
~
\widetilde{D}
D
中属于第
k
k
k 类
(
k
=
1
,
2
,
⋯
,
∣
Y
∣
)
(k=1,2,\cdots,|\mathcal{Y}|)
(k=1,2,⋯,∣Y∣) 的样本子集,则有
D
~
=
⋃
k
=
1
∣
Y
∣
D
~
k
\tilde{D}=\bigcup_{k=1}^{|\mathcal{Y}|} \widetilde{D}_{k}
D~=⋃k=1∣Y∣D
k,
D
~
=
⋃
v
=
1
V
D
~
v
\widetilde{D}=\bigcup_{v=1}^{V} \widetilde{D}^{v}
D
=⋃v=1VD
v。假定我们为每个样本
x
\boldsymbol{x}
x 赋予一个权重
w
x
w_{\boldsymbol{x}}
wx,再定义
ρ
=
∑
x
∈
D
~
w
w
∑
x
∈
D
w
x
p
~
k
=
∑
x
∈
D
~
k
w
x
∑
x
∈
D
~
w
x
(
1
⩽
k
⩽
∣
Y
∣
)
r
~
v
=
∑
x
∈
D
~
v
w
x
∑
x
∈
D
~
w
(
1
⩽
v
⩽
V
)
\begin{aligned} \rho &=\frac{\sum_{\boldsymbol{x} \in \tilde{D}}^{w} \boldsymbol{w}}{\sum_{\boldsymbol{x} \in D} w_{\boldsymbol{x}}} \\ \tilde{p}_{k} &=\frac{\sum_{\boldsymbol{x} \in \tilde{D}_{k}} w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x} \in \tilde{D}} w_{\boldsymbol{x}}} \quad(1 \leqslant k \leqslant|\mathcal{Y}|) \\ \tilde{r}_{v} &=\frac{\sum_{\boldsymbol{x} \in \tilde{D}^{v}} w_{\boldsymbol{x}}}{\sum_{\boldsymbol{x} \in \tilde{D}}^{w}} \quad(1 \leqslant v \leqslant V) \end{aligned}
ρp~kr~v=∑x∈Dwx∑x∈D~ww=∑x∈D~wx∑x∈D~kwx(1⩽k⩽∣Y∣)=∑x∈D~w∑x∈D~vwx(1⩽v⩽V)
对属性 a a a , ρ \rho ρ 表示无缺失样本所占的比例, p ~ k \tilde{p}_{k} p~k 表示无缺失样本中第 k k k 类所占的比例, r ~ v \tilde{r}_{v} r~v 表示无缺失值样本中在属性 a a a 上取值 a v a^v av 的样本所占的比例。有
基于以上,我们可以将信息增益的计算表示为
Gain
(
D
,
a
)
=
ρ
×
Gain
(
D
~
,
a
)
=
ρ
×
(
Ent
(
D
~
)
−
∑
v
=
1
V
r
~
v
Ent
(
D
~
v
)
)
\begin{aligned} \operatorname{Gain}(D, a) &=\rho \times \operatorname{Gain}(\tilde{D}, a) \\ &=\rho \times\left(\operatorname{Ent}(\tilde{D})-\sum_{v=1}^{V} \tilde{r}_{v} \operatorname{Ent}\left(\tilde{D}^{v}\right)\right) \end{aligned}
Gain(D,a)=ρ×Gain(D~,a)=ρ×(Ent(D~)−v=1∑Vr~vEnt(D~v))
其中
Ent
(
D
~
)
=
−
∑
k
=
1
∣
Y
∣
p
~
k
log
2
p
~
k
\operatorname{Ent}(\tilde{D})=-\sum_{k=1}^{|\mathcal{Y}|} \tilde{p}_{k} \log _{2} \tilde{p}_{k}
Ent(D~)=−k=1∑∣Y∣p~klog2p~k
对于第二个问题,若样本 x \boldsymbol{x} x 在划分属性 a a a 上的取值已知,则将 x \boldsymbol{x} x 划入与其取值对应的子结点,且样本权值在子结点中保持为 w x w_{\boldsymbol{x}} wx 。若样本 x \boldsymbol{x} x 在划分属性 a a a 上的取值未知,则将 x \boldsymbol{x} x 同时划入所有子结点,且样本权值在与属性值 a v a^v av 对应的子结点中调整为 r ~ v ⋅ w x \tilde{r}_{v} \cdot w_{\boldsymbol{x}} r~v⋅wx ,简单来说,就是让同一个样本以不同的概率划入到不同的子结点中去。
5. 多变量决策树
若我们把每个属性视为坐标空间中的一个坐标轴,则 d d d 个属性描述的样本就对应了 d d d 维空间中的一个数据点;对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界,决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成。
用下表的数据进行学习,可以得到下面的决策树。
这个据册数对应的分类边界如下:
可以发现,分类边界的每一段都是与坐标轴平行的,这样的分类边界使得学习结果有较好的可解释性,因为每一段划分都直接对应了某个属性取值。但在学习任务的真实分类边界比较复杂时,必须使用多段划分才能获得较好的近似,如下图所示:
若能够使用斜的划分边界,决策树模型将大为简化,如下图所示:
“多变量决策树”(multivariate decision tree)就是能实现 “斜划分” 甚至更复杂划分的决策树。以斜划分为例,这类树中,非叶结点不再仅对某个属性,而是 对属性的线性组合进行测试,也就是每个非叶结点是一个形如
∑
i
=
1
d
w
i
a
i
=
t
\sum_{i=1}^d w_i a_i=t
∑i=1dwiai=t 的线性分类器,其中
w
i
w_i
wi 是属性
a
i
a_i
ai 的权重,
w
i
w_i
wi 和
t
t
t 可在该结点所含的样本集和属性集上学得。所以,在多变量决策树的学习过程中不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。