C4.5是机器学习算法中的分类决策树算法,对于一个具有多个属性的元组,用一个属性就将它们完全分开几乎不可能,否则的话,决策树的深度就只能是2了。从这里可以看出,一旦我们选择一个属性A,假设将元组分成了两个部分A1A2,由于A1A2还可以用其它属性接着再分,所以又引出一个新的问题:接下来我们要选择哪个属性来分类?对D中元组分类所需的期望信息是Info(D) ,那么同理,当我们通过AD划分成v个子集Dj(j=1,2,,v)之后,我们要对Dj的元组进行分类,需要的期望信息就是Info(Dj),而一共有v个类,所以对v个集合再分类。

C4.5如下几个特点:

  • 信息增益率来选择属性。ID3选择属性用的是子树的信息增益,这里可以用很多方法来定义信息,ID3使用的是熵(entropy 熵是一种不纯度度量准则),也就是熵的变化值,而C4.5用的是信息增益率。

  • 在决策树构造过程中进行剪枝,因为某些具有很少元素的结点可能会使构造的决策树过适应(Overfitting),如果不考虑这些结点可能会更好。

  • 非离散数据也能处理。

  • 能够对不完整数据进行处理。

 

C4.5算法的优点是:

产生的分类规则易于理解,准确率较高。
C4.5算法的缺点是:

在构造树的过程中,需要对数据集进行多次的顺序扫描和排序,因而导致算法的低效。此外,C4.5只适合于能够驻留于内存的数据集,当训练集大得无法在内存容纳时程序无法运行。

 

如何计算信息增益,计算公式如下所示(例子可看数据挖掘概念与技术P218)

按照类标签对训练数据集D属性集A进行划分,得到信息熵:

C4.5分类决策树算法_分类决策树算法

按照属性集A中每个属性进行划分,得到一组信息熵:

C4.5分类决策树算法_分类决策树算法_02

计算信息增益,即前者对后者做差,得到属性集合A一组信息增益:

C4.5分类决策树算法_分类决策树算法_03

使用信息增益的话其实是有一个缺点,那就是它偏向于具有大量值的属性。什么意思呢?就是说在训练集中,某个属性所取的不同值的个数越多,那么越有可能拿它来作为分裂属性。例如一个训练集中有10个元组,对于某一个属相A,它分别取1-10这十个数,如果对A进行分裂将会分成10个类,那么对于每一个类Info(Dj)=0,从而式(2)为0,该属性划分所得到的信息增益(3)最大,但是很显然,这种划分没有意义。正是基于此,ID3后面的C4.5采用了信息增益率这样一个概念。信息增益率使用“分裂信息”值将信息增益规范化。

 

计算信息增益率(选择信息增益最大的属性作为分裂点。

下面看,计算信息增益率的公式:

C4.5分类决策树算法_C4.5_04

其中,IG表示信息增益,按照前面我们描述的过程来计算。而IV是我们现在需要计算的,IV是一个用来考虑分裂信息的度量,分裂信息用来衡量属性分裂数据的广度和均匀程序,计算公式如下所示:

C4.5分类决策树算法_C4.5_05

其中,V表示属性集合A中的一个属性的全部取值。

 

树剪枝

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

剪枝一般分两种方法:先剪枝和后剪枝。

     先剪枝方法中通过提前停止树的构造(比如决定在某个节点不再分裂或划分训练元组的子集)而对树剪枝。一旦停止,这个节点就变成树叶,该树叶可能取它持有的子集最频繁的类作为自己的类。

先剪枝有很多方法:

  • 当决策树达到一定的高度就停止决策树的生长;

  • 到达此节点的实例具有相同的特征向量,而不必一定属于同一类,也可以停止生长

  • 到达此节点的实例个数小于某个阈值的时候也可以停止树的生长,不足之处是不能处理那些数据量比较小的特殊情况

  • 计算每次扩展对系统性能的增益,如果小于某个阈值就可以让它停止生长。

先剪枝有个缺点就是视野效果问题,也就是说在相同的标准下,也许当前扩展不能满足要求,但更进一步扩展又能满足要求。这样会过早停止决策树的生长。精确地估计何时停止树增长非常困难。

   

后剪枝,它由完全成长的树剪去子树而形成。通过删除节点的分枝并用树叶来替换它。树叶一般用子树中最频繁的类别来标记。

C4.5采用悲观剪枝法,它使用训练集生成决策树又用它来进行剪枝,不需要独立的剪枝集。

     悲观剪枝法的基本思路是:设训练集生成的决策树是T,用T来分类训练集中的N的元组,设K为到达某个叶子节点的元组个数,其中分类错误地个数为J。由于树T是由训练集生成的,是适合训练集的,因此J/K不能可信地估计错误率。所以用(J+0.5)/K来表示。设ST的子树,其叶节点个数为L(s) ΣK为到达此子树的叶节点的元组个数总和,Σ为此子树中被错误分类的元组个数之和。在分类新的元组时,则其错误分类个数为 ΣJ+L(s)/2,其标准错误表示为:se(E)=。当用此树分类训练集时,设E为分类错误个数,当下面的式子成立时,则删掉子树S,用叶节点代替,且S的子树不必再计算。

E+<(ΣJ+ L(s)/2)+ se(ΣJ+ L(s)/2)