1 基本流程
决策树是一种常见的机器学习方法,基于树结构来进行决策,因而得名。一般来说,一个决策树包含一个根节点,若干个内部节点和若干个叶节点。决策树学习的目的是为了产生一个泛化能力强,即处理未见示例能力强的决策树。
2 划分选择
决策树学习的关键是如何选择最优划分属性。随着划分过程的不断进行,我们希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的纯度越来越高。
2.1 信息增益
信息熵(information entropy)是度量样本集合纯度最常用的一种指标。假定当前样本集合D中第k类样本所占的比例为 p k p_k pk,则D的信息熵定义为:
E n t ( D ) = − ∑ k = 1 ∣ y ∣ p k log 2 p k E n t ( D ) = - \sum _ { k = 1 } ^ { | y | } p _ { k } \log _ { 2 } p _ { k } Ent(D)=−∑k=1∣y∣pklog2pk
Ent(D)的值越小,则D的纯度越高。
假设离散属性a可划分为V类,那么 D v D^v Dv就代表D中的a属性全部为 a v a^v av的子数据集,那么就可以计算出 D v D^v Dv的信息熵,又考虑到不同分支结点所包含的样本数不同,再给予分支节点权重 ∣ D v ∣ / ∣ D ∣ |D^v|/|D| ∣Dv∣/∣D∣,那么就可以计算出用属性a对样本D进行划分所获得的信息增益:
Gain ( D , a ) = Ent ( D ) − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ ∣ Ent ( D v ) \operatorname { G a i n } ( D , a ) = \operatorname { E n t } ( D ) - \sum _ { v = 1 } ^ { V } \frac { |D ^ { v } | } {| D |} | \operatorname { E n t } ( D ^ { v } ) Gain(D,a)=Ent(D)−∑v=1V∣D∣∣Dv∣∣Ent(Dv)
一般而言,信息增益越大,则意味着使周属性 a 来进行划分所获得的"纯度提升"越大,因此我们可以用信息增益来进行决策树的划分属性选择,即选择信息增益最大的属性 a v a^v av。
下文作者以西瓜为例介绍了计算信息熵和信息增益的方法,此处略过…
2.2 增益率
信息增益准则对可取值数目较多的属性有所偏好,例如样本编号,如果按这个属性划分,信息增益一定是最大的,为了减少这种偏好可能带来的不利影响,著名的C4.5决策树算法使用了“增益率”来选择最优划分属性。其定义为:
$ \operatorname {Gain_ratio} ( D , a ) = \frac { \operatorname { G a i n } ( D , a ) } { I V ( a ) }$
其中,
I V ( a ) = − ∑ v = 1 V ∣ D v ∣ ∣ D ∣ log 2 ∣ D v ∣ ∣ D ∣ \mathrm{IV}(a)=-\sum_{v=1}^V\frac{|D^v|}{|D|}\log_2\frac{|D^v|}{|D|} IV(a)=−∑v=1V∣D∣∣Dv∣log2∣D∣∣Dv∣
称为a属性的“固有值”。属性a可分类数目越多,则IV值越大。
需要注意的是,与信息增益不同,增益率对可分类数目较少的属性有所偏好,因此使用的时候并不是简单地选取增益率最大的属性,而是先从候选划分属性中找出信息增益高于平均水平的属性,在从中选取增益率最高的。二者结合选取。
2.3 基尼指数
CART 决策树 [Breiman et al., 1984] 使用"基尼指数" (Gini index) 来选 择划分属性。基尼值的表达式为:
G i n i ( D ) = ∑ k = 1 ∣ Y ∣ ∑ k ′ ≠ k p k p k ′ = 1 − ∑ k = 1 ∣ Y ∣ p k 2 . \begin{aligned}\mathrm{Gini}(D)=&\sum_{k=1}^{|\mathcal{Y}|}\sum_{k^{\prime}\neq k}p_kp_{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.
直观来说,Gini(D) 反映了从数据集 D 中随机抽取两个样本,其类别标记 不一致的概率。因此,Gini(D) 越小,则数据集 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 ) . \mathrm{Gini}\_\mathrm{index}(D,a)=\sum_{v=1}^V\frac{|D^v|}{|D|_.}\mathrm{Gini}(D^v). Gini_index(D,a)=∑v=1V∣D∣.∣Dv∣Gini(Dv).
一般选取基尼指数最小的属性作为最优划分属性。
3 剪枝处理
剪枝是决策树学习算法对付“过拟合”的主要手段,其主要思想就是主动去掉一些分支来降低过拟合的风险,决策树剪枝的基本策略有“预剪枝”和“后剪枝”两种。
3.1 预剪枝
预剪枝是指在决策树生成过程中,对每个结点在划分前先进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划 分并将当前结点标记为叶结点。
预剪枝使得决策树的很多分支都没有“展开”,这不仅降低了过拟合的风险,还显著减少了决策树的训练时间开销和测试时间开销。但另一方面,有些分支的当前划分虽不能提升泛化性能、甚至可
能导致泛化性能暂时下降,但在其基础上进行的后续划分却有可能导致性能显著提高;预剪枝基于“贪心”本质禁止这些分支展开,给预剪枝决策树带来了欠拟合的风险。
3.2 后剪枝
后剪枝则是先从训练集生成一棵完整的决策树, 然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点带来决策树泛化性能提升,则将该子树替换为叶结点。
后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。
4 连续与缺失值
4.1 连续值处理
现实任务中,有时候需要对连续属性进行分类,不能直接根据连续属性的可取值来对节点进行划分。最简单的方法是采用“二分法”对连续属性进行处理。也就是对于某一属性a,取一个值t,将数据集D划分为 D t − D^-_t Dt−和 D t + D_t^+ Dt+,其中 D t − D^-_t Dt−代表在属性a中不大于t的样本集合, D t + D_t^+ Dt+反之。
4.2 缺失值处理
现实任务中,有时候会遇到不完整的样本,即样本的某些属性值缺失。如果简单地放弃不完整样本,仅使用无缺失值的样本来进行学习,显然是对数据信息的极大浪费。
若样本 x 在划分属性 a 上的取值已知,则将x划入与其取值对应的子结点,且样本权值在子结点中保持为 w x w_x wx;若样本 x 在属性 a 上的取值未知,则将x同时划分入所有子节点,且样本权值在与属性值 a v a^v av对应的子结点中调整为 r v ⋅ w x r_v ·w_x rv⋅wx。其中, r v r_v rv 表示无缺失值样本中在属性 a 上取值 a v a^v av的样本所占的比例,。直观来看,就是让同一个样本以不同的概率划入到不同的子结点中去。
5 多变量决策树
若我们把每个属性视为坐标空间中的一个坐标轴,则d个属性描述的样本就对应了d维空间中的一个数据点,对样本分类则意味着在这个坐标空间中寻找不同类样本之间的分类边界。决策树所形成的分类边界有一个明显的特点:轴平行(axis-parallel),即它的分类边界由若干个与坐标轴平行的分段组成。
显然,分类边界的每一段都是与坐标轴平行的,这样当分类任务比较复杂的时候,预测时间开销就会很大。
多变量决策树通过使用斜的划分边界解决这个问题。在这种决策树中, 非叶结点不再是仅对于某个属性,而是对属性的线性组合进行测试。
于是,与传统的"单变量决策树" (univariate decision tree) 不同,在多变量决策树的学习过程中, 不是为每个非叶结点寻找一个最优划分属性,而是试图建立一个合适的线性分类器。