决策树算法

Deadly 提交于 2020-02-13 00:50:10

本文的结构如下:

1. 衡量标准(信息论基础)

单一变量的熵——
在这里插入图片描述
多个变量的联合熵——
在这里插入图片描述
条件熵——
在这里插入图片描述
互信息——
I(X,Y) = H(X)-H(X|Y)
如果说H(X)度量了X的不确定性,条件熵H(X|Y)度量了我们在知道Y以后X剩下的不确定性,那么互信息就是度量了X在知道Y以后不确定性减少程度,记为I(X,Y)。

最后用一张图描述四者的关系:
在这里插入图片描述

2. ID3算法

在决策树的ID3算法中,互信息I(X,Y)被称为信息增益。ID3算法就是用信息增益来判断当前节点应该用什么特征来构建决策树。信息增益大,则越适合用来分类。
分别对各个属性递归地计算信息增益,取最大的子节点的分裂属性,最终就可以得到整个决策树。

但是ID3算法中还存在着一些不足之处:

  • ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。

  • ID3采用信息增益大的特征优先建立决策树的节点,很明显会使得在相同条件下,取值比较多的特征比取值少的特征信息增益大。因为信息增益反映的给定一个条件以后不确定性减少的程度,必然是分得越细的数据集确定性更高,也就是条件熵越小,信息增益越大)

为了解决这些问题我们有了C4.5算法。

3. C4.5算法

1). ID3不能处理连续特征。
C4.5将连续的特征离散化。比如m个样本的连续特征A有m个,C4.5取相邻两样本值的平均数,一共取得m-1个划分点。对于这m-1个点,分别计算以该点作为二元分类点时的信息增益。选择信息增益最大的点作为该连续特征的二元离散分类点。这样我们就做到了连续特征的离散化。

2). 对于第二个问题,C4.5中提出了信息增益比
在这里插入图片描述
即特征A对数据集D划分后的信息增益与特征A信息熵的比,信息增益比越大的特征和划分点,分类效果越好。某特征中值的种类越多,特征对应的特征熵越大,它作为分母,可以校正信息增益导致的问题。然后同样选择信息增益比最大的特征开始递归的分裂节点,最终就可以得到整个决策树。

4. 分类回归树(Classification and Regression Tree, CART)

无论是ID3还是C4.5,都是基于信息论的熵模型的,这里面会涉及大量的对数运算。能不能简化模型同时也不至于完全丢失熵模型的优点呢?有!CART分类树算法使用基尼系数来代替信息增益比,基尼系数代表了模型的不纯度,基尼系数越小,则不纯度越低,特征越好。这和信息增益(比)是相反的。

在分类问题中,假设有个类别,第个类别的概率为,则基尼系数为:
在这里插入图片描述
对于给定的样本,假设有个类别,第个类别的数量为,则样本的基尼系数为:
在这里插入图片描述
特别的,对于样本D,如果根据特征A的某个值a,把D分成D1和D2两部分,则在特征A的条件下,D的基尼系数为:
在这里插入图片描述
再递归使用这个方法计算子节点的分裂属性,最终就可以得到整个决策树。

5. 剪枝

如果不考虑泛化能力,在训练集上生成的所有不同规则集合对应的决策树中,挑选出最优的决策树,可以根据所有叶结点中的预测误差来衡量,即模型与训练数据的拟合程度。设树T的叶结点个数为 ∣T∣,t是树T的一个叶结点,该叶结点有 Nt个样本点,其中k类的样本点有 NtkN_{tk}个,k=1,2,…,K,K为样本空间中的所属分类数量。叶结点t上的经验熵Ht(T)H_t(T)

Ht(T)=kNtkNtlogNtkNtH_t(T)=-\sum_k\frac{N_{tk}}{Nt}\log\frac{N_{tk}}{N_t}

代表了该叶结点的分类还有多少信息量不知道(混乱程度),可以这么考虑一个理想的极端情况,当该叶结点中只有一个分类 knk_n时,那么Ntkn=NtN_{tk_n}=N_t ,其它的Nk1N_{k_1},…,Nkn1N_{k_{n-1}},Nkn+1N_{k_{n+1}},…,NkKN_{k_K}全部为0,最终Ht(T)=0H_t(T)=0,这个结论与分类已经完全的结果是相吻合的。那么我们可以说,经验熵 Ht(T)H_t(T)就代表了连接该叶结点的整个路径对数据分类的彻底性。

考虑到所有的叶结点每个叶结点中的样例个数不同,我们采用

C(T)=t=1TNtHt(T)=t=1Tk=1KNtklogNtkNtC(T)=\sum_{t=1}^{|T|}N_tH_t(T)=-\sum_{t=1}^{|T|}\sum_{k=1}^K N_{tk}\log\frac{N_{tk}}{N_t}

