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
安装dbus-python的简要教程
May 05 Python
Python爬取qq music中的音乐url及批量下载
Mar 23 Python
利用nohup来开启python文件的方法
Jan 14 Python
更新修改后的Python模块方法
Mar 03 Python
一篇文章彻底搞懂Python中可迭代(Iterable)、迭代器(Iterator)与生成器(Generator)的概念
May 13 Python
python-Web-flask-视图内容和模板知识点西宁街
Aug 23 Python
Python坐标线性插值应用实现
Nov 13 Python
深入浅析pycharm中 Make available to all projects的含义
Sep 15 Python
python 还原梯度下降算法实现一维线性回归
Oct 22 Python
python单例模式的应用场景实例讲解
Feb 24 Python
Python编写可视化界面的全过程(Python+PyCharm+PyQt)
May 17 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 XML操作类DOMDocument
2009/12/16 PHP
destoon出现验证码不显示时的紧急处理方法
2014/08/22 PHP
php源码分析之DZX1.5加密解密函数authcode用法
2015/06/17 PHP
php常量详细解析
2015/10/27 PHP
对联广告js flash激活
2006/10/19 Javascript
jQuery EasyUI API 中文文档 - TreeGrid 树表格使用介绍
2011/11/21 Javascript
js函数排序的实例代码
2013/07/01 Javascript
把input初始值不写value的具体实现方法
2013/07/04 Javascript
webpack本地开发环境无法用IP访问的解决方法
2018/03/20 Javascript
vue 开发一个按钮组件的示例代码
2018/03/27 Javascript
vue的过滤器filter实例详解
2018/09/17 Javascript
微信小程序常用简易小函数总结
2019/02/01 Javascript
layui2.0使用table+laypage实现真分页
2019/07/27 Javascript
webgl实现物体描边效果的方法介绍
2019/11/27 Javascript
js实现图片实时时钟
2020/01/15 Javascript
Ant design vue中的联动选择取消操作
2020/10/31 Javascript
go语言计算两个时间的时间差方法
2015/03/13 Python
matplotlib简介,安装和简单实例代码
2017/12/26 Python
Python解析命令行读取参数之argparse模块
2019/07/26 Python
Python函数式编程实例详解
2020/01/17 Python
python如何删除列为空的行
2020/07/17 Python
python爬虫请求头设置代码
2020/07/28 Python
CSS3 不定高宽垂直水平居中的几种方式
2020/03/26 HTML / CSS
Auchan Direct波兰:欧尚在线杂货店
2016/10/19 全球购物
John Hardy官方网站:手工设计首饰的奢侈品牌
2017/07/05 全球购物
理工科学生的自我评价
2013/12/15 职场文书
教育孩子心得体会
2014/01/01 职场文书
劳动之星获奖感言
2014/02/01 职场文书
努力学习演讲稿
2014/05/10 职场文书
2014年有孩子的离婚协议书范本
2014/10/08 职场文书
机关干部作风建设剖析材料
2014/10/23 职场文书
2015年加油站站长工作总结
2015/05/27 职场文书
解决MySQL存储时间出现不一致的问题
2021/04/28 MySQL
Java 超详细讲解十大排序算法面试无忧
2022/04/08 Java/Android
Java 多态分析
2022/04/26 Java/Android
JS实现刷新网页后之前浏览位置保持不变示例详解
2022/08/14 Javascript