python决策树之C4.5算法详解


Posted in Python onDecember 20, 2017

本文为大家分享了决策树之C4.5算法,供大家参考,具体内容如下

1. C4.5算法简介

  C4.5算法是用于生成决策树的一种经典算法,是ID3算法的一种延伸和优化。C4.5算法对ID3算法主要做了一下几点改进:

  (1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;
  (2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;
  (3)构造决策树之后进行剪枝操作;
  (4)能够处理具有缺失属性值的训练数据。

2. 分裂属性的选择——信息增益率

  分裂属性选择的评判标准是决策树算法之间的根本区别。区别于ID3算法通过信息增益选择分裂属性,C4.5算法通过信息增益率选择分裂属性。

  属性A的“分裂信息”(split information):

python决策树之C4.5算法详解

其中,训练数据集S通过属性A的属性值划分为m个子数据集,|Sj|表示第j个子数据集中样本数量,|S|表示划分之前数据集中样本总数量。

  通过属性A分裂之后样本集的信息增益:

python决策树之C4.5算法详解

信息增益的详细计算方法,可以参考博客“决策树之ID3算法及其Python实现”中信息增益的计算。

  通过属性A分裂之后样本集的信息增益率:

python决策树之C4.5算法详解

  通过C4.5算法构造决策树时,信息增益率最大的属性即为当前节点的分裂属性,随着递归计算,被计算的属性的信息增益率会变得越来越小,到后期则选择相对比较大的信息增益率的属性作为分裂属性。

3. 连续型属性的离散化处理

  当属性类型为离散型,无须对数据进行离散化处理;当属性类型为连续型,则需要对数据进行离散化处理。C4.5算法针对连续属性的离散化处理,核心思想:将属性A的N个属性值按照升序排列;通过二分法将属性A的所有属性值分成两部分(共有N-1种划分方法,二分的阈值为相邻两个属性值的中间值);计算每种划分方法对应的信息增益,选取信息增益最大的划分方法的阈值作为属性A二分的阈值。详细流程如下:
(1)将节点Node上的所有数据样本按照连续型属性A的具体取值,由小到大进行排列,得到属性A的属性值取值序列(xA1,...,xAN)
(2)在序列(xA1,...,xAN)中共有N-1种二分方法,即共产生N-1个分隔阈值。对于第i种二分方法,其二分阈值θi=xAi+xAi+12。它将该节点上的数据集划分为2个子数据集(xA1,...,xAi)(xAi+1,...,xAN)。计算此种二分结果下的信息增益。
(3)分别计算N-1种二分结果下的信息增益,选取信息增益最大的二分结果作为对属性A的划分结果,并记录此时的二分阈值。

4. 剪枝——PEP(Pessimistic Error Pruning)剪枝法

  由于决策树的建立完全是依赖于训练样本,因此该决策树对训练样本能够产生完美的拟合效果。但这样的决策树对于测试样本来说过于庞大而复杂,可能产生较高的分类错误率。这种现象就称为过拟合。因此需要将复杂的决策树进行简化,即去掉一些节点解决过拟合问题,这个过程称为剪枝。
  剪枝方法分为预剪枝和后剪枝两大类。预剪枝是在构建决策树的过程中,提前终止决策树的生长,从而避免过多的节点产生。预剪枝方法虽然简单但实用性不强,因为很难精确的判断何时终止树的生长。后剪枝是在决策树构建完成之后,对那些置信度不达标的节点子树用叶子结点代替,该叶子结点的类标号用该节点子树中频率最高的类标记。后剪枝方法又分为两种,一类是把训练数据集分成树的生长集和剪枝集;另一类算法则是使用同一数据集进行决策树生长和剪枝。常见的后剪枝方法有CCP(Cost Complexity Pruning)、REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、MEP(Minimum Error Pruning)。
  C4.5算法采用PEP(Pessimistic Error Pruning)剪枝法。PEP剪枝法由Quinlan提出,是一种自上而下的剪枝法,根据剪枝前后的错误率来判定是否进行子树的修剪,因此不需要单独的剪枝数据集。接下来详细介绍PEP(Pessimistic Error Pruning)剪枝法。
  对于一个叶子节点,它覆盖了n个样本,其中有e个错误,那么该叶子节点的错误率为(e+0.5)/n,其中0.5为惩罚因子(惩罚因子一般取值为0.5)。
  对于一棵子树,它有L个叶子节点,那么该子树的误判率为:

python决策树之C4.5算法详解

其中,ei表示子树第i个叶子节点错误分类的样本数量,ni表示表示子树第i个叶子节点中样本的总数量。

  假设一棵子树错误分类一个样本取值为1,正确分类一个样本取值为0,那么子树的误判次数可以认为是一个伯努利分布,因此可以得到该子树误判次数的均值和标准差:

python决策树之C4.5算法详解

把子树替换成叶子节点后,该叶子节点的误判率为:

python决策树之C4.5算法详解

其中,e′=∑Li=1ein′=∑Li=1ni

同时,该叶子结点的误判次数也是一个伯努利分布,因此该叶子节点误判次数的均值为:

python决策树之C4.5算法详解

剪枝的条件为:

python决策树之C4.5算法详解

满足剪枝条件时,则将所得叶子节点替换该子树,即为剪枝操作。

5. 缺失属性值的处理

  训练样本集中有可能会出现一些样本缺失了一些属性值,待分类样本中也会出现这样的情况。当遇到这样的样本集时该如何处理呢?含有缺失属性的样本集会一般会导致三个问题:

  (1)在构建决策树时,每一个分裂属性的选取是由训练样本集中所有属性的信息??益率来决定的。而在此阶段,如果训练样本集中有些样本缺少一部分属性,此时该如何计算该属性的信息??益率;

  (2)当已经选择某属性作为分裂属性时,样本集应该根据该属性的值来进行分支,但对于那些该属性的值为未知的样本,应该将它分支到哪一棵子树上;

  (3)在决策树已经构建完成后,如果待分类样本中有些属性值缺失,则该样本的分类过程如何进行。

  针对上述因缺失属性值引起的三个问题,C4.5算法有多种解决方案。
  面对问题一,在计算各属性的信息??益率时,若某些样本的属性值未知,那么可以这样处理:计算某属性的信息??益率时忽略掉缺失了此属性的样本;或者通过此属性的样本中出现频率最高的属性值,?值给缺失了此属性的样本。
  面对问题二,假设属性A已被选择作为决策树中的一个分支节点,在对样本集进行分支的时候,对于那些属性A的值未知的样本,可以送样处理:不处理那些属性A未知的样本,即简单的忽略它们;或者根据属性A的其他样本的取值,来对未知样本进行赋值;或者为缺失属性A的样本单独创建一个分支,不过这种方式得到的决策树模型结点数显然要??加,使模型更加复杂了。
  面对问题三,根据己经生成的决策树模型,对一个待分类的样本进行分类时,若此样本的属性A的值未知,可以这样处理:待分类样本在到达属性A的分支结点时即可结束分类过程,此样本所属类别为属性A的子树中概率最大的类别;或者把待分类样本的属性A赋予一个最常见的值,然后继续分类过程。

6. C4.5算法流程

python决策树之C4.5算法详解

7. C4.5算法优缺点分析

优点:

(1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;
(2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;
(3)构造决策树之后进行剪枝操作;
(4)能够处理具有缺失属性值的训练数据。

缺点:
(1)算法的计算效率较低,特别是针对含有连续属性值的训练样本时表现的尤为突出。
(2)算法在选择分裂属性时没有考虑到条件属性间的相关性,只计算数据集中每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python实现简单温度转换的方法
Mar 13 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
使用python3+xlrd解析Excel的实例
May 04 Python
python3实现SMTP发送邮件详细教程
Jun 19 Python
Python错误处理操作示例
Jul 18 Python
PySide和PyQt加载ui文件的两种方法
Feb 27 Python
如何利用Pyecharts可视化微信好友
Jul 04 Python
python实现画循环圆
Nov 23 Python
python中count函数简单的实例讲解
Feb 06 Python
Python通过getattr函数获取对象的属性值
Oct 16 Python
查找适用于matplotlib的中文字体名称与实际文件名对应关系的方法
Jan 05 Python
pandas中DataFrame数据合并连接(merge、join、concat)
May 30 Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 #Python
python实现ID3决策树算法
Dec 20 #Python
理解python中生成器用法
Dec 20 #Python
Python利用turtle库绘制彩虹代码示例
Dec 20 #Python
浅谈Python中range和xrange的区别
Dec 20 #Python
python机器学习实战之树回归详解
Dec 20 #Python
使用python 和 lint 删除项目无用资源的方法
Dec 20 #Python
You might like
如何做到多笔资料的同步
2006/10/09 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
PHP中的一些常用函数收集
2015/05/26 PHP
MSN消息提示类
2006/09/05 Javascript
jQuery Select(单选) 模拟插件 V1.3.62 改进版
2010/07/17 Javascript
JavaScript的document对象和window对象详解
2010/12/30 Javascript
js实现的牛顿摆效果
2015/03/31 Javascript
详解JavaScript中的构造器Constructor模式
2016/01/14 Javascript
jQuery简单实现上下,左右滑动的方法
2016/06/01 Javascript
javascript闭包概念简单解析(推荐)
2016/06/03 Javascript
几句话带你理解JS中的this、闭包、原型链
2016/09/26 Javascript
jQuery 实现双击编辑表格功能
2017/06/19 jQuery
详解vue项目构建与实战
2017/06/27 Javascript
Vue 组件间的样式冲突污染
2017/08/31 Javascript
angular2模块和共享模块详解
2018/04/08 Javascript
Node.js 的 GC 机制详解
2019/06/03 Javascript
JS实现动态添加外部js、css到head标签的方法
2019/06/05 Javascript
django输出html内容的实例
2018/05/27 Python
kaggle+mnist实现手写字体识别
2018/07/26 Python
Python中的函数式编程:不可变的数据结构
2018/10/08 Python
python celery分布式任务队列的使用详解
2019/07/08 Python
Python 实现的 Google 批量翻译功能
2019/08/26 Python
基于TensorFlow中自定义梯度的2种方式
2020/02/04 Python
深入浅析python的第三方库pandas
2020/02/13 Python
如何使用pycharm连接Databricks的步骤详解
2020/09/23 Python
Bitiba意大利:在线宠物商店
2020/10/31 全球购物
中医药大学毕业生自荐信
2013/11/08 职场文书
拉歌口号大全
2014/06/13 职场文书
教师批评与自我批评总结
2014/10/16 职场文书
劳动仲裁调解书
2015/05/20 职场文书
干货!开幕词的写作方法
2019/04/02 职场文书
五年级作文之成长
2019/09/16 职场文书
你有一份《诚信考试承诺书》待领取
2019/11/13 职场文书
golang正则之命名分组方式
2021/04/25 Golang
Python基础之元组与文件知识总结
2021/05/19 Python
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python