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实现KNN邻近算法
Jan 28 Python
python3+PyQt5实现自定义分数滑块部件
Apr 24 Python
python 寻找list中最大元素对应的索引方法
Jun 28 Python
python 读取dicom文件,生成info.txt和raw文件的方法
Jan 24 Python
Python实现插入排序和选择排序的方法
May 12 Python
Python Django的安装配置教程图文详解
Jul 17 Python
PyTorch中Tensor的拼接与拆分的实现
Aug 18 Python
python 多进程队列数据处理详解
Dec 23 Python
如何基于python实现不邻接植花
May 01 Python
基于python制作简易版学生信息管理系统
Apr 20 Python
Python数据处理的三个实用技巧分享
Apr 01 Python
Python可视化神器pyecharts之绘制地理图表练习
Jul 07 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
PHP数组及条件,循环语句学习
2012/11/11 PHP
Yii框架中memcache用法实例
2014/12/03 PHP
php使用ffmpeg获取视频信息并截图的实现方法
2016/05/03 PHP
php创建类并调用的实例方法
2019/09/25 PHP
javascript 全等号运算符使用说明
2010/05/31 Javascript
推荐20家国外的脚本下载网站
2011/04/28 Javascript
浅谈关于JavaScript的语言特性分析
2013/04/11 Javascript
js中单引号与双引号冲突问题解决方法
2013/10/04 Javascript
解析JavaScript中点号“.”的多义性
2013/12/02 Javascript
Javascript的表单验证-揭开正则表达式的面纱
2016/03/18 Javascript
jQuery Ajax使用FormData对象上传文件的方法
2016/09/07 Javascript
Javascript数组中push方法用法分析
2016/10/31 Javascript
node.js学习之交互式解释器REPL详解
2016/12/08 Javascript
jquery 仿锚点跳转到页面指定位置的实例
2017/02/14 Javascript
分享一道关于闭包、bind和this的面试题
2017/02/20 Javascript
vue中引入第三方字体文件的方法示例
2018/12/17 Javascript
微信小程序下拉框搜索功能的实现方法
2019/07/31 Javascript
jQuery pager.js 插件动态分页功能实例分析
2019/08/02 jQuery
Vue中qs插件的使用详解
2020/02/07 Javascript
Anaconda 离线安装 python 包的操作方法
2018/06/11 Python
详解python中@的用法
2019/03/27 Python
Python3.5内置模块之shelve模块、xml模块、configparser模块、hashlib、hmac模块用法分析
2019/04/27 Python
python实现数据清洗(缺失值与异常值处理)
2019/12/02 Python
python使用正则表达式(Regular Expression)方法超详细
2019/12/30 Python
Bibloo奥地利:购买女装、男装、童装、鞋和配件
2018/10/18 全球购物
G-Form护具官方网站:美国运动保护装备
2019/09/04 全球购物
单位人事专员介绍信
2014/01/11 职场文书
中学生期末评语
2014/02/03 职场文书
2014年社区学雷锋活动总结
2014/03/09 职场文书
房地产公司见习自我鉴定
2014/04/28 职场文书
房屋分割离婚协议书范本
2014/12/01 职场文书
优秀党员事迹材料
2014/12/18 职场文书
2015年办公室主任工作总结
2015/04/09 职场文书
python3使用diagrams绘制架构图的步骤
2021/04/08 Python
浅谈Python响应式类库RxPy
2021/06/14 Python
python playwright 自动等待和断言详解
2021/11/27 Python