决策树之信息与熵的计算

一、引言

之前提到的k-近邻算法是分类数据最简单最有效的算法。k-近邻算法是基于实例的学习,使用算法时我们必须有接近实际数据的训练样本数据。而且,k-近邻数据必须保全全部数据集,如果训练数据集的很大,必须使用大量的存储空间,此外k-近邻算法必须对数据集中的每个数据计算距离,这是非常耗时的。另外,对于数据的基础结构信息,它也是无能为力的。

另一种分类算法就是“决策树算法”。对待一个数据,决策树使用多个决策判断确定最终的分类,举个小例子说明一下:给定一个动物,判断什么动物的分类,首先“它是哺乳类动物吗?”,如果不是,“它是陆地动物吗?”,如果不是,“是空中动物吗?”……以此类推,最终判断动物的分类,确定动物。

二、信息与熵

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

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

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

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

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

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

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

下面举一个例子来应用一下以上的公式,并且把公式应用到实际的例子上。

三、一个简单的例子

下表包含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类型,数据的最后一项是数据的标签。看一下效果:

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

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

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

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(),这两个方法功能类似,但是在处理多个列表时,这两个方法是完全不同的,这个大家就自行百度一下。代码比较好理解,一下子没有理解也没事,慢慢来,先看看运行的效果,感性认识一下吧:

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

 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    

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

时间: 2024-10-06 20:27:05

决策树之信息与熵的计算的相关文章

【信息论】如何彻底理解信息和熵?

目录 信息和熵 定义熵和信息 消除熵? 假信息? 概率 VS 熵? 信息的度量和熵的计算 信息和熵 ? 飞翔的猪o 说明:本文是作者在看了weixin公众号[超智能体]录制的学习视频后的总结,有需要请移步公众号[超智能体],利益无关,良心推荐.大多数教材都将信息和熵混为一谈,统称为信息熵,这其实是不恰当的,因而有了这篇文章的诞生. 定义熵和信息 定义熵之前,首先说明什么是宏观态和微观态. 具体的一件事情为宏观态,而这件事情有多种可能情况发生,每种可能情况叫微观态. 比如:抛掷硬币这件事,称作宏观

利用决策树进行数据挖掘中的信息熵计算_爱学术——免费下载

[摘要]介绍了怎样通过信息量或熵的比较来构造一个决策树的数据挖掘算法,并且就一些特殊的地方进行了讨论分析,例如怎样处理高分枝属性.数值属性和缺失数据以及怎样剪枝.利用模型系统的一些源代码来具体地实现算法中的一些模块,并且描述了国内外的有关数据挖掘的研究情况. [作者] 张维东  张凯  董青  孙维华 转载至爱学术:https://www.ixueshu.com/document/2a94229d5bfab36a318947a18e7f9386.html 原文地址:https://www.cnb

影响信息传播的可计算因素分析

网络的连通性 网络的连通性对信息传播(传播速度.扩散规模)有较大影响. 度相关性:一条边连接的两个节点度值之间的相关性(一般使用度值的Pearson相关系数来刻画) 度大节点趋于和度大节点相连,则该网络为同配的 度大节点趋于和度小节点相连,则该网络为异配的 对于无标度网络,网络中的度相关性会影响谣言扩散的阈值和最终的扩散规模,增加网络的度相关性可以

一条SQL搞定信息增益的计算

欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 周东谕,2011年加入腾讯,现任职于腾讯互娱运营部数据中心,主要从事游戏相关的数据分析和挖掘工作. 信息增益原理介绍 介绍信息增益之前,首先需要介绍一下熵的概念,这是一个物理学概念,表示"一个系统的混乱程度".系统的不确定性越高,熵就越大.假设集合中的变量X={x1,x2-xn},它对应在集合的概率分别是P={p1,p2-pn}.那么这个集合的熵表示为: 举一个的例子:对游戏活跃用户进行分层,分为

机器学习算法原理解析——分类

1. KNN分类算法原理及应用 1.1 KNN概述 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. KNN算法的指导思想是“近朱者赤,近墨者黑”,由你的邻居来推断你的类型. 本质上,KNN算法就是用距离来衡量样本之间的相似度. 1.2 算法图示 从训练集中找到和新数据最接近的k条记录,然后根据多数类来决定新数据类别 算法涉及3个主要因素 1) 训练数据集 2) 距离或相似度的计算衡量 3) k的大小 算法描述 1) 已知两类“先验”数据,分别是蓝方块和红

转:机器学习算法原理解析 - 分类

转:http://www.cnblogs.com/swordfall/p/9517988.html 常见分类模型与算法 距离判别法,即最近邻算法KNN: 贝叶斯分类器: 线性判别法,即逻辑回归算法: 决策树: 支持向量机: 神经网络: 1. KNN分类算法原理及应用 1.1 KNN概述 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法. KNN算法的指导思想是"近朱者赤,近墨者黑",由你的邻居来推断你的类型. 本质上,KNN算法就是用距离来衡量样本

[机器学习]信息&熵&信息增益

关于对信息.熵.信息增益是信息论里的概念,是对数据处理的量化,这几个概念主要是在决策树里用到的概念,因为在利用特征来分类的时候会对特征选取顺序的选择,这几个概念比较抽象,我也花了好长时间去理解(自己认为的理解),废话不多说,接下来开始对这几个概念解释,防止自己忘记的同时,望对其他人有个借鉴的作用,如有错误还请指出. 1.信息 这个是熵和信息增益的基础概念,我觉得对于这个概念的理解更应该把他认为是一用名称,就比如‘鸡‘(加引号意思是说这个是名称)是用来修饰鸡(没加引号是说存在的动物即鸡),‘狗’是

[梁山好汉说IT] 熵的概念 & 决策树ID3如何选择子树

记录对概念的理解,用梁山好汉做例子来检验是否理解正确. 1. 事物的信息和信息熵 a. 事物的信息(信息量越大确定性越大): 信息会改变你对事物的未知度和好奇心.信息量越大,你对事物越了解,进而你对事物的好奇心也会降低,因为你对事物的确定性越高.如果你确定一件事件的发生概率是100%,你认为这件事情的信息量为0——可不是吗,既然都确定了,就没有信息量了:相反,如果你不确定这件事,你需要通过各种方式去了解,就说明这件事是有意义的,是有信息量的. b. 信息熵:为了抽象上述模型,聪明的香农总结出了信

决策树系列(四)——C4.5

预备知识:决策树.ID3 如上一篇文章所述,ID3方法主要有几个缺点:一是采用信息增益进行数据分裂,准确性不如信息增益率:二是不能对连续数据进行处理,只能通过连续数据离散化进行处理:三是没有采用剪枝的策略,决策树的结构可能会过于复杂,可能会出现过拟合的情况. C4.5在ID3的基础上对上述三个方面进行了相应的改进: a)  C4.5对节点进行分裂时采用信息增益率作为分裂的依据: b)  能够对连续数据进行处理: c)  C4.5采用剪枝的策略,对完全生长的决策树进行剪枝处理,一定程度上降低过拟合