当前位置: 首页 > news >正文

决策树 熵

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

为了使决策树最优,哪一个属性将在树的根节点被测试?分类能力最好的属性被选作树的根结点的测试。采用不同测试属性及其先后顺序将会生成不同的决策树。

定义一个统计属性,称为“信息增益”(information gain),用来衡量给定的属性区分训练样例的能力。度量信息增益的标准为“熵”(entropy)。信息量就是不确定性的多少,熵越大,信息的不确定性越大

 

熵代表一个系统的杂乱程度,熵越大,系统越杂乱。对一个数据集中数据的分类就是使得该数据集熵减小的过程。

决策树算法就是一个划分数据集的过程。划分数据集的原则就是:将无序的数据变得更加有序。我们假设得到的数据是有用的信息,处理信息的一种有效的方法就是利用信息论。

信息增益:划分数据集前后信息的变化成为信息增益,获得信息增益最高的特征就是最好的选择。那么如何计算信息增益?集合信息的度量方式称为熵。

“ 如果看不明白什么是信息增益和熵,请不要着急——它们自诞生的那一天起,就注定会令世人十分费解。克劳德香农写信息论之后,约翰冯诺依曼建议使用“熵”这个术语,因为大家都不知道它是什么意思。 ”

熵定义为信息的期望值,在明晰这个概念之前,先来看看信息的定义。如果待分类的事务可能划分在多个分类之中,则符号 的信息定义为:

02111801_hmej.gif

其中 是选择该分类的概率。

所有类别所有可能值包含的信息期望值,即是计算所得的熵:

02111802_mCc2.gif

三、一个简单的例子

下表包含5个海洋动物,特征包括:不浮出水面是否可以生存,以及是否有脚蹼。将这些动物分为两类:鱼类和非鱼类。要研究的问题就是依据第一个特征还是第二个特征划分数据。

 不浮出水面是否可以生存是否又脚蹼属于鱼类
1
2
3
4
5

先给出计算香农熵的python代码,以备后续使用(一下所有代码均是python写的)

1 def calcShannonEnt(dataSet):
 2     numEntries = len(dataSet)
 3     labelCounts = {}
 4     for featVec in dataSet:
 5         currentLabel = featVec[-1]
 6     if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
 7     labelCounts[currentLabel] += 1
 8     shannonEnt = 0.0
 9     for key in labelCounts:
10         prob = float(labelCounts[key])/numEntries
11     shannonEnt -= prob * log(prob, 2)
12     return shannonEnt

如果了解python,代码还是比较简单的,不过要事先说明一下dataSet是什么样的数据,怎样的数据结构。这就引出了下面的代码,用来生成dataSet,这样你就能更好地了解代码中“currentLabel = featVec[-1]”是怎么回事了。

1 def createDataSet():
2     dataSet = [[1, 1, 'yes'],
3            [1, 1, 'yes'],
4            [1, 0, 'no'],
5            [0, 1, 'no'],
6            [0, 1, 'no']]
7     labels = ['no surfacing', 'flippers']
8     return dataSet, labels

我们所处理的数据是形如dataSet这样的数据集,每个数据是list类型,数据的最后一项是数据的标签。看一下效果:

02111802_R2WY.jpg

熵越高,说明数据的混合度越高,增加数据类别可以观察熵的变化。

接下来做些什么?别忘了初衷:依据第一个特征还是第二个特征划分数据?这个问题的回答就在于哪种特征的划分熵更小一些。我们将对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式。

首先编写一个函数用于按照给定特征划分数据集:

1 def splitDataSet(dataSet, axis, value):
2     retDataSet = []
3     for featVec in dataSet:
4         if featVec[axis] == value:
5         reducedFeatVec = featVec[:axis]
6         reducedFeatVec.extend(featVec[axis+1:])
7         retDataSet.append(reducedFeatVec)
8     return retDataSet

代码中使用了python中自带的两个方法:extend()、append(),这两个方法功能类似,但是在处理多个列表时,这两个方法是完全不同的,这个大家就自行百度一下。代码比较好理解,一下子没有理解也没事,慢慢来,先看看运行的效果,感性认识一下吧:

