上一节(ID3原理及代码实现)讲到的ID3算法存在不足,用信息增益作为特征选择标准会偏向取值较多的特征,因为特征的取值越多(该特征数据分的更细)即纯度更高,不确定性(条件熵越小\(H(D|A)\))更低,由于\(H(D)\)是一定的,因此信息增益更大,所以偏向取值更多的特征。使用信息增益比可以矫正这一问题,信息增益比就是特征选择的另一准则——C4.5。

1 C4.5原理

信息增益比表达式:
\[g_{R}(D,A)=\frac{g(D,A)}{H_{A}(D)}\]
其中\(D\)是训练数据集,\(A\)是样本特征,\({H_{A}(D)}\)是特征熵,表达式为:
\[{H_{A}(D)}=-\sum_{i=1}^{n}\frac{|D_{i}|}{|D|}log_{2}\frac{|D_{i}|}{|D|}\]
\(n\)表示特征\(A\)的类别个数,\(D_{i}\)表示样本子集,\(|D_{i}|\) 表示\(D_{i}\)样本子集的个数。信息增益比本质是在信息增益的基础上乘一个惩罚参数。特征个数较多时,惩罚参数较小;特征个数较少时,惩罚参数较大。
惩罚参数:数据集\(D\)以特征\(A\)作为随机变量的熵的倒数,即:将特征A取值相同的样本划分到同一个子集中。

C4.5算法对ID3算法进行了改进,用信息增益比来选择特征。
决策树C4.5算法

输入: 训练数据集\(D\),特征集\(A\),阈值$\varepsilon $;

输出: 决策树\(T\)

step1 若\(D\)中所有实例属于同一类\(C_{k}\),则\(T\)为单结点树,并将类\(C_{k}\)作为该结点的类标记,返回\(T\);

step2 若\(A=\Phi\),则\(T\)为单结点树,并将\(D\)中实例数最大的类\(C_{k}\)作为该结点的类标记,返回\(T\);

step3 否则计算特征集\(A\)中各特征对\(D\)的信息增益比,选择信息增益最大的特征\(A_{g}\);

step4 如果\(A_{g}\)的信息增益小于阈值\(\varepsilon\),则置\(T\)为单结点树,并将\(D\)中实例数最大的类\(C_{k}\)作为该结点的类标记,返回\(T\);

step5 否则,对\(A_{g}\)的每一个取值\(A_{gi}\)将对应的样本输出\(D\)分成不同的类别\(D_{i}\),每个类别产生一个子节点,对应特征值是\(A_{gi}\),返回增加了结点的树;

step6 对所有的子结点,以\(D_{i}\)为训练集,以\(A-{A_{g}}\)为特征集,递归调用(1)-(5),得到子树\(T_{i}\),返回\(T_{i}\).

2 代码实现

这里只给出信息增益比特征选择部分,其他代码与ID3原理及代码实现一致。

def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1  # the last column is used for the labelsbaseEntropy = calcShannonEnt(dataSet)bestInfoGainRatio = 0.0;bestFeature = -1for i in range(numFeatures):  # iterate over all the featuresfeatList = [example[i] for example in dataSet]  # create a list of all the examples of this featureuniqueVals = set(featList)  # get a set of unique valuesnewEntropy = 0.0splitInfo = 0.0for value in uniqueVals:subDataSet = splitDataSet(dataSet, i, value)prob = len(subDataSet) / float(len(dataSet))newEntropy += prob * calcShannonEnt(subDataSet)splitInfo += -prob * log(prob, 2)infoGain = baseEntropy - newEntropy  # calculate the info gain; ie reduction in entropyif (infoGain == 0): #fix the overflow bugcontinueinfoGainRatio = infoGain / splitInfoif (infoGainRatio > bestInfoGainRatio):  # compare this to the best gain so farbestInfoGainRatio = infoGainRatio  # if better than current best, set to bestbestFeature = ireturn bestFeature  # returns an integer

控制台运行效果:

>>> import mytrees
>>> imp.reload(mytrees)
<module 'mytrees' from 'D:\\Python\\Mechine_learning\\Tree\\mytrees.py'>
>>> import treePlotter
>>> myTree = treePlotter.retrieveTree(0)
>>> treePlotter.createPlot(myTree)

3 C4.5小结

缺点:信息增益比偏向取值较少的特征
原因: 当特征取值较少时,\({H_{A}(D)}\)的值较小,因此其倒数较大,因而信息增益比较大。因而偏向取值较少的特征。
使用信息增益比:基于以上缺点,并不是直接选择信息增益率最大的特征,而是先在候选特征中找出信息增益高于平均水平的特征,然后在这些特征中再选择信息增益率最高的特征。

转载于:https://www.cnblogs.com/eugene0/p/11432431.html