来衡量模型对训练数据的整体测量误差。

但是如果仅仅用 C(T) 来作为优化目标函数,就会导致模型走向过拟合的结果。因为我们可以尽可能的对每一个分支划分到最细结来使得每一个叶结点的Ht(T)=0H_t(T)=0,最终使得C(T)=0C(T)=0最小。

为了避免过拟合,我们需要给优化目标函数增加一个正则项,正则项应该包含模型的复杂度信息。对于决策树来说,其叶结点的数量∣T∣越多就越复杂,我们用添加正则项的

Cα(T)=C(T)+αT=t=1TNtHt(T)+αTC_\alpha(T)=C(T)+\alpha|T|=\sum_{t=1}^{|T|}N_tH_t(T)+\alpha|T|

来作为优化的目标函数,也就是树的损失函数。参数 α\alpha控制了两者之间的影响程度。较大的α\alpha促使选择较简单的模型(树),较小的α\alpha促使选择较复杂的模型(树)。

剪枝分为预剪枝和后剪枝两种方法。

预剪枝

在构建完全正确分类训练集 的决策树之前,停止树的构建。
常见有3种方法来决定何时停止树的构建:

  • 预设树的高度。当决策树的高度达到预设值之后,停止继续构建。
  • 设定阈值。当叶子结点里的实例数量小于阈值时,停止。
  • 设定阈值。计算每一次增加深度后模型的增益,增益小于阈值,则停止。

优点:速度快,计算量少。
缺点:视线短浅。 比如一颗完整的决策树有5层,A-> B->C->D->E。
从B->C的过程中模型几乎没有什么提升,但是从C->D的过程中模型的准确度提升显著。这种情况使用预剪枝,会使模型提前终止。

后剪枝

后剪枝的整体思路是先构建完整的决策树,然后再对决策树进行剪枝操作。

  • 错误率降低剪枝(REP,Reduce-Error Pruning)
    1)使用一个测试集
    2)对于非叶子节点的子树,尝试把它替换成叶子节点中训练数据所占类别最多的类别。 用子树中样本数量最多的类来表示这个节点的结果。 比较替换前后,两个决策树在测试集上的表现。
    3)从下至上,遍历所有的可能的子树,直到在测试集上没有提升时,停止。

因为训练集合的过拟合,使得验证集合数据能够对其进行修正,反复进行上面的操作,从底向上的处理结点,删除那些能够最大限度的提高验证集合的精度的结点,直到进一步修剪有害为止(有害是指修剪会减低验证集合的精度)

其缺点在于当数据量较少时,会过度剪枝,产生过拟合现象(只着眼于当前少量数据的特征,对于未知数据表现差)。一些少量的,只出现在训练集中的有效的特征,会被剪掉(因为该特征不出现在测试集中)。所以当验证集比训练集小很多时要注意。

尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。

  • 悲观剪枝(PEP,Pessimistic Error Pruning)

一、统计学相关知识复习

1、置信区间:

设θ’在大样本下服从E(θ’) = θ, 标准误差为σ’的正态分布,那么θ的(1 - α)100%置信区间是:θ’ +/- (Zα/2) σ’

2、二项式概率分布:

均值和方差分别是u = np, σ2=npq ,其中p=每次实验成功的概率, q=1-p。

3、二项分布的正态逼近

如果np>=4 且nq>=4 ,二项概率分布p(y)逼近于正态分布。如下图
在这里插入图片描述
可以看到P(Y<=2)是在正态曲线下Y=2.5的左端面积。注意到Y=2的左端面积是不合适的,因为它省略了相应于Y=2的一半概率的长方形。为了修正,用连续概率分布去近似离散概率分布,在计算概率之前我们需要将2增加0.5。值0.5称为二项概率分布近似的连续性修正因子,因此

P(Y<=a) 约等于 P(Z< (a+0.5 - np/ ( npq)1/2) );

P(Y>=a) 约等于 P(Z> (a-0.5 - np/ ( npq)1/2) )

二、剪枝过程

对于后剪枝技术,在决策树形成后,最先要做的就是剪枝。后剪枝的剪枝过程是删除一些子树,然后用其叶子节点代替,这个叶子节点所标识的类别通过大多数原则(majority class criterion)确定。所谓大多数原则,是指剪枝过程中, 将一些子树删除而用叶节点代替,这个叶节点所标识的类别用这棵子树中大多数训练样本所属的类别来标识,所标识的类称为majority class ,(majority class 在很多英文文献中也多次出现)。

三、悲观剪枝–Pessimistic Error Pruning (PEP)