02111802_ZQ63.jpg

最后一个函数就是用于对每个特征划分数据集的结果计算一次信息熵,然后判断按照哪个特征划分数据集是最好的划分方式:

1 def chooseBestFeatureToSplit(dataSet):
 2     numFeatures  = len(dataSet[0]) - 1
 3     baseEntropy  = calcShannonEnt(dataSet)
 4     bestInfoGain = 0.0; bestFeature = -1
 5     for i in range(numFeatures):
 6         featList   = [example[i] for example in dataSet]
 7         uniqueVals = set(featList)
 8         newEntropy = 0.0
 9         for value in uniqueVals:
10             subDataSet  = splitDataSet(dataSet, i, value)
11             prob        = len(subDataSet) / float(len(dataSet))
12             newEntropy += prob * calcShannonEnt(subDataSet)
13         infoGain = baseEntropy - newEntropy
14         if(infoGain > bestInfoGain):
15         bestInfoGain = infoGain
16             bestFeature  = i
17     return bestFeature

02111802_VsRj.jpg

看得出,按照第一个特征划分获得的是最好的划分,熵最小。

转载于:https://my.oschina.net/Bettyty/blog/754054

相关文章:

  • Knative 核心概念介绍:Build、Serving 和 Eventing 三大核心组件
  • 洛谷P2676 超级书架
  • 讲清楚分布式系统中的这个算法,帮你从面试候选人中脱颖而出!
  • 我的第一天!
  • JAVA-基础(接口---抽象)
  • 从0开始学习 GITHUB 系列之「GITHUB 常见的几种操作」
  • 【JavaEE企业应用实战学习记录】struts2实现登录并获取各个范围的数据
  • [译] 2019 年了,为什么我还在用 jQuery?
  • RubyGem修改国内源
  • H5移动端页面常见兼容问题及解决方案
  • iOS开发中的内存分配与分区
  • 第一个微信项目
  • web服务
  • 编程思想之多线程与多进程系列
  • aop 简单运用,traceId 简单实现,访问日志拦截,ip黑名单
  • 0x05 Python数据分析,Anaconda八斩刀
  • Docker 笔记(2):Dockerfile
  • Docker入门(二) - Dockerfile
  • Just for fun——迅速写完快速排序
  • LeetCode18.四数之和 JavaScript
  • Sass Day-01
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • Travix是如何部署应用程序到Kubernetes上的
  • 阿里研究院入选中国企业智库系统影响力榜
  • 初识 webpack
  • 记录:CentOS7.2配置LNMP环境记录
  • 聊聊spring cloud的LoadBalancerAutoConfiguration
  • 深入 Nginx 之配置篇
  • 通过几道题目学习二叉搜索树
  • 微信小程序--------语音识别(前端自己也能玩)
  • PostgreSQL之连接数修改
  • 国内开源镜像站点
  • 如何在招聘中考核.NET架构师
  • 小白应该如何快速入门阿里云服务器,新手使用ECS的方法 ...
  • ​flutter 代码混淆
  • ​ssh免密码登录设置及问题总结
  • ​插件化DPI在商用WIFI中的价值
  • ​云纳万物 · 数皆有言|2021 七牛云战略发布会启幕,邀您赴约
  • # 安徽锐锋科技IDMS系统简介
  • #Z2294. 打印树的直径
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (10)Linux冯诺依曼结构操作系统的再次理解
  • (vue)el-checkbox 实现展示区分 label 和 value(展示值与选中获取值需不同)
  • (八十八)VFL语言初步 - 实现布局
  • (六)激光线扫描-三维重建
  • (没学懂,待填坑)【动态规划】数位动态规划
  • (三) prometheus + grafana + alertmanager 配置Redis监控
  • (提供数据集下载)基于大语言模型LangChain与ChatGLM3-6B本地知识库调优:数据集优化、参数调整、Prompt提示词优化实战
  • **CI中自动类加载的用法总结
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET/C# 的字符串暂存池
  • /etc/X11/xorg.conf 文件被误改后进不了图形化界面
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • @vue/cli 3.x+引入jQuery