决策树完整总结(ID3,C4.5,CART)

1.介绍

1.1 定义

决策树学习的目标是根据给定的训练数据集合构建一个决策树模型,使它能够对实例进行正确的分类。决策树学习的本质是从训练数据中归纳出一组分类规则。

决策树学习算法流程:

  • 只适用于标称型数据,所以需要对数据进行离散化;
  • 通常递归的选择最优特征,并根据该特征对训练数据进行分割,使得对各个子数据集有一个在当前条件下最好的分类。若这些子集已经能够被基本正确分类,就将这些分到所对应的叶节点中去,若还不能够正确分类,就对这些子集继续选择最优特征,对其进行分割构建相应的结点。如此递归下去,直至所有训练数据子集都被正确分类或者直到没有合适的特征为止。最后每个子集都被分到叶节点上有了明确的类别,就生成了一颗决策树。
    在这里插入图片描述
    决策树学习的策略是以损失函数为目标函数的最小化,损失函数通常是正则化的极大似然函数。当损失函数确定以后,学习问题就变为在损失函数意义下选择最优决策树的问题。选择最优决策树是NP难问题,所以通常采用贪心的方法,自顶向下递归的分治方法构造,这样的得到的决策树是局部最优的。我们希望选择的模型不仅应该对训练数据能够很好的拟合,而且对未知数据也有很好的预测(好的泛化能力),所以应该尽量避免过拟合(为什么是尽量减少?因为过拟合是避免不了的,再好的模型也会有过拟合的情况的)。

1.2 决策树与条件概率分布

决策树可以被认为是if-else规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布
决策树表示给定特征条件下类的条件概率分布,这一条件概率分布定义在特征空间的一个划分上,将特征空间划分为互不相交的单元区域,并在每个单元定义一个类的概率分布就构成了一个条件概率分布。决策树的一条路径对应于划分的一个单元。决策树所表示的条件概率分布由各个单元给定条件下类的条件概率分布组成。假设XX为所表示特征的随机变量,YY为表示类的随机变量,那么这个条件概率分布可以表示为P(YX)P(Y|X)XX的取值范围为给定划分下单元的集合,YY取值于类的集合。

1.3 决策树的构建

1.3.1 划分准则

决策树主要分为三种:ID3,C4.5和CART,它们分别对应的特征选择准则是信息增益(ID3),信息增益比(C4.5)或基尼指数(CART),即又它们决定当前选择哪个特征进行数据划分,使得样本在当下能够被最大程度的划分。下面将分别详细的介绍三种算法的原理和构建过程。

1.3.2 划分方式

  • 对于离散变量而言,选定property分类即可;对于连续变量,需要选定split_point。
  • CART和C4.5支持数据特征为连续分布时的处理,能够完成对连续属性的离散化处理,主要通过二元切分的方式来处理连续型变量,这个分裂点的选择原则是使得划分后的子树中的“混乱程度”降低;

1.3.3 停止条件

  1. 当前结点所有样本都属于同一类别;
  2. 当前结点的所有属性值都相同,无法根据属性对数据进行划分;
  3. 达到最大树深;
  4. 达到叶子结点的最小样本数;

决策树很可能会产生过拟合,防止过拟合的方法有预剪枝和后剪枝。后剪枝是对已经生成的树自下而上进行剪枝,去掉过于细分的叶节点。预剪枝是在树的构建过程中就进行考虑,设定一个阈值,如果当前划分使损失函数的降低值小于该阈值,则停止划分,从而使它具有更好的泛化能力。如果特征数量很多,也可以在决策树学习开始的时候进行特征选择,只留下对训练数据有足够分类能力的特征。决策树的生成只考虑局部最优对应于模型的局部选择,相对地,剪枝对应于模型的全局选择,考虑全局最优。

2. 决策树的构建过程

2.1 ID3算法

ID3算法的核心思想应用信息增益准则作为标准,介绍信息增益之前首先介绍一下信息熵和条件熵:

在信息论与概率统计中,是表示随机变量不确定性的度量:

XX是一个取值为有限个的离散随机变量,
H(X)=i=1np(xi)logp(xi)H(X) = - \sum^{n}_{i=1} p(x_i)logp(x_i)

H(X)就被称作随机变量x的熵,它表示随机变量不确定的度量,是对所有可能发生的时间产生的信息量的期望。熵取值越大,随机变量不确定性越大。熵取值越小,数据越纯。当随机变量为均匀分布时,熵最大。当概率取值为1时,熵的值为零。
在这里插入图片描述
信息增益在统计学中称为互信息,互信息是条件概率与后验概率的比值,化简之后就可以得到信息增益。所以说互信息其实就是信息增益。计算方法【互信息=熵-条件熵】。

条件熵H(YX)H(Y|X)表示在已知随机变量XX的条件下随机变量YY的不确定性,定义为给定XX条件下YY的条件概率分布的熵对XX的数学期望:
H(YX)=xp(x)H(YX=x)=xp(x)yp(yx)logp(yx)H(Y|X)=\sum_xp(x)H(Y|X=x)\\ =-\sum_xp(x)\sum_yp(y|x)logp(y|x)

接下来以特征值都为离散值的情况下,熵与条件熵都是怎么计算得到的:对于样本集合DD,类别数为K,数据集DD的经验熵为:
H(D)=k=1KCkDlog2CkDH(D)=-\sum^{K}_{k=1}\frac{|C_k|}{|D|}log_2\frac{|C_k|}{|D|}
其中D|D|为样本容量。Ck|C_k|是样本集中属于第k类的样本子集。
特征A对于数据集DD的经验条件熵H(DA)H(D|A)
H(DA)=i=1nDiDH(Di)=i=1nDiD(k=1kDikDilog2DikDi)H(D|A)=\sum_{i=1}^{n} \frac{|D_i|}{|D|}H(D_i) = \sum_{i=1}^{n} \frac{|D_i|}{|D|}(-\sum_{k=1}^{k} \frac{|D_{ik}|}{|D_i|} log_2\frac{|D_{ik}|}{|D_i|})
其中DiD_i表示DD中特征AA取第i个值的样本子集,DikD_{ik}表示DiD_i中属于第kk类的样本子集。
而信息增益g(D,A)g(D,A)就是熵与条件熵之差:
g(D,A)=H(D)H(DA)g(D,A)=H(D)-H(D|A)

信息增益的含义
信息增益表示已知特征XX的信息而使得类YY的信息不确定减少的程度。经验熵H(D)H(D)表示对数据集D进行划分的不确定性,而经验条件熵H(DA)H(D|A)表示在给定特征A的条件下对数据集DD进行分类后的不确定性。所以它们的差,即信息增益就表示使用特征A对数据集D进行分类的不确定性减少的程度。信息增益越大的特征代表其具有更强的分类能力,所以我们就要选择能够使数据的不确定程度减少最多的特征,也就是信息增益最大的特征。

从根节点开始,计算所有可能特征的信息增益,选择信息增益最大的特征作为划分该节点的特征,根据该特征的不同区间建立子节点;在对子节点递归地调用以上方法,直到达到停止条件得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。

2.2 C4.5算法

C4.5算法与ID3算法相似,其对ID3算法进行了改进。

以信息增益作为划分准则存在的问题?

信息增益偏向于选择取值较多的特征进行划分。比如学号这个特征,每个学生都有一个不同的学号,如果根据学号对样本进行分类,则每个学生都属于不同的类别,这样是没有意义的。

而C4.5在生成过程中,用信息增益比来选择特征,可以校正这个问题。特征A对训练数据集D的信息增益比定义为其信息增益g(D,A)g(D,A)与训练数据集DD关于特征AA的取值熵之比,即:
gR(D,A)=g(D,A)HADg_R(D,A)=\frac{g(D,A)}{H_A{D}}
其中:
HA(D)=i=1nDiDlog2DiDH_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|} log_2 \frac{|D_i|}{|D|}

其中,n是特征A取值的个数,(当特征A的取值越多时,特征A的熵越大)。
特点:

  • 能够完成对连续属性的离散化处理;
  • 能够对不完整数据进行处理;
  • 需要对数据集进行多次的顺序扫描和排序