PEP后剪枝技术是由大师Quinlan提出的。它不需要像REP(错误率降低修剪)样,需要用部分样本作为测试数据,而是完全使用训练数据来生成决策树,又用这些训练数据来完成剪枝。决策树生成和剪枝都使用训练集, 所以会产生错分。现在我们先来介绍几个定义。
  n(t)为t的所有样本数, ni(t)为t中类别i的所有样本数,e(t)为t中不属于节点t所标识类别的样本数

在剪枝时,我们使用

r(t)=e(t)/n(t)

就是当节点被剪枝后在训练集上的错误率,而
  在这里插入图片描述

, 其中s为t节点的叶子节点。

在此,我们把错误分布看成是二项式分布,由上面“二项分布的正态逼近”相关介绍知道,上面的式子是有偏差的,因此需要连续性修正因子来矫正数据,有
  r‘(t)=[e(t) + 1/2]/n(t)和在这里插入图片描述

, 其中s为t节点的叶子节点,你不认识的那个符号为 t的所有叶子节点的数目。

为了简单,我们就只使用错误数目而不是错误率了,如下

e’(t) = [e(t) + 1/2]

接着求e’(Tt)的标准差,由于误差近似看成是二项式分布,根据u = np, σ2=npq可以得到
在这里插入图片描述
当节点t满足
在这里插入图片描述
则Tt就会被裁减掉。

PEP采用自顶向下的方式,如果某个非叶子结点符合上面的不等式,就裁剪掉该叶子结点。该算法被认为是当前决策树后剪枝算法中经度比较高的算法之一,但是饿存在有缺陷。首先,PEP算法是唯一使用Top-Down剪枝策略,这种策略会导致与先剪枝出现同样的问题,将该结点的某子节点不需要被剪枝时被剪掉;另外PEP方法会有剪枝失败的情况出现。

虽然PEP方法存在一些局限性,但是在实际应用中表现出了较高的精度,。两外PEP方法不需要分离训练集合和验证机和,对于数据量比较少的情况比较有利。再者其剪枝策略比其它方法相比效率更高,速度更快。因为在剪枝过程中,树中的每颗子树最多需要访问一次,在最坏的情况下,它的计算时间复杂度也只和非剪枝树的非叶子节点数目成线性关系。

  • 代价复杂度剪枝(CCP, Cost-Complexity Pruning)

CCP方法包含两个步骤:

1:从原始决策树T0开始生成一个子树序列{T0、T1、T2、…、Tn},其中Ti+1是从Ti总产生,Tn为根节点

2:从子树序列中,根据树的真实误差估计选择最佳决策树。
决策树的损失函数:
在这里插入图片描述
α\alpha视为变量,当α\alpha极小时,最初的决策树就是最优解,当其极大时,只能使用最简单的决策树,也就是根节点作为最优解。所以,当固定时,可以找到一个最优的决策树结构。
对于一颗子树而言:
剪枝前:
在这里插入图片描述
剪枝后:
在这里插入图片描述
这里剪枝后,子树就只有一个节点了。
令剪枝前后的损失相等,可以求得
在这里插入图片描述
如果α>α\alpha > \alpha^{'}说明Cα(Tt)>Cα(T)C_\alpha(T_t) > C_\alpha(T)。执行剪枝操作。
下一步就是对这个子树中每个节点都计算一次
在这里插入图片描述
这里g(t)表示剪枝后,整体损失函数的减少程度。

找到最小的g(t),剪去。
选最小值剪去的原因是,当前节点直至叶子节点的误差差距很小,那说明这几层的构建是没有意义的或者说意义非常少。例如从B子树到叶子节点,整个子树有8层深。这棵8层深树与直接把B节点当整棵子树相比,误差只小了0.0001,那么就没有什么必要构建这8层子树,直接剪掉就好。

如何从第一步骤产生的子树序列{T0、T1、T2、…、Tn}中选择出最佳决策树是CCP方法的第二步骤的关键。通常可以采用V-交叉验证(V-fold Cross-Validation)和基于独立剪枝数据集两种方法,这两种方法可以参考(Classification And Regression Trees,Breiman et.al)。当使用基于独立数据集剪枝时,和REP方法相比,CCP选择出来的最有决策树,不是从原始决策树T的所有可能子树中得到,所以有可能会找到到最有决策树。

整个算法的复杂度为O(N2)O(N^2)

其它如Minimum Error Pruning(MEP),Critical Value Pruning(CVP),Optimal Pruning(OPP),Cost-Sensitive Decision Tree Pruning(CSDTP)等方法,这些剪枝方法各有利弊,关注不同的优化点,感兴趣的同学可以学习下。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!