简单python代码实现决策树计算信息增益_python手动计算信息增益
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手动计算信息增益相关推荐
- python代码实现决策树分类
0. 前言 上一篇博客对决策树算法的思想作了描述,也详细写了如何构造一棵决策树.现在希望用python代码来实现它.此处先调用机器学习中的算法库来实现. 2. python代码实现决策树(决策树分类器 ...
- python的代码有哪些_简单python代码类型有哪些?
简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...
- 派大星python代码,简单python代码类型有哪些?
简单python代码类型有哪些? 简单python代码类型有: 1.[背景] 最近,派大星想要减肥,他决定控制自己的饮食,少吃一点蟹黄堡. 海绵宝宝为了帮助好朋友派大星,和派大星一起制定了一个饮食游戏 ...
- python代码大全和用法用量_Python生成器的使用方法和示例代码
本文是<Effect Python 编写高质量Python代码的59个有效方法>的学习笔记.主要记录生成器的使用方法和示例代码. 返回队列的函数 如果函数要产生一系列结果,那么最简单的做法 ...
- python代码解释4个作用域_Python中作用域的深入讲解
前言 作用域是指变量的生效范围,例如本地变量.全局变量描述的就是不同的生效范围. python的变量作用域的规则非常简单,可以说是所有语言中最直观.最容易理解的作用域. 在开始介绍作用域之前,先抛一个 ...
- 决策树之剪枝算法手动计算+R语言简单实现——(二)
目录 决策树的修剪 决策树规则提取 决策树算法小结 R语言小例子 在上一篇我们介绍了,决策树的数据准备与决策树的生长,也用一个小例子手动计算了决策树的生长分支过程.常用的分支准则方法有三种:信息增益. ...
- python代码封装供第三方使用_python发博客
广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! python生成csdn博客分享图一.前言我们分享博客的方式有很多种,最常见的无 ...
- python代码如何做成应用程序_Python的源代码如何转成可以执行的应用程序?
一.安装pyinstaller 如果你用的是pycarm,直接在setting里面找到pyinstaller的库安装即可. 有一点要注意的是,并非所有的python都支持pyinstaller,目前的 ...
- NW小世界网络模型python代码实现及平均路径聚类系数计算
NW小世界网络模型 • 在 WS 模型提出之后,人们自然希望进一步对该模型的性质做理论分析.不久之后 ,Newman 和 Watts 提出了另一个在理论分析方面相对容易处理的小世界模型,现在称为 NW ...
最新文章
- 一维随机变量及其概率分布
- php图文消息带代码详细注释,微信发送图文消息代码整理
- 写了多年代码,你会 StackOverflow 吗
- 去除aspx生成的页面最开始的空行
- Python day 9(6) 调试
- IDEA中报错“cannot resolve symbol XXX”,但编译正确可以运行
- C#Winform调用网页中的JS方法
- 拳王虚拟项目公社:月入16000+的虚拟商品教程,虚拟项目全自动化的升级玩法拆解
- PPP 守护进程 RCE 漏洞已存在17年,可控制几乎所有的 Linux 系统
- net系统安全开发手册
- java实现订单未支付失效_Java微信支付之关闭订单
- 西魏拓地与侯景防线之关系
- python打印程序时间_Python:打印程序执行的时间
- Qt之实现图片轮播效果
- 设计模式 -- 简单工厂模式
- 4.Python数据结构与算法分析课后习题__chapter4
- 全网最火爆,最详细Docker与自动化测试讲解,看完觉得我又行了
- 电子科技大学计算机博士要求,博士研究生发表论文的要求-电子科技大学.PDF
- ASCII码为0x01,0x02作为分隔符(这两个字符是键盘无法输入的)以及String.split()分割特殊字符处理
- 超详细面经分享!@最近考虑换工作的伙伴们
热门文章
- VC++利用微软mstscax.dll控件集成远程桌面
- 数字图书馆是计算机技术多媒体技术网络技术,数字图书馆是计算机技术、多媒体技术、网络技术和其他相关技术发展的产物,有着传统图书馆无法比拟...
- Oracle-添加列(字段)与注释
- Java字符编码详解
- mybatis plus join
- 无限淘无法连接服务器,电脑无限网络连接受限
- 经典的 QQ vs 360 动画——右下角的战事
- 2022虎年送祝福小程序 程序源码
- 深度学习系列笔记——贰 (基于Tensorflow Keras搭建的猫狗大战模型 一)
- [转]电影有时候不仅仅是娱乐,哈佛商学院和斯坦福要求学生必看的20部电影(当然你可以选择不看,没有人逼迫只有梦想只有天真和勇气的你)...