第4章 决策树
4.1 基本流程
决策树(decision tree)是一类常见的机器学习方法,也叫“判定树”。顾名思义,决策树是基于树的结构进行决策的。
一般的,一棵决策树包含一个根结点、若干个内部结点和若干个叶结点:
- 叶结点对应于决策结果,其他每个结点则对应于一个属性测试;
- 每个结点包含的样本集合根据属性测试的结果被划分到子结点中;
- 根结点包含样本全集;
- 从根结点到每个叶结点的路径对应了一个判定测试序列。
决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树,其基本流程遵循简单且直观的“分而治之”(divide-and-conquer)策略。如下图所示:
可以看出,决策树的生成是一个递归过程。
在决策树基本算法中,有以下三种情形会导致递归返回:
- (1)当前结点包含的样本全属于同一类别,无需划分;
- (2)当前属性集为空,或是所有样本在所有属性上取值相同,无法划分;
在该情形下,我们把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别(利用当前节点的后验分布); - (3)当前结点包含的样本集合为空,不能划分。
在该情形下,我们把当前结点标记为叶结点,并将其类别设定为其父结点所含样本最多的类别(把父结点的样本分布作为当前结点的先验分布)。
4.2 划分选择
随着划分过程不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。
4.2.1 信息增益
“信息熵”(information entropy)是度量样本集合纯度最常用的一种指标。
假定当前样本集合\(D\)中第\(k\)类样本所占比例为\(p_{k}(k=1,2,...,|γ|)\),则\(D\)的信息熵定义为
\(Ent(D)=-\sum^{|γ|}_{k=1}p_{k}log_{2}p_{k}\). (式4.1)
\(Ent(D)\)的值越小,则\(D\)的纯度越高。
假定离散属性\(a\)有\(V\)个可能得取值\(\{a^{1},a^{2},...,a^{V}\}\),若使用\(a\)来对样本集\(D\)进行划分,则会产生\(V\)个分支结点,其中第\(v\)个分支结点包含了\(D\)中所有在属性\(a\)上取值为\(a^{v}\)的样本,记为\(D^{v}\)。
我们可根据式(4.1)计算出\(D^{v}\)的信息熵,由于不同的分支结点所包含的样本数不同,给分支结点赋予权重\(\frac{|D^{v}|}{|D|}\),即样本数越多的分支结点的影响越大,于是可计算出用属性\(a\)对样本集\(D\)进行划分所获得的“信息增益”(information gain)
\(Gain(D,a)=Ent(D)-\sum^{V}_{v=1}\frac{|D^{v}|}{|D|}Ent(D^{v})\) (式4.2)
一般地,信息增益越大,意味着使用属性\(a\)来进行划分所获得的“纯度提升”越大。
我们可以用信息增益来进行决策树的划分属性选择。ID3决策树学习算法就是以信息增益为准则来选择划分属性。(其中ID是Iterative Dichotomiser,迭代二分器的简称)。
4.2.2 增益率
实际上,信息增益准则对可取值数目较多的属性有所偏好,为减少这种偏好可能带来的不利影响,C4.5决策树算法不直接使用信息增益,而是使用“增益率”(gain ratio)来选择最优划分属性。
增益率定义为
\(Gain.ratio(D,a)=\frac{Gain(D,a)}{IV(a)}\) (式4.3)
其中
\(IV(a)=-\sum^{V}_{v=1}\frac{|D^{v}|}{|D|}log_{2}\frac{|D^{v}|}{|D|}\) (式4.4)
称为属性\(a\)的“固有值”(intrinsic value)。属性\(a\)的可能取值数目越多(即\(V\)越大),则\(IV(a)\)的值通常会越大。
需要注意,增益率准则对可取值数目较少的属性有所偏好。故C4.5算法不是直接算则增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择增益率最高的。
4.2.3 基尼指数
CART决策树(Classification and Regression Tree)使用“基尼指数”(Gini index)来选择划分属性。数据集\(D\)的纯度可以用基尼值来度量:
\(Gini(D)=\sum^{|γ|}_{k=1}\sum_{k^{'} \neq k}p_{k}p_{k^{'}}\\=1-\sum^{|γ|}_{k=1}p_{k}^{2}\) (式4.5)
\(Gini(D)\)反映了从数据集\(D\)中随机抽取两个样本,其类别标记不一致的概率。\(Gini(D)\)越小,则数据集\(D\)的纯度越高。
属性\(a\)的基尼指数定义为
\(Gini.index(D,a)=\sum^{V}_{v=1}\frac{|D^{v}|}{|D|}Gini(D^{v})\) (式4.6)
我们在候选属性集合\(A\)中,选择那个使得划分后基尼指数最小的属性作为最优划分属性,即\(a_{*}=argmin_{a \in A} Gini.index(D,a)\)
4.3 剪枝处理
剪枝(pruning)是决策树学习算法对付“过拟合”的主要手段。
决策树剪枝的基本策略有“预剪枝”(prepruning)和“后剪枝”(post-pruning)。
- 预剪枝:在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶结点。
- 后剪枝:先从训练集生成一棵完整的决策树,随后自底向上地对非叶结点进行考察。若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
而判断决策树泛化性能是否提升,则可以使用2.2节所介绍的性能评估方法。
4.3.1 预剪枝
- 预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。
- 但是,有些分支的当前划分虽不能提升泛化性能、甚至可能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高。
- 预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
4.3.2 后剪枝
- 后剪枝决策树通常比预剪枝决策树保留了更多的分支。
- 一般后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。
- 但后剪枝过程实在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
4.4 连续与缺失值
4.4.1 连续值处理
由于连续属性的可取值数目不再有限,因此不能直接根据连续属性的可取值来对结点进行划分。我们可以采用连续属性离散化技术。最简单的策略是采用二分法(bi-partition)对连续属性进行处理。(C4.5决策树算法采用了此机制)
给定样本集\(D\)和连续属性\(a\),假定\(a\)在\(D\)上出现了\(n\)个不同的取值,将这些值从小到大进行排序,记为\(\{a^{1},a^{2},...,a^{n}\}\).基于划分点\(t\)可将\(D\)分为子集\(D_{t}^{-}\)和\(D_{t}^{+}\),其中\(D_{t}^{-}\)包含那些在属性\(a\)上取值不大于\(t\)的样本,而\(D_{t}^{+}\)则包含那些在属性\(a\)上取值大于\(t\)的样本.
对相邻的属性取值\(a^{i}\)与\(a^{i+1}\)来说,\(t\)在区间\([a^{i},a^{i+1})\)中取任意值所产生的划分结果相同。因此,对连续属性\(a\),可考察包含\(n-1\)个元素的候选划分点集合,即把区间\([a^{i},a^{i+1})\)的中位点\(\frac{a^{i}+a^{i+1}}{2}\)作为候选划分点,随后我们即可像离散属性值一样来考察这些划分点,选取最优的划分点进行样本集合的划分。
若当前结点划分属性为连续属性,该属性还可作为其后代结点的划分属性。如在父结点上使用了“密度\(\leq 0.381\)”,不会禁止在子结点上使用“密度\(\leq 0.294\)”。
4.4.2 缺失值处理
现实任务重常会遇到不完整样本,即样本的某些属性值缺失。如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,是对数据信息极大的浪费。
我们需要解决的问题有两个:
(1)如何在属性值缺失的情况下进行划分属性选择?
(2)给定划分属性,若样本在该属性上的值缺失,如何对样本进行划分?
给定训练集\(D\)和属性\(a\),令\(\tilde{D}\)表示\(D\)中在属性\(a\)上没有缺失值的样本子集。
对问题(1):
此时我们仅可根据\(\tilde{D}\)来判断属性\(a\)的优劣。
假定属性\(a\)上有\(V\)个可取值\(\{a^{1},a^{2},...,a^{V}\}\),令\(\tilde{D}^{v}\)表示\(\tilde{D}\)中在属性\(a\)上取值为\(a^{v}\)的样本子集,\(\tilde{D}_{k}\)表示\(\tilde{D}\)中属于第\(k\)类(\(k=1,2,...,|γ|\))的样本子集,则显然有\(\tilde{D}=\cup_{k=1}^{|γ|}\tilde{D}_{k},\tilde{D}=\cup_{v=1}^{V}\tilde{D}^{v}\)。
假定我们为每个样本\(x\)赋予一个权重\(w_{x}\),并定义
\(\rho = \frac{\sum_{x \in \tilde{D}}w_{x}}{\sum_{x \in {D}}w_{x}}\), (式4.9)
\(\tilde{p_{k}} = \frac{\sum_{x \in \tilde{D}_{k}}w_{x}}{\sum_{x \in \tilde{D}}w_{x}}(1 \leq k \leq |γ|)\), (式4.10)
\(\tilde{r_{v}} = \frac{\sum_{x \in \tilde{D}^{v}}w_{x}}{\sum_{x \in \tilde{D}}w_{x}}(1 \leq v \leq V)\), (式4.11)
对属性\(a\),\(\rho\)表示无缺失值样本所占的比例,\(\tilde{p_{k}}\)表示无缺失值样本中第\(k\)类所占的比例,\(\tilde{r_{v}}\)表示无缺失值样本中在属性\(a\)上取值\(a^{v}\)的样本所占的比例。显然可以看出,\(\sum^{|γ|}_{k=1}\tilde{p_{k}}=1,\sum^{V}_{v=1}\tilde{r_{v}}=1\).
基于上述定义,可将信息增益的计算式(4.2)推广为:
\(Gain(D,a)=\rho \times Gain(\tilde{D},a)\\=\rho \times (Ent(\tilde{D}-\sum^{V}_{v=1}\tilde{r_{v}}Ent(\tilde{D}^{v})))\), (式4.12)
其中由式(4.1),有
\(Ent(\tilde{D})=-\sum^{|γ|}_{k=1}\tilde{p_{k}}log_{2}\tilde{p_{k}}\)
对问题(2):
- 若样本\(x\)在划分属性\(a\)上的取值已知,则将\(x\)划入与其取值对应的子结点,且样本权值在子结点中保持为\(w_{x}\).
- 若样本\(x\)在划分属性\(a\)上的取值未知,则将\(x\)同时划入所有子结点,且样本权值在与属性值\(a^{v}\)对应的子结点中调整为\(\tilde{r_{v}}\cdot w_{x}\)。直观来看这就是让同一个样本以不同的概率划入到不同的子结点中去。
4.5 多变量决策树
若我们把每个属性视为坐标空间中的一个坐标轴,则\(d\)个属性描述的样本就对应了\(d\)维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界。
决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成。这样的分类边界使得学习结果有较好的可解释性。
但在学习任务的真实分类边界比较复杂时,必须使用很多段划分才能获得较好的近似。此时决策树会相当复杂,由于要进行大量的属性测试,预测时间开销会很大。
如果能使用斜的划分边界,则决策树模型将大为简化。“多变量决策树”(multivariate decision tree)即为能实现这样的“斜划分”甚至更复杂划分的决策树。
- 在此类决策树中,非叶结点不再是仅对某个属性,而是对属性的线性组合进行测试。换言之,每个非叶结点时一个形如\(\sum^{d}_{i=1}w_{i}a_{i}=t\)的线性分类器,其中\(w_{i}\)是属性\(a_{i}\)的权重,\(w_{i}\)和\(t\)可在该结点所含的样本集和属性集上习得。
- 在多变量决策树的学习过程中,不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。