决策树之 C4.5 算法

前言

由于 C4.5 算法是建立在 ID3 算法基础之上的,所以在讲解 C4.5 的时候,会有很多与 ID3 重合的内容,这里就不过多冗余地说明了。本文旨在阐明 ID3 存在的问题,以及 C4.5 的改进方案。如果你对于 ID3 中的相关数学公式及概念还有些迷惑,欢迎移步至《决策树之 ID3 算法》。


版权说明

著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
本文作者:Q-WHai
发表日期: 2016年7月6日
本文链接:https://qwhai.blog.csdn.net/article/details/51840361
来源:CSDN
更多内容:分类 >> 数据挖掘


C4.5

决策树构建分析

我们说 C4.5 算法是对 ID3 算法的改进,既然是改进,那么必然是解决了一些问题,而且这些问题还是比较突出的。

  1. 解决了信息增益(IG)的缺点
  2. 解决了连续变量问题

IG 的缺点及解决方案

上一篇说 ID3 算法时,了解到 IG 是描述某一个特征属性的存在与否,对总体信息熵的变化量影响。通过 IG 的公式(如果你不记得 IG 的公式,欢迎移步至《决策树之 ID3 算法》),可以推测出,当某一个时刻总的信息熵固定时,只要条件熵(就是某一特征属性的信息熵) Entropy(S|T) 越小,那么 IG 的值就越大。通过条件熵的计算公式,又可以推测出,如果某一个特性属性的取值越多,那么这个条件熵的值就会越小。从而,采用 IG 最大法选择构建决策,在某一程度上可以理解成选择多取值的特征属性。对于这个问题,C4.5 的做法是引入分裂信息,然后计算信息增益率(IGR)。
I G R = I G I V {IGR = \frac{IG}{IV}} IGR=IVIG (其中,IG 为信息增益,IV 为分裂信息)
I V = − ∑ i p ( v i ) l o g 2 p ( v i ) {IV = -\sum_i{p(v_i)}log_2{p(v_i)}} IV=ip(vi)log2p(vi) (其中, v i {v_i} vi 为某一特征属性下的第 i 个分支属性)

连续变量问题

在 ID3 中,我们不能解决连续变量问题,比如把之前的温度属性的值修改成一些整数类型的变量时,ID3 的做法就是对每一个不同值的变量进行分开计算,这样就出现了一个问题,ID3 构建的决策树中产生了过多的分支。这个时候,你可能会想说,如果把这些值修改成某一个域值,让小于等于这个域值的数据放在决策树的左边,大于这个域值的数据放在决策树的右边。C4.5 中就是这么干的,只是 C4.5 在寻找这个域值时,更加合理。

训练数据集

假设我们如下训练数据集

DayOutLookTemperatureHumidityWindPlayGolf
1Sunny8585FalseNo
2Sunny8090TrueNo
3Overcast8378FalseYes
4Rainy7096FalseYes
5Rainy6880FalseYes
6Rainy6570TrueNo
7Overcast6465TrueYes
8Sunny7295FalseNo
9Sunny6970FalseYes
10Rainy7580FalseYes
11Sunny7570TrueYes
12Overcast7290TrueYes
13Overcast8175FalseYes
14Rainy7180TrueNo

决策树构建过程

根据 C4.5 算法的原理及步骤绘制出如下过程图:
这里写图片描述

计算步骤

虽然上图中需要计算的量有很多,但是,有很量的计算在《决策树之 ID3 算法》一文中,讲解得也很详细了,所以这里我不再说明。需要说明的只有两个地方:IV 和 连续变量的域值计算。

IV(T) & IGR(T)

从上面的分裂信息的计算公式中,可以看到分裂信息的计算是针对某一个特征属性内部而言的。比如现在针对特征属性 OutLook 这一特征属性而言有如下分裂信息的分布情况:

SunnyOvercastRainy
结果总数545

那么 OutLook 的分裂信息 IV(OutLook) 就可以这样来计算:
$ {IV(OutLook) = -\frac{5}{14}log_2{\frac{5}{14}} - \frac{4}{14}log_2{\frac{4}{14}} - \frac{5}{14}log_2{\frac{5}{14}} = 1.577406}$
于是,再有
$ {IGR(OutLook) = \frac{IG}{IV} = \frac{0.24675}{1.577406} = 0.156428} $

连续变量的域值

上面说的都是针对离散变量问题的解决思路及过程,如果某一个特征属性的变量值不能或是不合适使用离散变量来处理,又该怎么做呢?比如在之前 ID3 算法的文章中使用的温度属性,这个属性的变量值使用连续变量应该更合适一些,最基本的逻辑就是温度达到多少算是 Hot,达到多少算是 Cool 呢?这个不好衡量,可是如果使用连续变量就要合理得多。
可是 ID3 算法在对连续变量的处理上,表现很糟糕。在 C4.5 中是通过如下方法解决的。
假设我们选择了温度属性,则被提取的关键数据为:[[85, No], [80, No], [83, Yes], [70, Yes], [68, Yes], [65, No], [64, Yes], [72, No], [69, Yes], [75, Yes], [75, Yes], [72, Yes], [81, Yes], [71, No]]
现在我们对这批数据进行从小到大进行排序,排序后数据集就变成:
[[64, Yes], [65, No], [68, Yes], [69, Yes], [70, Yes], [71, No], [72, No], [72, Yes], [75, Yes], [75, Yes], [80, No], [81, Yes], [83, Yes], [85, No]]
绘制成如下图例:
这里写图片描述
当我们拿到一个已经排好序的(温度,结果)的列表之后,分别计算被某个单元分隔的左边和右边的分裂信息,计算结果如下:
比如现在计算 index = 4 时的分裂信息。则:
$ {IV(v_4) = IV([4, 1], [5, 4]) = \frac{5}{14}{IV([4, 1])} + \frac{9}{14}{IV([5, 4])}} $
$ {IV(v_4) = \frac{5}{14}{(-\frac{4}{5}log_2\frac{4}{5} - \frac{1}{5}log_2\frac{1}{5})} + \frac{9}{14}{(-\frac{5}{9}log_2\frac{5}{9} - \frac{4}{9}log_2\frac{4}{9})} = 0.89} $

这里写图片描述
这时就可以选取最大分裂信息的位置当成此时的域值,也就是 68。
然后,此时温度的分裂就是按照小于等于 68 和大于 68 进行划分。

决策树构建结果

通过上面的训练数据集及 C4.5 构建算法,我们构建了一棵如下的 C4.5 决策树。
这里写图片描述


Ref

  • http://blog.csdn.net/acdreamers/article/details/44664571
  • 《数据挖掘十大算法》

GitHub download

此处为本文的算法实现,采用的编程语言为 Java。算法也是在不断重构及优化,如果你对此感兴趣,欢迎 star.

  • https://github.com/MachineLeanring/MachineLearningC4.5

征集

如果你也需要使用ProcessOn这款在线绘图工具,可以使用如下邀请链接进行注册:
https://www.processon.com/i/56205c2ee4b0f6ed10838a6d

  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值