一、基本流程
一颗决策树包含一个根结点、若干个内部结点和若干个叶结点。叶结点对应于决策结果,其他每个结点则对应于一个属性测试;每个结点包含的样本集合根据属性测试的结果划分到子结点中;根结点包含样本全集。
从根结点到每个叶结点的路径对应了一个判定测试序列。决策树学习的目的是为了产生一棵泛化能力强,即处理未见示例能力强的决策树。
决策树构建遵循的基本流程是“分而治之”策略和递归思想。
显然,决策树的生成是一个递归过程,在决策树的
基本算法中,有3中情况会导致递归返回:(1)当前结点包含的样本全属于同一类别,无需划分。(2)当前属性集为空,或是所有样本在所有属性上取值相同,无法划分。(3)当前结点包含的样本集合为空,不能划分。
2—4行是递归返回的第1种情况。5—7行是递归返回的第2种情况,把当前结点标记为叶结点,并将其类别设定为该结点所含样本最多的类别,利用的是当前节点的后验分布。11—14行是递归返回的第3种情况,把当前结点标记为叶结点,但是将其类别设定为其父结点所含样本最多的类别,第3种情况是将父结点的样本分布作为当前结点的先验分布。
二、划分选择
决策树学习的关键是第8行,即如何选择最优划分属性。一般而言,希望决策树的分支结点所包含的样本尽可能属于同一类别,即结点的“纯度”越来越高。
2.1 信息增益
“信息熵”是度量样本集合纯度最常用的一种指标,假设当前样本集合DDD中第kkk类样本所占的比例为pk(k=1,2,…,∣χ∣)p_k(k=1,2,…,|\chi|)pk(k=1,2,…,∣χ∣),则DDD的信息熵定义为
Ent(D)=−∑k=1∣χ∣pklog2pk
Ent(D)=-\sum_{k=1}^{|\chi|}p_k\log_2{p_k}
Ent(D)=−k=1∑∣χ∣pklog2pk
Ent(D)的最小值为0,最大值为log2∣χ∣\log_2{|\chi|}log2∣χ∣
Ent(D)的值越小,则D的纯度越高
假定离散属性aaa有VVV个可能得取值{a1,a2,⋯ ,aV}\{a^1,a^2,\cdots,a^V\}{a1,a2,⋯,aV},若使用aaa来对样本集DDD进行划分,则会产生VVV个分支结点,其中第vvv个分支结点包含了DDD中所有在属性aaa上取值为ava^vav的样本,记为DvD^vDv。可以计算出DvD^vDv的信息熵,再考虑到不同的分支结点所包含的样本数不同,给分支结点赋予权重∣Dv∣/∣D∣|D^v|/|D|∣Dv∣/∣D∣,即样本数越多的分支结点影响越大,于是可以计算出用属性aaa对样本集DDD进行划分所获得的“信息增益”。
Gain(D,a)=Ent(D)−∑v=1V∣Dv∣∣D∣Ent(Dv)
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)
信息增益=划分前的信息熵 — 权重*划分后的信息熵。一般而言,信息增益越大,则意味着使用属性aaa来进行划分所获得的“纯度提升”越大。可用信息增益来进行决策树的划分属性选择。
2.2 信息增益率
假定将每一行数据的标号作为划分属性,则每个分支结点仅包含一个样本,这些分支结点的纯度已经达到最大。然而,这样的决策树显然不具有泛化能力,无法对新样本进行有效预测。
实际上,信息增益准则对可取值数据较多的属性有所偏好,为减少这种偏好可能带来的不利影响,著名的C4.5决策树算法不直接使用信息增益,而是使用“增益率”来选择最优划分属性。增益率定义为:
Gain_ratio(D,a)=Gain(D,a)IV(a)
Gain\_ratio(D,a)=\frac {Gain(D,a)} {IV(a)}
Gain_ratio(D,a)=IV(a)Gain(D,a)
其中,IV(a)=−∑v=1V∣DV∣Dlog2∣DV∣D
其中,IV(a)=-\sum_{v=1}^V\frac {|D^V|} {D} \log_2 \frac {|D^V|} {D}
其中,IV(a)=−v=1∑VD∣DV∣log2D∣DV∣
IV(a)称为属性a的“固有值”,属性a的可能取值数目越多(即V越大),则IV(a)的值通常会变大。IV(a)称为属性a的“固有值”,属性a的可能取值数目越多(即V越大),则IV(a)的值通常会变大。IV(a)称为属性a的“固有值”,属性a的可能取值数目越多(即V越大),则IV(a)的值通常会变大。
需要注意的是,增益率准则对可取值数目较少的属性有所偏好,因此,C4.5算法并不是直接选择增益率最大的候选划分属性,而是使用了一个启发式:先从候选划分属性中找到信息增益高于平均水平的属性,再从中选择增益率最高的。没有办法对信息增益和分支数目两者间做绝对正确的匹配。
2.3 基尼指数
CART决策树使用“基尼指数”来选择划分属性,数据集DDD的纯度可以用基尼值来度量:
Gini(D)=∑k=1∣χ∣∑k′≠kpkpk′=1−∑k=1∣χ∣pk2
Gini(D)=\sum_{k=1}^{|\chi|}\sum_{k'\neq k} p_kp_k'=1-\sum_{k=1}^{|\chi|}{p_k}^2
Gini(D)=k=1∑∣χ∣k′=k∑pkpk′=1−k=1∑∣χ∣pk2
从直观意义上看,Gini(D)反映了从数据集D中随机抽取两个样本,其类别标记不一致的概率。因此,Gini(D)越小,则数据集D的纯度越高。
属性aaa的基尼指数定义为
Giniindex(D,a)=∑v=1V∣Dv∣DGini(Dv)
Gini_index(D,a)=\sum_{v=1}^V \frac {|D^v|} {D} Gini(D^v)
Giniindex(D,a)=v=1∑VD∣Dv∣Gini(Dv)
因此,在候选属性集合A中,选择那个使得划分后基尼指数最小的属性作为最优划分属性。
三、剪枝处理
剪枝是决策树学习算法中对付“过拟合”的主要手段。在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分支过多,这可能是因为因训练样本学得“太好了”,导致把训练集自身的一些特点当作所有数据都具有的一般性质而导致过拟合。因此,主动去掉一些分支来降低过拟合的风险。单使用决策树时,一般都需要使用剪枝。
决策树剪枝的基本策略有“预剪枝”和“后剪枝”。预剪枝是指在决策树生成过程中,对每个结点在划分前进行估计,若当前结点的划分不能带来决策树泛化性能提升,则停止划分并将当前结点标记为叶节点;后剪枝则是先从训练集生成一棵完整的决策树,然后自底向上地对非叶结点进行考察,若将该结点对应的子树替换为叶结点能带来决策树泛化性能提升,则将该子树替换为叶结点。
测试性能开销 | 训练时间开销 | |
---|---|---|
预剪枝 | 下降 | 下降 |
后剪枝 | 下降 | 上升 |
过拟合风险 | 欠拟合风险 | |
---|---|---|
预剪枝 | 下降 | 上升 |
后剪枝 | 下降 | 基本不变 |
后剪枝决策树通常比预剪枝决策树保留了更多的分支。一般情形下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但是后剪枝过程是在生成完全决策树之后进行的,并且要自底向上地对树中的所有非叶结点进行逐一考察,因此其训练时间开销比未剪枝决策树和预剪枝决策树都要大得多。