C4.5算法是用于产生决策树的算法。该算法是对Ross Quinlan之前开发的ID3算法的一个扩展。C4.5算法产生的决策树可以被用作分类目的,因此该算法也可以用于统计分类。它也是决策树分类算法中,最常用的、最经典的算法。C4.5继承了ID3算法的优点并对ID3算法进行了改进和补充。C4.5算法采用信息增益率作为选择分支属性的标准,克服了ID3算法中信息增益选择属性时偏向选择取值多的属性的不足,并能够完成对连续属性离散化的处理,还能够对不完整数据进行处理。根据分割方法的不同,目前决策的算法可以分为两类:基于信息论(Information Theory)的方法和最小GINI指标(Lowest GINI index)方法。对应前者的算法有ID3、C4.5,后者的有CART、SLIQ和SPRINT。
该算法是一个构造决策树的过程,每个树内节点(非叶节点)代表一个属性上的测试,树的每一个分支代表一个测试输出,每个叶子节点代表一个类标号。
举例:我们根据一组天气情况属性判断去不去打高尔夫球,属性元组<outlook, temperature, humidity, windy>,接下来的问题是如何选择其中的一个属性作为第一个判断属性(树的第一层)。
DAY OUTLOOK TEMPERATURE HUMIDITY WINDY PLAY GOLF? 1 sunny 85 85 false no 2 sunny 80 90 true no 3 overcast 83 78 false yes 4 rainy 70 96 false yes 5 rainy 68 80 false yes 6 rainy 65 70 true no 7 overcast 64 65 true yes 8 sunny 72 95 false no 9 sunny 69 70 false yes 10 rainy 75 80 false yes 11 sunny 75 70 true yes 12 overcast 72 90 true yes 13 overcast 81 75 false yes 14 rainy 71 80 true no
属性选择度量:又称分裂规则,决定如何给定节点上的分裂。
算法过程:
1、首先计算整个数据集的信息熵,对于给定的训练集该值是确定的
(1)
Info(D) = -9/14 * log2(9/14) - 5/14 *log2(5/14) = 0.940
2、按照类标签对训练数据集D的属性集的一个属性A进行划分,得到各个属性的信息熵
(2)
Info(OUTLOOK) = 5/14 * [- 2/5 * log2(2/5) – 3/5 * log2(3/5)] + 4/14 * [ - 4/4 * log2(4/4) - 0/4 * log2(0/4)] + 5/14 * [ - 3/5 * log2(3/5) – 2/5 * log2(2/5)] = 0.694 |
Info(TEMPERATURE) = 4/14 * [- 2/4 * log2(2/4) – 2/4 * log2(2/4)] + 6/14 * [ - 4/6 * log2(4/6) - 2/6 * log2(2/6)] + 4/14 * [ - 3/4 * log2(3/4) – 1/4 * log2(1/4)] = 0.911 |
Info(HUMIDITY) = 7/14 * [- 3/7 * log2(3/7) – 4/7 * log2(4/7)] + 7/14 * [ - 6/7 * log2(6/7) - 1/7 * log2(1/7)] = 0.789 |
Info(WINDY) = 6/14 * [- 3/6 * log2(3/6) – 3/6 * log2(3/6)] + 8/14 * [ - 6/8 * log2(6/8) - 2/8 * log2(2/8)] = 0.892 |
3、计算属性A的信息增益
(3)
Gain(OUTLOOK) = Info(D) - Info(OUTLOOK) = 0.940 - 0.694 = 0.246 |
Gain(TEMPERATURE) = Info(D) - Info(TEMPERATURE) = 0.940 - 0.911 = 0.029 |
Gain(HUMIDITY) = Info(D) - Info(HUMIDITY) = 0.940 - 0.789 = 0.151 |
Gain(WINDY) = Info(D) - Info(WINDY) = 0.940 - 0.892 = 0.048 |
4、比较各个属性的信息增益大小,选择最大者作为决策树的第一个分裂节点。
对于公式(2),如果该计算值越小,意味着我们接下来对A分出来的几个集合再进行分类所需要的信息就越少,也就是说越容易以此为基础分出合理的类别,当然,该算法的缺点也在这里,那就是它偏向于具有大量值的属性。什么意思呢?就是说在训练集中,某个属性所取的不同值的个数越多,那么越有可能拿它来作为分裂属性。例如一个训练集中有10个元组,对于某一个属相A,它分别取1到10这十个数,如果对A进行分裂将会分成10个类,那么对于每一个类Info(Dj)=0,从而式(2)为0,该属性划分所得到的信息增益(3)最大,但是很显然,这种划分没有意义。
以上是ID3的算法过程,C4.5在它的基础上做了改进,
(1)以信息增益率来作为属性度量。信息增益率:
(4)
SI(OUTLOOK) = - 5/14 * log2(5/14) - 5/14* log2(5/14) - 4/14 * log2(4/14) = 1.577406282852345
SI
(TEMPERATURE) = - 4/14 * log2(4/14) - 6/14 *log2(6/14) - 4/14 * log2(4/14) = 1.5566567074628228
SI(HUMIDITY) = - 7/14 * log2(7/14) -7/14 * log2(7/14) = 1.0
SI(WINDY) = - 6/14 * log2(6/14) - 8/14 *log2(8/14) = 0.9852281360342516
(5)
GR(OUTLOOK) = Info(OUTLOOK) / H(OUTLOOK) = 0.246/1.577406282852345 = 0.15595221261270145 |
GR(TEMPERATURE) = Info(TEMPERATURE) / H(TEMPERATURE) = 0.029 / 1.5566567074628228 = 0.018629669509642094 |
GR(HUMIDITY) = Info(HUMIDITY) / H(HUMIDITY) = 0.151/1.0 = 0.151 |
GR(WINDY) = Info(WINDY) / H(WINDY) = 0.048/0.9852281360342516 = 0.048719680492692784 |
(2)可以处理连续数值型属性
C4.5算法处理离散型描述属性的处理方法与ID3相同,按照该属性本身的取值个数进行计算;对于某个连续性描述属性A_con,假设在某个节点上的数据集的样本数量为N,C4.5算法将作以下处理:
- 将该节点上的所有数据样本按照连续型描述的属性的具体数值,由小到大进行排序,得到属性值的取值序列{A1_con,A2_con,……AN_con}。
- 在取值序列生成N-1个分割点。第i(0 < i <N)个分割点的取值设置为Vi=(Ai_con + A(i+1)_con)/2,它可以将该节点上的数据集划分为两个子集。
- 从N-1个分割点中选择最佳分割点。对于每一个分割点划分数据集的方式,C4.5算法计算它的信息增益比,并且从中选择信息增益比最大的分割点来划分数据集。
(3)采用了一种后剪枝方法
决策树为什么要剪枝?原因就是避免决策树“过拟合”样本。前面的算法生成的决策树非常的详细而庞大,每个属性都被详细地加以考虑,决策树的树叶节点所覆盖的训练样本都是“纯”的。因此用这个决策树来对训练样本进行分类的话,你会发现对于训练样本而言,这个树表现堪称完美,它可以100%完美正确得对训练样本集中的样本进行分类(因为决策树本身就是100%完美拟合训练样本的产物)。但是,这会带来一个问题,如果训练样本中包含了一些错误,按照前面的算法,这些错误也会100%一点不留得被决策树学习了,这就是“过拟合”。该方法是用训练样本本身来估计剪枝前后的误差,从而决定是否真正剪枝。方法中使用的公式如下:
(6)
其中N是实例的数量,f=E/N为观察到的误差率(其中E为N个实例中分类错误的个数),q为真实的误差率,c为置信度(C4.5算法的一个熟人参数,默认值为0.25),z为对应于置信度c的标准差,其值可根据c的设定值通过查正态分布表得到。通过该公式即可计算出真实误差率q的一个置信区间上限,用此上限为该节点误差率e做一个悲观的估计:
(7)
通过判断剪枝前后e的大小,从而决定是否需要剪枝。
(4)对于缺失值的处理
在某些情况下,可供使用的数据可能缺少某些属性的值。假如<x,c(x)>是样本集S中的一个训练实例,但是其属性A的值A(x)未知。处理缺少属性值的一种策略是赋给它节点n所对应的训练实例中该属性的最常见值;另外一种更复杂的策略是为A的每个可能值赋予一个概率。例如,给定一个布尔属性A,如果结点n包含6个已知A=1和4个A=0的实例,那么A(x)=1的概率是0.6,而A(x)=0的概率是0.4。于是,实例x的60%被分配到A=1的分支,40%被分配到另一个分支。这些片断样例(fractional examples)的目的是计算信息增益,另外,如果有第二个缺失值的属性必须被测试,这些样例可以在后继的树分支中被进一步细分。C4.5就是使用这种方法处理缺少的属性值。
参考:
http://baike.baidu.com/view/8775136.htm
http://en.wikipedia.org/wiki/Information_gain_ratio
http://www.cnblogs.com/zhangchaoyang/articles/2842490.html
http://shiyanjun.cn/archives/428.html
百度文库:C4.5算法生成决策树的研究