C4.5(weka又称为J48)算法原理详解

1. 信息增益率

ID3算法有以下几个缺点:

  • 1个属性取值越多,则此属性的信息增益率越大,越有可能被ID3选为当前分类属性。然而取值较多的属性并不一定最优。(例如一个属性的每个子节点都只有1个样本,此时信息增益率达到最大,但是用这样的属性却没有任何意义)

  • ID3只能处理离散型属性

  • 可以处理缺失数据

  • 可以对树进行剪枝

针对ID3算法的不足,Quinlan又提出了C4.5,C4.5算法采用信息增益率来取代信息增益作为当前最优决策属性的度量标准。

仍然选择weka中天气的数据集为例子:

outlooktemperaturehumiditywindyplay
sunnyhothighFALSEno
sunnyhothighTRUEno
overcasthothighFALSEyes
rainymildhighFALSEyes
rainycoolnormalFALSEyes
rainycoolnormalTRUEno
overcastcoolnormalTRUEyes
sunnymildhighFALSEno
sunnycoolnormalFALSEyes
rainymildnormalFALSEyes
sunnymildnormalTRUEyes
overcastmildhighTRUEyes
overcasthotnormalFALSEyes
rainymildhighTRUEno

1.1 计算属性outlook的信息增益:

IG(outlook)=Entropy(S)Entropy(S|outlook)=0.24675

1.2 计算分裂信息(SplitInfo)来将信息增益规范化

一个属性取值情况越多, SplitInfo 越大,实际我们需要属性的 SplitInfo 越小越好

SplitInfooutlook(S)=v=v0vn(|Sv|S×log2SvS)

通过Outlook将样本分为以下几个部分:
这里写图片描述
SplitInfooutlook 为:
SplitInfooutlook(S)=514×log2514414×log2414514×log2514=1.577

同理计算其他属性的 SplitInfo
SplitInfotemperature(S)=1.556

SplitInfohumidity(S)=1.0

SplitInfowindy(S)=0.985

1.3 计算属性的信息增益率

IGR(outlook)=IG(outlook)SplitInfo(outlook)=0.246751.577=0.155

IGR(temperature)=IG(temperature)SplitInfo(temperature)=0.0291.556=0.0186

IGR(humidity)=IG(humidity)SplitInfo(humidity)=0.1511.0=0.151

IGR(windy)=IG(windy)SplitInfo(windy)=0.0480.985=0.048

IGR: Information Gain Ratio,即信息增益率

由此可见,属性 outlook 信息增益率越大,故第一步选择该属性为分类属性。在分裂之后的子节点中,如果该子节点只有一种 label ,则停止继续分类。否则重复上述步骤,继续分裂下去。

1.4 C4.5算法总结

选择 IGR (信息增益率)作为 ID3 算法中 IG (信息增益)的代替来选择更好的分类属性:

IGR(attr)=IG(attr)SplitInfo(attr)

然后用此公式遍历每个属性,选择 IGR 最大的属性作为当前的分类属性来产生树。对于分类不纯的节点,继续重复上述方法选择其他属性继续分类。

2. C4.5处理连续型属性

对于连续型属性,C4.5先把它当转换成离散型属性再进行处理。本质上属性取值连续,但对于有限的采样数据它是离散的。例如某连续型属性有N个不同取值,则有N-1种离散化的方法: <= vj 的分到左子树, > vj 的分到右子树,然后计算N-1种情况下最大的信息增益率。

对于离散型属性只需计算1次信息增益率,但连续型属性却需要计算N-1次。为了减少计算量,可对连续属性先进行排序,在只有label发生变化的地方才需要切开。比如:
这里写图片描述

原本需要计算13种情况,现在仅需计算7种。
+ 利用信息增益率来选择连续值属性的分界点存在的问题
由于C4.5对于连续值属性,每次选取一个分裂点进行分裂,即二分裂。此时

IGR(attr)=IG(attr)SplitInfo(attr)

假设分裂结果为
这里写图片描述

SplitInfo(attr)=aN×log2aNbN×log2bN

a=b=2N 的时候 SplitInfo(attr) 达到最大值 1 (具体计算过程省略)。SplitInfo越大, IGR 就越小。故而等分分界点被抑制。此时子集样本个数能够影响分界点,显然不合理。因此在决定分界点时,还是采用了信息增益这个指标,而在选择具体属性的时候才选择信息增益率这个指标。(注意选择分裂点和选择具体属性的区别)

对于离散型属性,C4.5一次进行分裂后,后续不再使用该属性。但是对于连续型属性,由于进行的是二分裂,故下一次分裂可能还会继续用到该属性。例如:
这里写图片描述
连续属性attr1会被用到多次。

3. C4.5处理缺失数据

3.1 缺失属性的增益值和增益率求解

3.1.1 离散型属性

仍然以下表为例说明:

DayOutlookTemperatureHumidityWindplay
D1SunnyHotHighWeakNo
D2?HotHighStrongNo
D3??High?Yes
D4RainMildHighWeakYes
D5RainCool?WeakYes
D6RainCoolNormalStrongNo
D7OvercastCoolNormalStrongYes
D8?MildHigh?No
D9?CoolNormalWeakYes
D10??Normal?Yes
D11?MildNormal?Yes
D12OvercastMild?StrongYes
D13OvercastHot?WeakYes
D14RainMildHighStrongNo

以属性 outlook 为例,共有14个样本,其中6个样本 outlook 值缺失,8个样本()不缺失。首先计算信息增益

  • 原始信息熵为:(8个无缺失值样本, 5个yes, 3个no)
    Entropy(S)=(58×log258+38×log238)=0.954
  • 属性outlook的信息熵为(只计算属性不为空的样本):
    v=viPlog2P=[18×(1)]sunny+[38×(1)]overcast+[24×log22424×log224]rain=0.5
  • 属性outlook的信息增益为:

    IG(outlook)=814×(0.9540.5)=0.259

  • 计算属性outlook的 SplitInfo ,此时将缺失值当作一种单独的属性:

    SplitInfo(outlook)=114log2114314log2314414log2414614log2614=1.659

  • 属性outlook的信息增益率为

    IGR(outlook)=0.2591.659=0.156

