python手动计算信息增益

2019年5月23日 17:49 by wst

算法实践

概念阐述

对于决策树, 以前看了很多遍, 但是总感觉摸不着它.

里面有个很重要的概念: 信息增益.

今天就来手动实现下, 实现之前先说下它的概念(这个定义里好多名词都有经验二字,是因为都是根据样本得到的).

特征 A 对训练数据集D的信息增益 g(D,A) 定义为: 集合D的经验熵 H(D) 与特征A给定条件下D 的经验条件熵 H(D|A) 之差, 即:

g(D,A) = H(D) - H(D|A)

通俗的说就是:  在一个条件给定情况下,信息不确定性减少的程度!

在决策树生成过程中,每次选择信息增益最大的那个特征作为节点.

举例说明

以买瓜为例,夏天到了, 大家都比较爱吃西瓜, 但是怎么样才能买个好瓜呢? 要不然回家媳妇(女朋友)该说了, 你什么情况? 买个西瓜都买不好. 为了避免挨说, 还是得学好决策树, 搞清楚信息增益是怎么回事.

数据如下: (下载方式: 链接: https://pan.baidu.com/s/1Gr1TLaVwuwi9lO6BcdjoAQ 提取码: wr9j )

编号

色泽

根蒂

敲声

纹理

脐部

触感

好瓜

1

青绿

蜷缩

浊响

清晰

凹陷

硬滑

2

乌黑

蜷缩

沉闷

清晰

凹陷

硬滑

3

乌黑

蜷缩

浊响

清晰

凹陷

硬滑

4

青绿

蜷缩

沉闷

清晰

凹陷

硬滑

5

浅白

蜷缩

浊响

清晰

凹陷

硬滑

6

青绿

稍蜷

浊响

清晰

稍凹

软粘

7

乌黑

稍蜷

浊响

稍糊

稍凹

软粘

8

乌黑

稍蜷

浊响

清晰

稍凹

硬滑

9

乌黑

稍蜷

沉闷

稍糊

稍凹

硬滑

10

青绿

硬挺

清脆

清晰

平坦

软粘

11

浅白

硬挺

清脆

模糊

平坦

硬滑

12

浅白

蜷缩

浊响

模糊

平坦

软粘

13

青绿

稍蜷

浊响

稍糊

凹陷

硬滑

14

浅白

稍蜷

沉闷

稍糊

凹陷

硬滑

15

乌黑

稍蜷

浊响

清晰

稍凹

软粘

16

浅白

蜷缩

浊响

模糊

平坦

硬滑

17

青绿

蜷缩

沉闷

稍糊

稍凹

硬滑

假设我们已经构建好了决策树,现在买了一个西瓜,它的特点是纹理是清晰,根蒂是硬挺的瓜,你来给我判断一下是好瓜还是坏瓜,恰好,你构建了一颗决策树,告诉他,没问题,我马上告诉你是好瓜,还是坏瓜?

根据决策树的算法步骤,我们可以得到下面的图示过程:

到达叶子结点后,从而得到结论。我这个瓜的判断是坏瓜(要挨说了)。

这里我们重点来说一下,在树每一层的生长过程中,如何选择特征!每一层选择好了特征之后,树也就自然建好了

第一个节点(每个节点都是如此)该怎么选呢?  根据我们的结论: 选择信息增益最大的那个特征作.

根节点下正例(好瓜)占 8/17,反例占 9/17 ,根结点的信息熵为

现在可选的特征有:{色泽,根蒂,敲声,纹理,脐部,触感},我们分别计算他们的信息增益:

色泽特征有3个可能的取值:{青绿,乌黑,浅白}

D1(色泽=青绿) = {1, 4, 6, 10, 13, 17},正例 3/6,反例 3/6 -- 6,3,3

D2(色泽=乌黑) = {2, 3, 7, 8, 9, 15},正例 4/6,反例 2/6 -- 6,4,2

D3(色泽=浅白) = {5, 11, 12, 14, 16},正例 1/5,反例 4/5 -- 5,1,4

3 个分支结点的信息熵

那么我们可以知道属性色泽的信息增益是:

同理,我们可以求出其它属性的信息增益,分别如下:

根据后文的代码,计算过程为(里面的数字,通过excel筛选即可得到):

# 色泽

In [21]: h(8,9,[[6,3,3],[6,4,2],[5,1,4]])

Out[21]: 0.10812516526536531

# 根蒂

In [22]: h(8,9,[[8,5,3],[7,3,4],[2,0,2]])

Out[22]: 0.14267495956679288

# 敲声

In [23]: h(8,9,[[5,2,3],[2,0,2],[10,6,4]])

Out[23]: 0.14078143361499584

# 纹理

In [24]: h(8,9,[[3,0,3],[9,7,2],[5,1,4]])

Out[24]: 0.3805918973682686

# 脐部

In [25]: h(8,9,[[7,5,2],[4,0,4],[6,3,3]])

Out[25]: 0.28915878284167895

# 触感

In [26]: h(8,9,[[5,2,3],[12,6,6]])

Out[26]: 0.006046489176565584

于是我们找到了信息增益最大的属性纹理,它的Gain(D,纹理) = 0.381最大。

于是我们选择的划分属性为“纹理”

如下:

于是,我们可以得到了三个子结点,对于这三个子节点,我们可以递归的使用刚刚找信息增益最大的方法进行选择特征属性,

比如:D1(纹理=清晰) = {1, 2, 3, 4, 5, 6, 8, 10, 15},下次可选的属性集合{色泽、根蒂、敲声、脐部、触感},基于 D1各属性的信息增益,分别求得如下:

手动编码计算:

In [1]: import pandas as pd

In [2]: import numpy as np

In [3]: import math

In [14]: def lg(v):

...: if v==0:

...: return 0

...: return -v*math.log(v,2)

...:

...:

In [15]: def h(f_1, f_0, matrix):

...: a = f_1+f_0

...: d = lg(f_1/a) + lg(f_0/a)

...: m = 0

...: for lis in matrix:

...: m += lis[0]/a * (lg(lis[1]/lis[0]) + lg(lis[2]/lis[0]))

...: return d-m

...:

...:

In [16]: h(7,2,[[4,3,1],[4,3,1],[1,1,0]])

Out[16]: 0.04306839587828004

In [17]: h(7,2,[[5,5,0],[3,2,1],[1,0,1]])

Out[17]: 0.45810589515712374

In [18]: h(7,2,[[2,2,0],[1,0,1],[6,5,1]])

Out[18]: 0.33085622540971754

In [19]: h(7,2,[[5,5,0],[1,0,1],[3,2,1]])

Out[19]: 0.45810589515712374

In [20]: h(7,2,[[3,1,2],[6,6,0]])

Out[20]: 0.45810589515712374

代码说明:

f_1 -- 好瓜个数, f_0 -- 坏瓜个数, matrix -- 里面有多行, 每一行代表一个属性值的情况: 此属性值个数、此属性值下好瓜的个数、此属性值下坏瓜的个数。

比如色泽属性,在纹理清晰的情况下,有7个好瓜,2个坏瓜。同时:

色泽青绿的有4个,这4个中有3个好瓜、1个坏瓜;

色泽乌黑的有4个,这4个中有3个好瓜、1个坏瓜;

色泽浅白的有1个,这1个是好瓜;

此时matrix为:

[ [4, 3, 1],

[4, 3, 1],

[1, 1, 0]]

函数调用方式为:h(7,2,[[4,3,1],[4,3,1],[1,1,0]]), 值为0.043

同理,可以算出来根蒂的信息增益为:0.458;敲声:0.331,脐部:0.458,触感:0.458

于是我们可以选择特征属性为根蒂,脐部,触感三个特征属性中任选一个(因为他们三个相等并最大),其它俩个子结点同理,然后得到新一层的结点,再递归的由信息增益进行构建树即可

我们最终的决策树如下:

参考:

作者:忆臻

链接:https://www.zhihu.com/question/22104055/answer/161415527

来源:知乎

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

Comment

×

Name

Email address

Comment

Close

Submit

Not Comment!

简单python代码实现决策树计算信息增益_python手动计算信息增益相关推荐

  1. python代码实现决策树分类

    0. 前言 上一篇博客对决策树算法的思想作了描述,也详细写了如何构造一棵决策树.现在希望用python代码来实现它.此处先调用机器学习中的算法库来实现. 2. python代码实现决策树(决策树分类器 ...

  2. python的代码有哪些_简单python代码类型有哪些?

    简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...

  3. 派大星python代码,简单python代码类型有哪些?

    简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...

  4. python代码大全和用法用量_Python生成器的使用方法和示例代码

    本文是<Effect Python 编写高质量Python代码的59个有效方法>的学习笔记.主要记录生成器的使用方法和示例代码. 返回队列的函数 如果函数要产生一系列结果,那么最简单的做法 ...

  5. python代码解释4个作用域_Python中作用域的深入讲解

    前言 作用域是指变量的生效范围,例如本地变量.全局变量描述的就是不同的生效范围. python的变量作用域的规则非常简单,可以说是所有语言中最直观.最容易理解的作用域. 在开始介绍作用域之前,先抛一个 ...

  6. 决策树之剪枝算法手动计算+R语言简单实现——(二)

    目录 决策树的修剪 决策树规则提取 决策树算法小结 R语言小例子 在上一篇我们介绍了,决策树的数据准备与决策树的生长,也用一个小例子手动计算了决策树的生长分支过程.常用的分支准则方法有三种:信息增益. ...

  7. python代码封装供第三方使用_python发博客

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python生成csdn博客分享图一.前言我们分享博客的方式有很多种,最常见的无 ...

  8. python代码如何做成应用程序_Python的源代码如何转成可以执行的应用程序?

    一.安装pyinstaller 如果你用的是pycarm,直接在setting里面找到pyinstaller的库安装即可. 有一点要注意的是,并非所有的python都支持pyinstaller,目前的 ...

  9. NW小世界网络模型python代码实现及平均路径聚类系数计算

    NW小世界网络模型 • 在 WS 模型提出之后,人们自然希望进一步对该模型的性质做理论分析.不久之后 ,Newman 和 Watts 提出了另一个在理论分析方面相对容易处理的小世界模型,现在称为 NW ...

最新文章

  1. 一维随机变量及其概率分布
  2. php图文消息带代码详细注释,微信发送图文消息代码整理
  3. 写了多年代码,你会 StackOverflow 吗
  4. 去除aspx生成的页面最开始的空行
  5. Python day 9(6) 调试
  6. IDEA中报错“cannot resolve symbol XXX”,但编译正确可以运行
  7. C#Winform调用网页中的JS方法
  8. 拳王虚拟项目公社:月入16000+的虚拟商品教程,虚拟项目全自动化的升级玩法拆解
  9. PPP 守护进程 RCE 漏洞已存在17年,可控制几乎所有的 Linux 系统
  10. net系统安全开发手册
  11. java实现订单未支付失效_Java微信支付之关闭订单
  12. 西魏拓地与侯景防线之关系
  13. python打印程序时间_Python:打印程序执行的时间
  14. Qt之实现图片轮播效果
  15. 设计模式 -- 简单工厂模式
  16. 4.Python数据结构与算法分析课后习题__chapter4
  17. 全网最火爆,最详细Docker与自动化测试讲解,看完觉得我又行了
  18. 电子科技大学计算机博士要求,博士研究生发表论文的要求-电子科技大学.PDF
  19. ASCII码为0x01,0x02作为分隔符(这两个字符是键盘无法输入的)以及String.split()分割特殊字符处理
  20. 超详细面经分享!@最近考虑换工作的伙伴们

热门文章

  1. VC++利用微软mstscax.dll控件集成远程桌面
  2. 数字图书馆是计算机技术多媒体技术网络技术,数字图书馆是计算机技术、多媒体技术、网络技术和其他相关技术发展的产物,有着传统图书馆无法比拟...
  3. Oracle-添加列(字段)与注释
  4. Java字符编码详解
  5. mybatis plus join
  6. 无限淘无法连接服务器,电脑无限网络连接受限
  7. 经典的 QQ vs 360 动画——右下角的战事
  8. 2022虎年送祝福小程序 程序源码
  9. 深度学习系列笔记——贰 (基于Tensorflow Keras搭建的猫狗大战模型 一)
  10. [转]电影有时候不仅仅是娱乐,哈佛商学院和斯坦福要求学生必看的20部电影(当然你可以选择不看,没有人逼迫只有梦想只有天真和勇气的你)...