C4.5决策树

来源:互联网 发布:mysql 可以用check约束 编辑:程序博客网 时间:2024/05/17 22:26

参考:

  1. http://blog.sina.com.cn/s/blog_68ffc7a40100urn3.html
  2. http://www.cnblogs.com/superhuake/archive/2012/07/25/2609124.html
  3. http://blog.sina.com.cn/s/blog_7ca874a40102wc1n.html

概述:

C4.5算法是Quinlan提出的一系列算法,包括C4.5 决策树、C4.5剪枝和 C4.5规则(C4.5 Tree-C4.5Pruning-C4.5Rules)。它继承了ID3算法的优点,并在以下几方面对ID3算法进行了改进:

1) 用信息增益率来选择属性,克服了用信息增益选择属性时偏向选择取值多的属性的不足.

2) 在树构造过程中进行剪枝.

3) 能够完成对连续属性的离散化处理.

4)能够对不完整数据进行处理.

优点:产生的分类规则易于理解且准确率较高。

缺点:在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。

详述:

1.采用信息增益作为评价指标

我们知道ID3算法通过计算信息增益,即Gain(A)来评定每个属性对于分类的贡献价值,或者说加快分类进程的能力。
通常这是很合理的,但是如果所选择的属性本身就具有很大的不确定性,即该属性有很多种取值,那么每一种取值所对应的分类信息熵自然而然会被降低。最极端的情况就是如果某一属性的每一种取值都只有一种类别的样本,那么它的信息熵为0,而这个属性必然会被选择,这显然是不够合理的。
这种属性自身引起的信息不确定性,我们称之为分离信息(Split Information)

SplitInformation(S,A)=i=1cSiSlog2SiS

其中S为样本总数,Si为A属性c种取值分别对应的样本个数。为了克服这种分类信息的影响,我们定义信息增益率为:
GainRatio(S,A)=Gain(S,A)SplitInformation(S,A)

所以说,信息增益率克服了用信息增益选择属性时偏向选择取值较多的属性的不足。

2.剪枝

为什么要剪枝?

在决策树的创建时,由于数据中的噪声和离群点,许多分枝反映的是训练数据中的异常。剪枝方法是用来处理这种过分拟合数据的问题。通常剪枝方法都是使用统计度量,剪去最不可靠的分枝。

剪枝分类

先剪枝:
先剪枝通过提前停止树的构造(比如决定在某个节点不再分裂或划分训练元组的子集)而对树剪枝。一旦停止,这个节点就变成树叶,该树叶可能取它持有的子集最频繁的类作为自己的类。先剪枝有很多方法,比如:
(1)当决策树达到一定的高度就停止决策树的生长;
(2)到达此节点的实例具有相同的特征向量,而不必一定属于同一类,也可以停止生长
(3)到达此节点的实例个数小于某个阈值的时候也可以停止树的生长,不足之处是不能处理那些数据量比较小的特殊情况
(4)计算每次扩展对系统性能的增益,如果小于某个阈值就可以让它停止生长。先剪枝有个缺点就是视野效果问题,也就是说在相同的标准下,也许当前扩展不能满足要求,但更进一步扩展又能满足要求。这样会过早停止决策树的生长。

后剪枝:
常用的方法是后剪枝,它由完全成长的树剪去子树而形成。通过删除节点的分枝并用树叶来替换它。树叶一般用子树中最频繁的类别来标记,并且采用自下而上的策略。比如:
(1) 基于成本复杂度的剪枝(cost-complexity pruning,CCP).
(2) 错误消减剪枝(Reduced error pruning,REP).
(3) 悲观剪枝(Pessimistic error pruning,PEP).
(4) 基于理想置信区间剪枝(confidence intervals,CI).

其中,CART采用CCP剪枝法,这里不做过多说明。

REP剪枝
这是一种最简单也最直接的剪枝,又被称为基于误判的剪枝。既然完全的决策树会对训练集产生过度拟合,那么就再找一个测试数据集来纠正它。
对于完全决策树中的每一个非叶子节点的子树,尝试着把它替换成一个叶子节点,该叶子节点的类别我们用子树所覆盖训练样本中存在最多的那个类来代替,这样就产生了一个简化决策树,然后比较这两个决策树在测试数据集中的表现,如果简化决策树在测试数据集中的错误比较少,并且该子树里面没有包含另外一个具有类似特性的子树(所谓类似的特性,指的就是把子树替换成叶子节点后,其测试数据集误判率降低的特性),那么该子树就可以替换成叶子节点。该算法以bottom-up的方式遍历所有的子树,直至没有任何子树可以替换使得测试数据集的表现得以改进时,算法就可以终止。
REP方法很直接,但是需要一个额外的测试数据集,能不能不要这个额外的数据集呢?为了解决这个问题,于是就提出了悲观剪枝。