2.3 CART(分类和回归树)

ID3和C4.5虽然在对训练样本集的学习中可以尽可能多的挖掘信息,但其生成的决策树分支较大,规模较大。为了简化决策树的规模,提高生成决策树的效率,就出现了根据基尼指数来选择的CART;
CART为分类和回归数,既可以用于分类也可以用于回归。对回归树用平方误差最小准则,对分类树用基尼指数最小化准则。在这里我将主要介绍分类树。对于给定的样本集合DD,其基尼指数为:
Gini(D)=1k=1K(CkD)2Gini(D)=1-\sum_{k=1}^{K}(\frac{|C_k|}{|D|})^2

Gini(D)表示集合DD中随即变量的不确定性程度,其中CkC_kDD中属于第kk类的样本子集,K是类的个数。简单的说就是从数据集中随机选取两个样本,其类别标签不一致的概率。基尼指数越小表示数据的纯度越高,反之其值越大,样本集合的不确定性也就越大,与熵类似。当CkC_k等于DD时,Gini指数等于0。
需要说明的是CART是个二叉树,与ID3,C4.5不同。在每一次迭代中选择基尼指数最小的特征及其可能的二元划分,选择最优特征与最优切分点进行分类,每一步将数据按照特征A的取值切成两份,分别进入左右子树(其中n=2):
Gini(DA)=i=1nDiDGini(Di)Gini(D|A)=\sum_{i=1}^{n} \frac{D_i}{D}Gini(D_i)

把连续属性转换为离散属性再进行处理。虽然本质上属性的取值是连续的,但对于有限的采样数据它是离散的,如果有N条样本,那么我们有N-1种离散化的方法:<=vj的分到左子树,>vj的分到右子树。计算这N-1种情况下最大的信息增益率(连续属性与离散属性不同的是该属性还可以作为其后代结点的划分属性)。
另外,对于连续属性先进行排序(升序),只有在决策属性(即分类发生了变化)发生改变的地方才需要切开,这可以显著减少运算量。

3. 决策树的剪枝

决策树很容易出现过拟合现象。原因在于学习时完全考虑的是如何提高对训练数据的正确分类,从而构建出过于复杂的决策树。在决策树理论中,有这样一句话,“用较少的东西,照样可以做很好的事情。越是小的决策树,越优于大的决策树”。过拟合的决策树的错误率比一个经过简化的决策树的错误率要高。解决这个问题的方法称为剪枝,即对已生成的树进行简化。具体地,就是从已生成的树熵裁剪掉一些子树或叶节点,并将其根节点或父节点作为新的叶节点。

  • 预剪枝(Pre-Pruning):预剪枝是根据一些原则极早的停止树增长,如树的深度达到用户所要的深度、节点中样本个数少于用户指定个数、不纯度指标下降的幅度小于用户指定的幅度等。预剪枝的核心问题是如何事先指定树的最大深度,如果设置的最大深度不恰当,那么将会导致过于限制树的生长,使决策树的表达式规则趋于一般,不能更好地对新数据集进行分类和预测。除了事先限定决策树的最大深度之外,还有另外一个方法来实现预剪枝操作,那就是采用检验技术对当前结点对应的样本集合进行检验,如果该样本集合的样本数量已小于事先指定的最小允许值,那么停止该结点的继续生长,并将该结点变为叶子结点。
  • 后剪枝:则是通过在完全生长的树上剪去分枝实现的,通过删除节点的分支来剪去树节点,可以使用的后剪枝方法有多种,比如:代价复杂性剪枝、最小误差剪枝、悲观误差剪枝等等。后剪枝操作是一个边修剪边检验的过程,一般规则标准是:使用测试数据,检验决策树对测试数据的预测精度,并计算出相应的错误率,如果剪掉某个子树后的决策树对测试数据的预测精度或其他测度不降低,那么剪掉该子树。

