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

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

1. C4.5算法简介

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

(1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;

(2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;

(3)构造决策树之后进行剪枝操作;

(4)能够处理具有缺失属性值的训练数据。

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

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

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

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

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

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

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

通过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个叶子节点,那么该子树的误判率为:

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

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

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

其中,e′=∑Li=1ei,n′=∑Li=1ni。

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

剪枝的条件为:

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

5. 缺失属性值的处理

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

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

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

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

针对上述因缺失属性值引起的三个问题,C4.5算法有多种解决方案。

面对问题一,在计算各属性的信息増益率时,若某些样本的属性值未知,那么可以这样处理:计算某属性的信息増益率时忽略掉缺失了此属性的样本;或者通过此属性的样本中出现频率最高的属性值,賦值给缺失了此属性的样本。

面对问题二,假设属性A已被选择作为决策树中的一个分支节点,在对样本集进行分支的时候,对于那些属性A的值未知的样本,可以送样处理:不处理那些属性A未知的样本,即简单的忽略它们;或者根据属性A的其他样本的取值,来对未知样本进行赋值;或者为缺失属性A的样本单独创建一个分支,不过这种方式得到的决策树模型结点数显然要増加,使模型更加复杂了。

面对问题三,根据己经生成的决策树模型,对一个待分类的样本进行分类时,若此样本的属性A的值未知,可以这样处理:待分类样本在到达属性A的分支结点时即可结束分类过程,此样本所属类别为属性A的子树中概率最大的类别;或者把待分类样本的属性A赋予一个最常见的值,然后继续分类过程。

6. C4.5算法流程

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

优点:

(1)通过信息增益率选择分裂属性,克服了ID3算法中通过信息增益倾向于选择拥有多个属性值的属性作为分裂属性的不足;

(2)能够处理离散型和连续型的属性类型,即将连续型的属性进行离散化处理;

(3)构造决策树之后进行剪枝操作;

(4)能够处理具有缺失属性值的训练数据。

缺点:

(1)算法的计算效率较低,特别是针对含有连续属性值的训练样本时表现的尤为突出。

(2)算法在选择分裂属性时没有考虑到条件属性间的相关性,只计算数据集中每一个条件属性与决策属性之间的期望信息,有可能影响到属性选择的正确性。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持码农之家。

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

用python编写决策树算法_详细介绍python实现决策树C4.5算法相关推荐

  1. python or的用法_详细介绍Python中and和or实际用法

    and 和 or 的特殊性质 在Python 中,and 和 or 执行布尔逻辑演算,但是它们并不返回布尔值:而是,返回它们实际进行比较的值之一.下面来看一下实例.>>> 'a' a ...

  2. python位运算符_详细介绍Python语言中的按位运算符

    按位运算符是把数字看作二进制来进行计算的.Python中的按位运算法则如下: 按位与 ( bitwise and of x and y ) & 举例: 5&3 = 1 解释: 101 ...

  3. python语言中运算符号_详细介绍Python语言中的按位运算符

    <从问题到程序:用Python学编程和计算>--2.11 补充材料 本节书摘来自华章计算机<从问题到程序:用Python学编程和计算>一书中的第2章,第2.11节,作者:裘宗燕 ...

  4. python 偏函数_详细介绍Python中的偏函数

    机器学习实战之Logistic回归 本文来自云栖社区官方钉群"Python技术进阶",了解相关信息可以关注"Python技术进阶". 本系列教程特点: 基于&l ...

  5. python链表详细教程_详细介绍python数据结构之链表

    这篇文章主要为大家详细介绍了python数据结构之链表的相关资料,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 数据结构是计算机科学必须掌握的一门学问,之前很多的教材都是用C语言实现链表,因为c有 ...

  6. 用python编写密码安全性_用大数据python保护密码

    本篇文章给大家带来的就是关于用大数据Python保护密码,大数据时代,各种网站都需要你注册账号,使用密码.往往大家为了省事,所有的平台的账号密码是一样的,假如某个网站数据泄露后,那你的隐私安全就有问题 ...

  7. python中整型_实例介绍Python中整型

    实例介绍Python中整型 Python中有以下几个基本的数据类型: 整数 int 字符串 str 浮点数 float 集合 set 列表 list 元组 tuple 字典 dict 布尔类型 boo ...

  8. python中len用法_简单介绍Python中的len()函数的使用

    简单介绍Python中的len()函数的使用 函数:len() 1:作用:返回字符串.列表.字典.元组等长度 2:语法:len(str) 3:参数:str:要计算的字符串.列表.字典.元组等 4:返回 ...

  9. python中数据类型大小_详细解析Python中的变量的数据类型

    变量是只不过保留的内存位置用来存储值.这意味着,当创建一个变量,那么它在内存中保留一些空间. 根据一个变量的数据类型,解释器分配内存,并决定如何可以被存储在所保留的内存中.因此,通过分配不同的数据类型 ...

  10. python3 进度条_详细介绍Python进度条tqdm的使用

    前言 有时候在使用Python处理比较耗时操作的时候,为了便于观察处理进度,这时候就需要通过进度条将处理情况进行可视化展示,以便我们能够及时了解情况.这对于第三方库非常丰富的Python来说,想要实现 ...

最新文章

  1. c语言第五章循环控制实验报告,C语言实验报告5《循环控制》.doc
  2. openJDK与JDK的区别
  3. 基于PU-Learning的恶意URL检测
  4. java 唯一id生成算法_分布式全局唯一ID生成方案之snowflake算法
  5. 【机器学习】机器学习实践中的 7 种常见错误
  6. .NET Core AWS S3云存储
  7. java.jsp.jdbc_Java-jsp使用JDBC访问数据库时显示乱码是怎么回事?
  8. 解决Tomcat.exe或者startup.bat 一闪无法打开的问题
  9. php递归算法排序,php全排列递归算法代码
  10. 根据多个字段分组_Excel 分组后计算
  11. wine运行软件检测不到u盘_PE吧“U盘助理”——启动U盘制作图文教程-
  12. php创建游戏房间思路,php设计模式之建造器模式分析【星际争霸游戏案例】
  13. 数据库:如何安装SQL,手把手教你
  14. VLC解码播放H264文件
  15. Bandicam一款值得被吹爆的录屏软件
  16. 批量查排名的工具有哪些?网站关键词可以优化?
  17. python find_peaks 源码理解
  18. 第四届互联网+市赛后总结
  19. USB学习入门(三)------众里寻他千百度(windows)
  20. webpack设置不打包文件

热门文章

  1. lua劈分字符串方法及实例
  2. Linux系统基础入门
  3. Android应用开发初印象
  4. 那些年使用Android studio遇到的问题
  5. 计算机c盘要满了电脑会卡吗,C盘满了 电脑卡顿了,怎么清理空间
  6. java 八进制 转义字符_string中转义字符
  7. 服务器接收到其他服务器传送的数据_其他-查找网内的其他DHCP服务器-从零开始学RouterOS系列21...
  8. idea android模拟器无法启动,Flutter Hello world应用程序无法在Android模拟器x86_64上启动...
  9. python 相关系数矩阵可视化_python seaborn heatmap可视化相关性矩阵实例
  10. wpf 让图标显示在系统托盘