悲观剪枝(PEP)
悲观剪枝法是C4.5采用的剪枝方法,就是递归得估算每个内部节点所覆盖样本节点的误判率。剪枝后该内部节点会变成一个叶子节点,该叶子节点的类别由原子树存在最多的类别所决定。然后比较剪枝前后该节点的错误率来决定是否进行剪枝。该方法和前面提到的第一种方法思路是一致的,不同之处在于如何估计剪枝前分类树内部节点的错误率。说白了悲观剪枝法在用训练集估计决策树的错误率。
把一颗子树(具有多个叶子节点)的分类用一个叶子节点来替代的话,在训练集上的误判率肯定是上升的(这是很显然的,因为该决策树在生成过程中一定有了信息增益才会接着分),但是在新数据上不一定(这也是过度拟合的结果)。为了消除过度拟合在计算错误率时的不利影响,我们需要把子树的误判计算加上一个经验性的惩罚因子。
对于一颗叶子节点,它覆盖了Ni个样本,其中有E个错误,那么该叶子节点的错误率为E+0.5/Ni。这个0.5(详细请参考连续性校正)就是惩罚因子,那么一颗子树,它有L个叶子节点,那么该子树的误判率估计为 :

(Ei+0.5L)/Ni

这样的话,我们可以看到一颗子树虽然具有多个子节点,但由于加上了惩罚因子,所以子树的误判率计算未必占到便宜。剪枝后内部节点变成了叶子节点,其误判个数J也需要加上一个惩罚因子,变成J+0.5
开头提到,只要剪枝后的误判率不高于剪枝前就应该剪枝。那么子树是否可以被剪枝就取决于剪枝后的错误J+0.5是否在(Ei+0.5L)的标准误差内。
对于样本的误差率e,我们可以根据经验把它估计成各种各样的分布模型,比如是二项式分布,或者正态分布。
那么一棵树对于一个数据来说,错误分类一个样本值为1,正确分类一个样本值为0,该树错误分类的概率(误判率)为e1(可以通过(Ei+0.5L)/Ni统计出来),那么树的误判次数就是二项分布,我们可以估计出该树的误判次数均值和标准差:

E(subtree_error_count)=Ne1

sd(subtree_error_count)=Ne1(1e1)

其中,N=Ni

把子树替换成叶子节点后,该叶子的误判次数是一个伯努利分布(重复一次的二项分布),其中N是到达该叶节点的数据个数,其概率误判率e2(J+0.5)/N,因此叶子节点的误判次数均值为:

E(leaf_error_count)=Ne2

使用训练数据,子树总是比替换为一个叶节点后产生的误差小,但是使用校正后有误差计算方法却并非如此。
若剪枝后的错误率不会变得很大(比剪枝前的错误率加上其标准差还大),就剪枝,否则就不剪枝,下式即为剪枝标准:

E(leaf_error_count)<E(subtree_error_count)+sd(subtree_error_count)

计算实例:
以下是一个子决策树:
这里写图片描述
这里写图片描述

其中t1,t2,t3,t4,t5为非叶子节点,t6,t7,t8,t9,t10,t11为叶子节点,这里我们可以看出来N=样本总和80,其中A类55个样本,B类25个样本。
此时,只有节点t4满足剪枝标准,我们就可以把节点t4剪掉,即直接把t4换成叶子节点A。

必须大一个标准差吗?
这是不一定的,基于理想置信区间剪枝(CI剪枝法),就给出了不一样的emax范围。
该方法扩展了悲观剪枝法,将叶节点的错误率e建模成服从二项分布的随机变量,对于一个置信区间阈值CI,存在一个上界e_max,使得e<emax以1-CI的概率成立(对于C4.5算法中默认的CI值为0.25)若p(e<emax)>1CI,则剪枝。
更近一步,我们可以用正态分布来逼近e(只要N足够大),基于这些约束条件,C4.5算法的期望误差的上界emax(一般用Wilson score interval)为:

emax=e+z22N+zeNe2N++z24N21+z2N

式中z的选择是基于理想置信区间,假设z是一个拥有零均值和单位方差的正态随机变量,也就是N(0,1).为什么选取Wilson score interval作为上界,主要因为该上界在少样本或者存在极端概率情况下的数据集都能有一些很好的性质。详见维基百科

3.对于连续数据的处理

C4.5连续型的属性变量进行离散化处理,具体分三步:

(1) 把需要处理的样本按照连续变量的大小从小到大进行排序.

(2) 假设该属性对应的不同的属性值一共有N个,那么总共有N-1个可能的候选分割阈值点,每个候选的分割阈值点的值为上述排序后的属性值中两两前后连续元素的中点.

(3) 用信息增益率选择最佳划分.