后剪枝一般比预剪枝保留了更多的分支,一般的情况下,后剪枝决策树的欠拟合风险很小,泛化性能往往优于预剪枝决策树。但是后剪枝是在生成决策树之后自底向上的对树中所有的非叶结点进行逐一考察,因此其训练开销比预剪枝要大的多。
而预剪枝属于贪心的思想,有些分支的当前划分虽不能提升泛化性能,甚至可能导致泛化性能暂时下降,但是在其基础上进行的后续划分却有可能导致性能显著提高,给预剪枝带来了欠拟合的风险。

Reduced-Error Pruning(REP,错误率降低剪枝)
该剪枝方法考虑将树上的每个节点作为修剪的候选对象,决定是否修剪这个结点有如下步骤组成:
1:删除以此结点为根的子树;
2:使其成为叶子结点;
3:赋予该结点关联的训练数据的最常见分类;
4:当修剪后的树对于验证集合的性能不会比原来的树差时,才真正删除该结点;

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

REP是最简单的后剪枝方法之一,不过在数据量比较少的情况下,REP方法趋于过拟合而较少使用。这是因为训练数据集合中的特性在剪枝过程中被忽略,所以在验证数据集合比训练数据集合小的多时,要注意这个问题。尽管REP有这个缺点,不过REP仍然作为一种基准来评价其它剪枝算法的性能。它对于两阶段决策树学习方法的优点和缺点提供了一个很好的学习思路。由于验证集合没有参与决策树的创建,所以用REP剪枝后的决策树对于测试样例的偏差要好很多,能够解决一定程度的过拟合问题。