3.1.1 连续型属性

以下表为例进行说明:
这里写图片描述
后面的计算步骤与上面完全相同,此处省略

3.2 将含有缺失值的样本分配给子节点

在C4.5算法中,带有缺失属性的样本会被分配到所有的子节点中,但是带有一个权值。即普通样本的权值为1,但缺失属性的样本权值为小数。如下图:
这里写图片描述
后面再继续分裂时,计算信息增益和增益率与上面的方法相同,只有样本个数中含有小数,计算过程此处省略。

3.3 预测含有缺失属性的样本的label

遇到一个未知label样本需要预测,但属性值中含有缺失数据时,按照3.2中的方法将该属性分别归类到所有子节点中,最后计算为各个标签的概率,取概率最大的标签作为最终的标签。如下图:
这里写图片描述

先假设碰到了一个需要预测的样本,但是attr1和attr2都不知,因此该样本为标签为yes的概率为:

P(yes)=0.24+0.03+0.12+0.15=0.54

该样本标签为no的概率为:
P(yes)=0.08+0.08+0.09+0.09+0.12=0.48

由于 P(yes)>P(no) ,故最终该样本(attr1和attr2均缺失)的标签为yes

参考文献: C4.5缺失值处理方法

4. C4.5的剪枝处理

为了防止C4.5分裂过度,造成过拟合现象,ross quinlan提出了两种剪枝方法:

  • pessimistic pruning

  • far more pessimistic estimate

4.1 早期的pessimistic pruning方法

把一颗子树(有多个叶子节点)用一个叶子节点代替,在训练集上的误判率肯定是上升的,但在新的数据集上不一定。于是需要将叶子节点的错误率加上一个惩罚因子,此处取为0.5[Quinlan, 1987e]。如果一个叶子节点有N个样本,其中E个被误判,则该叶子节点的误判率为 E+0.5N 。对于一颗子树,如果有L个叶子节点,则剪枝前该子树的误判率为:

e1=Li=0Ei+0.5×LLi=0Ni

由于加上了惩罚因子,因此一颗子树虽有多个叶子,但也未能占到便宜。剪枝后子树变成内部节点,因此也需要加上惩罚因子,因此剪枝后的误判率为:
E+0.5N

树的误判次数服从二项分布,因此剪枝前的均值为
E=i=0LNi×e1

剪枝前的方差为:
std=N×e1×(1e1)

因此剪枝前误判的上限数量为:
Eerror_before=E+std

剪枝后的误判数量为:
Eerror_after=E+0.5

因此由于采用悲观剪枝法,剪枝的条件是:
Eerror_after<Eerror_before

这也是为何称之为悲观剪枝的原因。
以下面的例子来计算一遍:
这里写图片描述

t1 t2 t3 t4 t5 5个节点可能会被剪枝。
此处仅计算 t4 节点的情况,其余省略。

e1=1+2+0.5×250=0.08

E=i=0LNi×e1=50×0.08=4

std=i=0LNi×e1×(1e1)=50×0.08×0.92=1.92

因此 Eerror_before=E+std=5.92 。剪枝后:
Eerror_after=E+0.5=4.5

由于 Eerror_after<Eerror_before ,因此应该对 t4 节点进行剪枝,所有样本全部标为A。

4.2 后来的far more pessimistic estimate

EBP(Error-Based Pruning)剪枝法

首先取置信度为0.25(根据统计经验)。对于N个样本,错分E个,则置信区间上限为:

upper_limit=Ucf(E,N)

错分样本率可以看出是 n(t) 次试验中某事件发生 e(t) 次,服从二项分布,因此置信区间上限
P(e(t)n(t)<=Ucf)=CF

故:
CF=x=0e(Cxnpx(1p)nx)=0.25

只需据此求出错误率 p 即可。令
f(p)=x=0e(Cxnpx(1p)nx)0.25

例如6个样本中0个被错分,要求错误率置信区间上限 U25%(0,6) ,则令 f(p)=0 。则 (1p)6=0.25=>p=0.206 。即 U25%(0,6)=0.206 。同理要求 U25%(1,16) ,令 f(p)=0 ,则:
16p(1p)15+(1p)16=0.25

可用二分法求得 p=0.157
求导,得: f(p) 。求得函数单调性之后,再用牛顿二分法求得p的近似值即可。下面以著名的国会投票数据(1984 United States Congressional Voting Records Database)为例进行说明。
这里写图片描述
考虑下面这个局部:
这里写图片描述
由于 U25%(0,6)=0.206 U25%(0,9)=0.143 U25%(0,1)=0.75 ,故剪枝前的错分的样本数目上限为:
6×0.206+9×0.143+1×0.75=3.273

而剪枝后应该16个样本全部变为democrat,但此时其实错分了1个republican。因此错分上限为:
16×U25%(1,16)=16×0.157=2.512

因为 2.512<3.273 ,此处应该剪枝。然后继续进行下一步剪枝判断,剪枝前:
Error=151×U25%(0,151)+1×U25%(0,1)+2.512=4.642

剪枝后
Error=168×U25%(1,168)=2.610

因为 Error<Error ,因此此处应该继续剪枝。后面的计算仿照前面的步骤,此处省略。至此,C4.5的关键步骤全部完成。

参看文献: Quinlan J R. C4. 5: Programs for Machine Learning[M]:35-43. 1993.

  • 8
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值