决策树算法小结(二) C4.5原理及代码实现相关推荐

  1. 语音识别学习日志 2019-7-16 语音识别基础知识准备5 {决策树算法(ID3、 C4.5、 CART)}

    决策树算法(ID3. C4.5. CART) 决策树的定义 决策树学习采用的是自顶向下的递归方法,其基本思想是以信息熵为度量构造一颗熵值下降最快的树,到叶子节点处,熵值为0.其具有可读性.分类速度快的 ...

  2. 通俗地说决策树算法(二)实例解析

    前情提要: 通俗地说决策树算法(一)基础概念介绍 一. 概述 上一节,我们介绍了决策树的一些基本概念,包括树的基本知识以及信息熵的相关内容,那么这次,我们就通过一个例子,来具体展示决策树的工作原理,以 ...

  3. 最常用的决策树算法(二)Random Forest、Adaboost、GBDT 算法

    决策树是一个非常常见并且优秀的机器学习算法,它易于理解.可解释性强,其可作为分类算法,也可用于回归模型.本文将分三篇介绍决策树,第一篇介绍基本树(包括 ID3.C4.5.CART),第二篇介绍 Ran ...

  4. 通过实例理解决策树算法(ID3,C4.5,Cart算法)

    (一)实例:使用ID3算法给出"好苹果"的决策树 (二)决策树的工作原理 我们在做决策树的时候,会经历两个阶段:构造和剪枝. 构造原理--构造的过程就是选择什么属性作为节点的过程, ...

  5. 最常见核心的决策树算法—ID3、C4.5、CART(非常详细)

    点击上方"Datawhale",选择"星标"公众号 第一时间获取价值内容 决策树是一个非常常见并且优秀的机器学习算法,它易于理解.可解释性强,其可作为分类算法, ...

  6. 决策树算法(二)——构建数据集

    目录索引 目录索引 写在前面的话 决策树构建的一般流程 数据的构建 参考链接 写在后面的话 写在前面的话 如果您有任何地方看不懂的,那一定是我写的不好,请您告诉我,我会争取写的更加简单易懂! 如果您有 ...

  7. 决策树算法原理(下)

    在决策树算法原理(上)这篇里,我们讲到了决策树里ID3算法,和ID3算法的改进版C4.5算法.对于C4.5算法,我们也提到了它的不足,比如模型是用较为复杂的熵来度量,使用了相对较为复杂的多叉树,只能处 ...

  8. 决策树算法原理以及决策树规则生成方法

    决策树算法原理以及决策树规则生成方法 决策树是一种可解释性较强的策略分析工具.creditmodel提供了分类回归树和条件推断树两种决策树生成和提取规则的方法. 每一个风险管理人员都应该掌握使用决策树 ...

  9. 机器学习决策树算法和分类原理

    目录 1 决策树算法简介 2 决策树分类原理 2.1 熵 2.1.1 概念 2.1.2 案例 2.2 划分依据一 :信息增益 2.2.1 概念 2.2.2 案例 2.3 划分依据二 :信息增益率 2. ...

  10. 机器学习算法——决策树算法详细介绍,并使用sklearn实现案例预测,可视化决策树

    目录 一.决策树算法简介 二.决策树分类原理 1.熵 1.1 概念 1.2 案例 2.决策树的划分依据一:信息增益 2.1 概念 2.2 案例: 3.决策树的划分依据二:信息增益率 3.1 概念 3. ...

最新文章

  1. web开发语言大盘点
  2. DolphinScheduler对比Airflow
  3. shareSDK 提示#warning:尚未配置[新浪微博]URL Scheme:sinaweibosso.或wb
  4. Java语言所有异常类均继承自_要继承自定义异常类的继承方式必须使用 ( ) 关键字_学小易找答案...
  5. 判断Mouse事件源类型
  6. usb接口的可变焦相机 对应没有彩虹的投影仪
  7. unity常用的引用赋值一个GameObject的三种方法
  8. 安卓车机没有ADB调试,任意安装第三方软件教程
  9. Reg Organizer(电脑注册表清理大师)官方中文版V8.70 | win10注册表清理工具下载
  10. 根据开始日期,结束日期,计算出日历上有几周的方法
  11. 数列求和再求极限问题
  12. DateTime.Now函数详解 所有用法
  13. python代码补全_python命令自动补全
  14. ASA防火墙基本操作
  15. 计算机安装win10系统还原,解决win10电脑一键还原教程
  16. 网站服务器到期后 内容释放,服务器到期后多久释放
  17. Qt进阶--Item Views详解(基础,原创,超级详细)
  18. 《科学之路》| 图灵奖得主杨立昆人工智能十问:AI会统治人类吗?
  19. Win10深度学习环境配置(CUDA+cuDNN+TensorFlow-gpu+Keras)
  20. 计算机分子模拟聚乙烯,用“分子模拟”软件构建聚乙烯分子、全同立构聚丙烯分子,并计算它们末端的直线距离-高分子物理-实验1-01...

热门文章

  1. java使用kaptcha生成图片验证码
  2. 【Python小程序】第3讲:如何将json数据转换成csv格式?
  3. 【sklearn第二十三讲】异常检测
  4. 迁移学习——数据不够的情况下训练深度学习模型
  5. matlab之简单粒子群的函数寻优
  6. 力扣——合并K个排序链表
  7. 【转】wget 使用技巧
  8. bug篇——Windows启动redis报错Creating Server TCP listening socket 127.0.0.1:6379: bind: No error...
  9. 函数 迭代器,生成器
  10. 数据分析 -- 流程