C4.5算法详解

----------引用自C4.5算法详解(非常仔细) - CSDN博客

首先,C4.5是决策树算法的一种。决策树算法作为一种分类算法,目标就是将具有p维特征的n个样本分到c个类别中去。相当于做一个投影,c=f(n),将样本经过一种变换赋予一种类别标签。决策树为了达到这一目的,可以把分类的过程表示成一棵树,每次通过选择一个特征pi来进行分叉。

那么怎样选择分叉的特征呢?每一次分叉选择哪个特征对样本进行划分可以最快最准确的对样本分类呢?不同的决策树算法有着不同的特征选择方案。ID3用信息增益,C4.5用信息增益率,CART用gini系数。

下面主要针对C4.5算法,我们用一个例子来计算一下。


上述数据集有四个属性,属性集合A={ 天气,温度,湿度,风速}, 类别标签有两个,类别集合L={进行,取消}。

1. 计算类别信息熵

类别信息熵表示的是所有样本中各种类别出现的不确定性之和。根据熵的概念,熵越大,不确定性就越大,把事情搞清楚所需要的信息量就越多。

Info(D) = 9/14 * log2(9/14) - 5/14 * log2(5/14) = 0.940

2. 计算每个属性的信息熵
每个属性的信息熵相当于一种条件熵。他表示的是在某种属性的条件下,各种类别出现的不确定性之和。属性的信息熵越大,表示这个属性中拥有的样本类别越不“纯”。

Info(天气) = 5/14 * [-2/5 * log2(2/5) - 3/5 * log2(3/5)] +4/14 *[-4/4 * log2(4/4)] + 5/14 * [-3/5 * log2(3/5) - 2/5 * log2(2/5)]=0.694

Info(温度)=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(湿度) = 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(风速) = 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. 计算信息增益

信息增益的 = 熵 - 条件熵,在这里就是 类别信息熵 - 属性信息熵,它表示的是信息不确定性减少的程度。如果一个属性的信息增益越大,就表示用这个属性进行样本划分可以更好的减少划分后样本的不确定性,当然,选择该属性就可以更快更好地完成我们的分类目标。

信息增益就是ID3算法的特征选择指标。
Gain(天气) = Info(D)-Info(天气)= 0.940 - 0.694 = 0.246 Gain(温度) = Info(D)-Info(温度)= 0.940 - 0.911 = 0.029 Gain(湿度) = Info(D)-Info(湿度)= 0.940 - 0.789 = 0.15
Gain(风速) = Info(D)-Info(风速)= 0.940 - 0.892 = 0.048

但是我们假设这样的情况,每个属性中每种类别都只有一个样本,那这样属性信息熵就等于零,根据信息增益就无法选择出有效分类特征。所以,C4.5选择使用信息增益率对ID3进行改进。

4.计算属性分裂信息度量

用分裂信息度量来考虑某种属性进行分裂时分支的数量信息和尺寸信息,我们把这些信息称为属性的内在信息(instrisic information)。信息增益率用信息增益 / 内在信息,会导致属性的重要性随着内在信息的增大而减小(也就是说,如果这个属性本身不确定性就很大,那我就越不倾向于选取它),这样算是对单纯用信息增益有所补偿。
H(天气)= -5/14 *log2(5/14)-5/14*log2(5/14)-4/14*log2(4/14)=1.577
H(温度)= -4/14 *log2(4/14)-6/14*log2(6/14)-4/14*log2(4/14)=1.556
H(湿度)= -7/14 *log2(7/14)-7/14*log2(7/14)=1
H(风速)= -6/14 *log2(6/14)-8/14*log2(8/14)=0.985

5. 计算信息增益率

IGR(天气) = Gain(天气) / H(天气)= 0.246/1.577 = 0.155
IGR(温度) = Gain(温度) / H(温度)= 0.029/1.576 = 0.0186
IGR(湿度) = Gain(湿度) / H(湿度)= 0.151/1.0 = 0.151
IGR(风速) = Gain(风速) / H(风速)= 0.048/1.985 = 0.048

天气的信息增益率最高,选择天气为分裂属性。发现分裂了之后,天气是“阴”的条件下,类别是”纯“的,所以把它定义为叶子节点,选择不“纯”的结点继续分裂。


在子结点当中重复过程1~5。

以天气=“雨”的子结点为例:

1. 计算类别信息熵
Info(D) = -3/5* log2(3/5) - 2/5 * log2(2/5) = 0.970

2. 计算每个属性的信息熵

Info(风速) = 3/5*[-3/3 * log2(3/3)] + 2/5 * [ -1/2 * log2(1/2) -1/2 * log2(1/2)] = 0.4
Info(湿度) = 3/5*[-2/3 * log2(2/3) - 1/3 * log2(1/3)] + 2/5 * [ -1/2 * log2(1/2) -1/2 * log2(1/2)] = 0.789
Info(温度) = 3/5*[-2/3 * log2(2/3) - 1/3 * log2(1/3)] + 2/5 * [ -1/2 * log2(1/2) -1/2 * log2(1/2)] = 0.789

3. 计算信息增益
Gain(温度) = Info(D)-Info(温度)= 0.970 - 0.789 = 0.181

Gain(湿度) = Info(D)- Info(湿度)= 0.970 - 0.789 = 0.181
Gain(风速) = Info(D)-Info(风速)= 0.970 - 0.892 = 0.57

4.计算属性分裂信息度量

H(度)=-4/14*log2(4/14)-6/14*log2(6/14)-4/14*log2(4/14) = 1.556
H(湿度) = -7/14*log2(7/14)-7/14*log2(7/14) = 1.0
H(风速) = -6/14*log2(6/14)-8/14*log2(8/14)-4/14 = 0.985

5. 计算信息增益率

IGR(风速) = Gain(风速) / H(风速) 最高

风速属性的信息增益率最高,所以选择风速作为分裂结点,分裂之后,发现子结点都是纯的,因此子节点均为叶子节点,分裂结束。至此,这个数据集上C4.5的计算过程就算完成了,一棵树也构建出来了。

现在我们来总结一下C4.5的算法流程:
while (当前节点不纯)
1 计算当前节点的类别熵 Info(D) (以类别取值计算)
2 计算当前节点的属性熵 Info(Ai) (按照属性取值下的类别取值计算)
3 计算各个属性的信息增益 Gain(Ai) = Info(D) -Info(Ai)
4 计算各个属性的分类信息度量 H(Ai) (按照属性取值计算)
5 计算各个属性的信息增益率 IGR=Gain(Ai)/H(Ai)
end while
当前节点设置为叶子节点

发布于 2018-03-20 09:49