这是最初的设想,但是这样的方法存在几个问题:
① 在离散属性上只需要你计算1次信息增益率,而在连续属性上却需要计算N-1次,计算量是相当大的。有办法可以减少计算量:对于连续属性先进行排序,只有在决策属性发生改变的地方才需要切开。

这里写图片描述

上图中,显然Temperature为68,69进行划分显然不如65、68进行划分的分类更准确,信息增益自然也是后者更大。通过这种方法,本来13种离散化的情况却只需要计算7种。

②如果利用增益率来选择连续值属性的分界点,会导致一些副作用。分界点将样本分成两个部分,这两个部分的样本个数之比也会影响增益率。根据增益率公式,我们可以发现,当分界点能够把样本分成数量相等的两个子集时(我们称此时的分界点为等分分界点),增益率的抑制会被最大化,因此等分分界点被过分抑制了。

样本个数之比会影响分界点,这显然是不合理的。因此在决定分界点是还是采用增益这个指标,而选择属性的时候才使用增益率这个指标。这个改进能够很好得抑制连续值属性的倾向。

信息增益率的修正:
设N是连续特征的取值个数,D是训练数据数目,则分界点的选择存在N-1种可能,因为每种可能概率一样,都为1/(N-1),因此

=i=1N11N1log21N1=log2(N1)

=log2(N1)D,这部分额外消耗的信息熵来自该属性节点之前的数据源,而这部分消耗显然不是分支带来的“好处”,因此在计算信息熵增益时,需要减去这部分log2(N1)D以作修正。

4.对于缺失属性的处理

如果有些训练样本或者待分类样本缺失了一些属性值,那么该如何处理?
要解决这个问题,需要考虑3个阶段的问题:

  1. 当开始决定选择哪个属性用来进行分支时,如果有些训练样本缺失了某些属性值时该怎么办?

  2. 一个属性已被选择,那么在决定分支的时候如果有些样本缺失了该属性该如何处理?

  3. 当决策树已经生成,但待分类的样本缺失了某些属性,这些属性该如何处理?

针对这三个问题,昆兰提出了一系列解决的思路和方法.

针对问题1,计算属性A的增益或者增益率时,如果有些样本没有属性a,那么可以有这么几种处理方式:

  1. 忽略这些缺失属性A的样本.

  2. 给缺失属性a的样本赋予属性A一个均值或者最常用的的值.

  3. 根据其他未知的属性想办法把这些样本缺失的属性补全.

  4. 计算增益或者增益率时根据缺失属性样本个数所占的比率对增益/增益率进行相应的“打折”.

针对问题2,当属性A已经被选择,该对样本进行分支的时候,如果有些样本缺失了属性A,那么:

  1. 忽略这些样本.

  2. 把这些样本的属性A赋予一个均值或者最常出现的值,然后再对他们进行处理.

  3. 对于缺失属性A的样本,尝试着根据其他属性给他分配一个属性A的值,然后继续处理将其划分到相应的子集.

  4. 把这些属性缺失样本,按照具有属性A的样本被划分成的子集样本个数的相对比率,分配到各个子集中去。至于哪些缺失的样本被划分到子集1,哪些被划分到子集2,这个没有一定的准则,可以随机而动.

  5. 把属性缺失样本分配给所有的子集,也就是说每个子集都有这些属性缺失样本.

  6. 单独为属性缺失的样本划分一个分支子集.

针对问题3,对于一个缺失属性A的待分类样本,有这么几种选择:

  1. 如果有单独的确实分支,依据此分支.

  2. 把待分类的样本的属性a值分配一个最常出现的A的属性值,然后进行分支预测.

  3. 根据其他属性为该待分类样本填充一个属性a值,然后进行分支处理.

  4. 在决策树中属性A节点的分支上,遍历属性A节点的所有分支,探索可能所有的分类结果,然后把这些分类结果结合起来一起考虑,按照概率决定一个分类.

  5. 待分类样本在到达属性A节点时就终止分类,然后根据此时A节点所覆盖的叶子节点类别状况为其分配一个发生概率最高的类.

5.推理规则

C4.5决策树能够根据决策树生成一系列规则集,我们可以把一颗决策树看成一系列规则的组合。一个规则对应着从根节点到叶子节点的路径,该规则的条件是路径上的条件,结果是叶子节点的类别。C4.5首先根据决策树的每个叶子节点生成一个规则集,对于规则集中的每条规则,算法利用“爬山”搜索来尝试是否有条件可以移除,由于移除一个条件和剪枝一个内部节点本质上是一样的,因此前面提到的悲观剪枝算法也被用在这里进行规则简化。MDL准则在这里也可以用来衡量对规则进行编码的信息量和对潜在的规则进行排序。简化后的规则数目要远远小于决策树的叶子节点数。根据简化后的规则集是无法重构原来的决策树的。规则集相比决策树而言更具有可操作性,因此在很多情况下我们需要从决策树中推理出规则集。

原创粉丝点击