Pessimistic Error Pruning(PEP,悲观剪枝)
不需要使用测试数据,完全使用训练数据来生成决策树和剪枝,对于数据量比较少的情况比较有利。
具有TT个节点的树的误差率衡量为:
E(T)=tTe(t)+1/2N(t)E(T)=\sum_{t \in T} \frac{e(t)+1/2}{N(t)}
其中N(t)N(t)表示叶节点T中的样本总数;e(t)e(t)表示节点T中误判的样本个数;
去掉节点K之后TT^{&#x27;}个节点的树的误差衡量为(刺衡量方法侧重对每个节点的衡量)。
n(t)=e(t)+1/2N(t)n(t)=\frac{e(t)+1/2}{N(t)}
可以证明:
E(T)E(T)=n(tK)n(tK)=e(tK)e(tk)N(t)E(T^{&#x27;})-E(T)=n(t^{&#x27;}_K)-n(t_K)=\frac{e(t_K^{&#x27;})-e(t_k)}{N(t)}(带着某个点的该支的误判个数-去掉某个点之后该支的误判个数再除以该支的总个数)
剪枝的条件是:
SE(n(tK))=n(tK)(N(t)n(tK))N(t)E(T)E(T)=e(tK)e(tk)N(t)SE(n(t_{K^{&#x27;}}))=\sqrt{\frac{n(t_{K^{&#x27;}})*(N(t)-n(t_{K^{&#x27;}}))}{N(t)}} \leq E(T^{&#x27;})-E(T)=\frac{e(t_K^{&#x27;})-e(t_k)}{N(t)}
自顶向下逐层遍历, ifSE(n(tK))e(tK)e(tk)N(t)if SE(n(t_{K^{&#x27;}})) \leq \frac{e(t_K^{&#x27;})-e(t_k)}{N(t)}则删除该节点所在分支;

先计算规则在它应用的训练样例上的精度,然后假定此估计精度为二项式分布,并计算它的标准差。对于给定的置信区间,采用下界估计作为规则性能的度量。这样做的结果,是对于大的数据集合,该剪枝策略能够非常接近观察精度,随着数据集合的减小,离观察精度越来越远。该剪枝方法尽管不是统计有效的,但是在实践中有效。

PEP为了提高对测试集合的预测可靠性,PEP对误差估计增加了连续性校正(Continuity Correction)PEP算法是唯一使用Top-Down剪枝策略,这种策略会导致与先剪枝出现同样的问题,将该结点的某子节点不需要被剪枝时被剪掉;另外PEP方法会有剪枝失败的情况出现。
虽然PEP方法存在一些局限性,但是在实际应用中表现出了较高的精度。再者其剪枝策略比其它方法相比效率更高,速度更快。因为在剪枝过程中,树中的每颗子树最多需要访问一次,在最坏的情况下,它的计算时间复杂度也只和非剪枝树的非叶子节点数目成线性关系。

Cost-Complexity Pruning(CCP、代价复杂度)
一颗树的好坏用如下式子衡量:
Rα(T)=R(T)+αC(T)R_\alpha (T) = R(T)+\alpha C(T)
其中R(T)R(T)代表该树误差的衡量,C(T)C(T)表示对树的大小的衡量(可以用树的终端节点个数表示)。
怎么使用这个准则剪枝呢?

  1. 找到完整树的子树序列T0T1T2...Tn{T_0、T_1、T_2、...、T_n},其中Ti+1T_{i+1}是从TiT_i总产生,TnT_n为根节点;
  2. 分别计算他们的Rα(Ti)R_{\alpha}(T_i),选择最小的Rα(Ti)R_{\alpha}(T_i)所代表的树;

剪枝过程特别重要,所以在最优决策树生成过程中占有重要地位。 有研究表明,剪枝过程的重要性要比树生成过程更为重要,对于不同的划分标准生成的最大树(Maximum Tree),在剪枝之后都能够保留最重要的属性划分,差别不大。反而是剪枝方法对于最优树的生成更为关键,在数据带有噪声时通过剪枝甚至可以将决策树的泛化性能提升25%.

4. 缺失值的处理

对于某些采样数据,可能会缺少属性值。在这种情况下,处理缺少属性值的通常做法是赋予该属性的常见值,或者属性均值。

另外一种比较好的方法是为该属性的每个可能值赋予一个概率,即将该属性以概率形式赋值。例如给定Boolean属性B,已知采样数据有12个B=0和88个B=1实例,那么在赋值过程中,B属性的缺失值被赋为B(0)=0.12、B(1)=0.88;所以属性B的缺失值以12%概率被分到False的分支,以88%概率被分到True的分支。这种处理的目的是计算信息增益,使得这种属性值缺失的样本也能处理。

  1. 当决定选择哪个属性用来进行分支时,有些训练样本缺失了某些属性时该怎么办?
    1. 忽略这些缺失属性a的样本;
    2. 给缺失属性a的样本赋予属性a一个均值或者最常用的值;
    3. 计算增益或者增益率时根据缺失属性样本个数所占的比率对增益/增益率进行相应的“打折”;
  2. 当属性a已经被选择,该对样本进行分支的时候,如果有些样本缺失了属性a?
    1. 忽略这些样本;
    2. 把这些样本的属性a赋予一个均值或者最常出现的值,然后再对他们进行处理;
    3. 把这些属性缺失样本,按照具有属性a的样本被划分成的子集样本个数的相对比率,分配到各个子集中去。至于哪些缺失的样本被划分到子集1,哪些被划分到子集2,这个没有一定的准则,可以随机而动。或者把属性缺失样本分配给所有的子集,也就是说每个子集都有这些属性缺失样本;
    4. 单独为属性缺失的样本划分一个分支子集;
    5. 对于缺失属性a的样本,尝试着根据其他属性给他分配一个属性a的值,然后继续处理将其划分到相应的子集;
  3. 当决策树已经生成,但待分类的样本缺失了某些属性,这些属性该如何处理?
    1. 如果有单独的缺失分支,依据此分支;
    2. 把待分类的样本的属性a值分配一个最常出现的a的属性值,然后进行分支预测;
    3. 根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理;
    4. 在决策树中属性a节点的分支上,遍历属性a节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类;
    5. 待分类样本在到达属性a节点时就终止分类,然后根据此时a节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类。

5. 优点

  • 可解释性强;在这里插入图片描述
  • 算法简单;
  • 对噪声数据有很好的健壮性;
  • 随机性强,适用于集成算法的基分类器:
    如 bagging方法:随机森林
    boosting方法:Adaboost,gradient tree boosting, GBDT,Xgboost;

参考资料:分类算法-决策树

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章