当前位置: 首页 > 编程日记 > 正文

机器学习算法(3:决策树算法)

一、决策树简介


决策树是附加概率结果的一个树状的决策图,是直观的运用统计概率分析的图法。机器学习中决策树是一个预测模型,它表示对象属性和对象值之间的一种映射,一颗决策树是一棵有向无环树,它由若干个节点、分支、分裂谓词以及类别组成。树中的每一个节点表示对象属性的判断条件,其分支表示符合节点条件的对象。树的叶子节点表示对象所属的预测结果。  

二、决策树的引导

下面是一段记者采访银行经理的对话(对话内容纯属虚构)
记者:向你们银行可以直接申请贷款要什么条件吗?
经理:只要年龄在30~50都可一申请到一定额度的贷款。
记者:那如果年龄超过50岁呢?
经理:那也没关系,只要办理我们银行的vip,也是可以申请贷款的。
记者:那如果年龄少于30岁的人该怎么办?
经理:那就看他是否有固定的收入。
记者:感谢与您的对话。

  
通过简单的对话我们构造了一个简单的决策树,如图所示,没有父亲节点的节点称为根节点,如图节点1。没有子节点的节点称为叶子节点,如图的3、5、6、7、8。一个节点按照某个属性分裂时,这个属性被称为分裂属性,如图中的年龄,有无固定收入和vip。同理每个分支都会被标记一个分裂谓词,这些分裂谓词就是分裂分节点的具体依据,例如图中的年龄就有对应三个分裂谓词“<30,[30,50],>50"每一个叶子节点都会被确定一个类标号,这里是”是“和”否“。

根节点:决策树的起源,进行分类的第一个特征属性,只有出边没有入边;
内部节点:进行分类的特征属性,有一条入边,至少有一条出边;
叶节点:分类结束的特征属性,有入边,没有出边;

三、决策树的构造

构造决策树的关键步骤是分裂属性。所谓分裂属性就是在某个节点处按照某一特征属性的不同划分构造不同的分支,其目标是让各个分裂子集尽可能地“纯”。尽可能“纯”就是尽量让一个分裂子集中待分类项属于同一类别。这里就要介绍一种判别属性优先分裂的方法---ID3算法
在ID3算法中,特征属性的选择是由目标函数决定的,目标函数代表的是特征属性的混乱程度(也就是特征属性越混乱越不好分类,该特征属性的分类顺序越靠后),这个目标函数就是信息增益,信息增益是由熵计算出来的,在信息论中,期望信息越小,那么信息增益就越大,从而纯度就越高。具体细节看下面的介绍;

四、信息论基础

(1)它度量了事物的不确定性,其值越大就越不确定,假如一个随机变量的取值为,每一种取到的概率分别是,那么 的熵定义为
       意思是一个变量的变化情况可能越多,那么它携带的信息量就越大。
(2)条件熵:条件熵的表达式H(X|Y),它度量了我们的X在知道Y以后剩下的不确定性,其表达式如下


(3)信息增益:信息增益是特征选择中的一个重要指标,它定义为一个特征能够为分类系统带来多少信息,带来的信息越多,该特征越重要,其值为H(X) - H(X|Y)。

总结:在决策树的每一个非叶子结点划分之前,先计算每一个属性所带来的信息增益,选择最大信息增益的属性来划分,因为信息增益越大,区分样本的能力就越强,越具有代表性,很显然这是一种自顶向下的贪心策略,以上 就是ID3算法的核心思想。


五、python代码实现说明

  • 在给定的数据中,我们先选出信息增益最大的那个属性来作为根节点;
  • 若样本都在同一类,则为叶子点;
  • 将以作为节点的数据删除,再次寻找信息增益最大的那个属性进行分裂,不断递归;
  • 递归结束标记为如下:
  1. 所有属性都用完,若所用属性都用完后还未分类完,则依照少数服从多数来看;
  2. 某一属性的分类结果都一致;
六、python代码实现

from math import log
import operator
dataSet = [[1,1,0,'fight'],[1,0,1,'fight'],[1,0,1,'fight'],[1,0,1,'fight'],[0,0,1,'run'],[0,1,0,'fight'],[0,1,1,'run']]                         #需处理的数据
labels = ['weapon','bullet','blood']          #对应的标签
def calcShannonEnt(dataSet):numEntries = len(dataSet)lableCounts = {}for featVec in dataSet:currentLable = featVec[-1]         #取数据中各元素的最后一项:类别if currentLable not in lableCounts.keys():lableCounts[currentLable] = 0lableCounts[currentLable] += 1      #给类别计数shannonEnt = 0for key in lableCounts:prob = float(lableCounts[key])/numEntriesshannonEnt -= prob * log(prob,2)          #计算熵的值return shannonEnt                            #返回熵的值
def splitDataSet(dataSet,axis,value):retDataSet = []                                    #创建新列表retDataSet for featVec in dataSet:if featVec[axis] == value:reducedFeatVec = featVec[:axis]reducedFeatVec.extend(featVec[axis+1:])retDataSet.append(reducedFeatVec)return retDataSet
def chooseBestFeatureToSplit(dataSet):numFeatures = len(dataSet[0]) - 1         #减去最后一项(类别)baseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0bestFeature = -1for i in range(numFeatures):featList = [example[i] for example in dataSet]uniqueVals = set(featList)newEntropy = 0.0for value in uniqueVals:subDataSet = splitDataSet(dataSet, i, value)              #调用splitDataSet函数prob = len(subDataSet) / float(len(dataSet))newEntropy += prob * calcShannonEnt(subDataSet)         #计算条件熵的值infoGain = baseEntropy -newEntropy            #计算信息增益的值if infoGain > bestInfoGain:bestInfoGain = infoGainbestFeature = i                  #比较信息增益return bestFeature                  #返回信息增益最大的位置
'''因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,
但是分类还是没有算完,这时候就会采用多数表决的方式计算节点分类'''
def majorityCnt(classList):classCount = {}for vote in classList:if vote not in classCount.keys():classCount[vote] = 0classCount[vote] += 1return max(classCount)                   #返回多数表决后的结果
def createTree(dataSet, labels):classList = [example[-1] for example in dataSet]if classList.count(classList[0]) ==len(classList):return classList[0]                         #所有类别都相同则停止划分,直接返回该类别if len(dataSet[0]) == 1:                    #所有特征已经用完return majorityCnt(classList)          #返回多数表决后的结果bestFeat = chooseBestFeatureToSplit(dataSet)              #调用chooseBestFeatureToSplit函数bestFeatLabel = labels[bestFeat]myTree = {bestFeatLabel:{}}del(labels[bestFeat])                             #删除信息增益最大的位置对应的标签featValues = [example[bestFeat] for example in dataSet]uniqueVals = set(featValues)for value in uniqueVals:subLabels = labels[:]             #为了不改变原始列表的内容复制了一下myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value),subLabels)return myTree
myTree = createTree(dataSet,labels)
print myTree
结果为:
{'weapon': {0: {'blood': {0: 'fight', 1: 'run'}}, 1: 'fight'}}

七、ID3算法的缺点
  1. ID3算法往往偏向于选择取值较多的属性,而在很多情况下取值较多的属性并不总是最重要的属性;
  2. ID3算法不能处理具有连续值的属性,也不能处理具有缺失数据的属性;
  3. ID3算法虽然理论清晰,但计算比较复杂,在学习和训练数据集的过程中机器内存占用率比较大,耗费资源;
  4. 在建造决策树时,每个结点仅含一个属性,是一种单变元的算法,致使生成的决策树结点之间的相关性不够强,虽然在一棵树上连在一起,但联系还是松散的;


转载于:https://www.cnblogs.com/longwhite/p/10397792.html

相关文章:

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(三):建造者模式

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

Junit单元测试需要知道的一些知识点

Junit单元测试框架—基于java语言对的主流单元测试框架 beforeClass—位于数据准备前期或者其他前期准备&#xff08;测试类调用前&#xff09; --用于提取代码中的共用部分减少冗余&#xff0c;只能声明注解一次 --必须在public static void,方法名随意&#xff0c;&#x…

关闭Windows 2000/XP/2003默认共享

Windows 2000/XP/2003版本的操作系统提供了默认共享功能&#xff0c;这些默认的共享都有“$”标志&#xff0c;意为隐含的&#xff0c;包括所有的逻辑盘&#xff08;C$&#xff0c;D$&#xff0c;E$……&#xff09;和系统目录Winnt或Windows&#xff08;admin$&#xff09;。 …

MySQL 代码结构与基本流程

一、MySQL基本架构二、MySQL目录结构build: 内含有各个平台、各种编译器下进行编译的脚本。如compile-pentium-debug表示在pentium架构上进行调试编译的脚本。client: 客户端工具&#xff0c;如mysql,mysqladmin之类。cmd-line-utils: readline,libedit工具。config: 给aclocal…

【怎样写代码】复杂对象的组装与创建 -- 建造者模式(五):关于Director的进一步讨论

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

如何进行app的兼容性测试?需要考虑哪些方面?

考虑的方面&#xff1a; 1. 系统 a. Android 1). 官方版:官方发型的版本 数据来源&#xff1a;https://mta.qq.com/mta/data/device/os 2). 定制版&#xff1a;华为、魅族、小米、三星。 (前三&#xff1a;华为、oppo、vivo) 数据来源&#xff1a;https://mta.qq.com/mta…

.NET Framework 4.0的新特性

本文将揭示.NET 4.0中的3个新特性&#xff1a;图表控件、SEO支持以及ASP.NET 4可扩展的输出缓存。 图表控件 微软向开发者提供了大量可免费下载的图表控件&#xff0c;可以在.NET 3.5 ASP.NET或WinForms项目中使用这些控件。要想在Visual Studio 2008中使用这些控件则需要安装一…

【怎样写代码】确保对象的唯一性 -- 单例模式(一):问题案例

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

《Kinect应用开发实战:用最自然的方式与机器对话》一3.4 深度图像成像原理...

3.4 深度图像成像原理 Kinect有发射、捕捉、计算视觉重现的类似过程。严格说来&#xff0c;Kinect的“深度眼睛”是由一个红外投影机和红外摄像头组合而成的&#xff0c;投影和接收互为重叠&#xff0c;如图3-27所示。 可以说&#xff0c;Kinect的成功也在于其能廉价而有效地捕…

UI设计不够高端?这5个小技巧可以试试

UI培训设计是对软件的人机交互、操作逻辑、界面美观度的整体设计。好的UI设计不仅要让软件变得漂亮舒适&#xff0c;还要充分考虑到用户的操作问题。 从事UI设计的朋友们&#xff0c;肯定知道我们在做UI设计时&#xff0c;其实是可以通过一些小技巧来帮我们设计的界面更加的漂…

Apache学习路线

参考资料&#xff1a; 1、《Apache源代码全景分析》 2、《鸟哥服务器架设篇》 一、不同的开发人员应该关注的知识点 Apache管理员 配置文件、配置指令 模块开发人员 全部内容 服务器开发人员 MPM并发处理框架 普通人员 …

大火的Apache Spark也有诸多不完美

现在如果你想要选择一个解决方案来处理企业中的大数据并不是难事&#xff0c;毕竟有很多数据处理框架可以任君选择&#xff0c;如Apache Samza&#xff0c;Apache Storm 、Apache Spark等等。Apache Spark应该是2016年风头最劲的数据处理框架&#xff0c;它在数据的批处理和实时…

【怎样写代码】确保对象的唯一性 -- 单例模式(二):解决方案

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

零基础如何学习java技术?

想要学习java技术&#xff0c;担心自己是零基础学不会?最近有很多同学会问到这样的问题&#xff0c;千锋教育小编告诉你&#xff0c;零基础是可以学习java技术的&#xff0c;但是要去正规的java培训机构学习&#xff0c;下面来看看详细的介绍。 零基础如何学习java技术?我们…

Rank() over()的用法

Rank() over()的用法 创建一个test表&#xff0c;并插入6条数据。CREATE TABLE test (a INT,b INT,c CHAR ) INSERT INTO test VALUES(1,3,E) INSERT INTO test VALUES(2,4,A) INSERT INTO test VALUES(3,2,D) INSERT INTO test VALUES(3,5,B) INSERT INTO test VALUES(4,2,C) …

5G将成开启物联网时代的金钥匙

物联网其实并非新鲜事物&#xff0c;在互联网兴起之初&#xff0c;就有人提出了万物皆可通过网络互联&#xff0c;这被认为是物联网最早的定义。其实早在1995年比尔盖茨在其书《未来之路》也提到了物联网&#xff0c;当初并未引起重视。如今&#xff0c;随着互联网与先进通信技…

【怎样写代码】确保对象的唯一性 -- 单例模式(三):单例模式

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

学习Python有什么优势?

学习Python的人越来越多&#xff0c;很多人就想知道&#xff0c;编程语言有那么多种&#xff0c;学习Python有什么优势?为什么这么多人会选择学习Python技术?今天我们就来聊一聊Python语言。 学习Python有什么优势? 入手快。Python语言相对于其他编程语言来说&am…

取消水晶报表的数据库登录框 分享

这两天在和斌做后台中的报表&#xff0c;暂定使用水晶报表&#xff0c;目前还只是处于对水晶报表的初级应用阶段&#xff0c;也就是知道如何 汇个总、写个函数、传个参数。 问题总是层出不穷&#xff0c;在最后整合报表&#xff0c;进行报表显示测试的时候&#xff0c;发现每次…

有光照就能上网 0.2秒即可下载一部高清电影

再也不用费尽心思询问 WIFI 密码了&#xff0c;以后&#xff0c;哪里有光照&#xff0c;哪里就可以上网。中国“可见光通信系统关键技术研究”近日取得重大突破&#xff0c;实时通信速率提升至 50Gbps&#xff0c;也就是说&#xff1a; 0.2 秒即可完成一部高清电影的下载。 有光…

【怎样写代码】确保对象的唯一性 -- 单例模式(四):饿汉式单例类与懒汉式单例类的讨论

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

学Java需要学哪些书?

java技术所要学到的东西是很多的&#xff0c;只要入了这一行&#xff0c;学习是不能停止的&#xff0c;工作节奏在加快&#xff0c;新知识也源源不断&#xff0c;学习的最好途径就是看书&#xff0c;小编给大家推荐这几本java方面的书&#xff0c;搭配学习课程&#xff0c;让学…

【怎样写代码】确保对象的唯一性 -- 单例模式(五):一种更好的单例实现方法(静态内部类)

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

郭为:大数据时代的企业管理挑战

互联网时代&#xff0c;创新使得财富积累的速度前所未有的快&#xff0c;贫富不均也前所未有地分化。这个时代&#xff0c;世界的竞争变成人与人的竞争&#xff0c;人与人的竞争就是智慧的竞争&#xff0c;就是人的创新能力的竞争。如何才能提高人的竞争力&#xff0c;是管理科…

如何挑选靠谱的Java培训机构

想要学习java技术的人越来越多&#xff0c;市面上出现的java培训机构也越来越多&#xff0c;很多人都想找一个靠谱的java培训机构&#xff0c;那么到底该如何挑选靠谱的Java培训机构呢?看看下面小编为大家做的详细介绍吧。 如何挑选靠谱的Java培训机构? 首先挑选java培训机…

ActiveMQ在C#中的应用

ActiveMQ是个好东东&#xff0c;不必多说。ActiveMQ提供多种语言支持&#xff0c;如Java, C, C, C#, Ruby, Perl, Python, PHP等。由于我在windows下开发GUI&#xff0c;比较关心C和C#&#xff0c;其中C#的ActiveMQ很简单&#xff0c;Apache提供NMS&#xff08;.Net Messaging …

数据中心防雷SPD技术漫谈

雷电是大自然里一种普遍现象&#xff0c;在世界的任意角落都会有雷电天气出现&#xff0c;只不过数量不同而已。雷电对大地及地面物体的放电现象成为雷击&#xff0c;这种放电过程会产生强烈的闪电并伴随巨大的声音&#xff0c;对被击物体有严重的危害&#xff0c;会在物体的两…

【怎样写代码】确保对象的唯一性 -- 单例模式(六):扩展案例

如果喜欢这里的内容&#xff0c;你能够给我最大的帮助就是转发&#xff0c;告诉你的朋友&#xff0c;鼓励他们一起来学习。 If you like the content here, you can give me the greatest help is forwarding, tell your friends, encourage them to learn together.

Python数据分析可以应用到哪些领域

随着大数据的应用越来越广泛&#xff0c;应用的行业也越来越多&#xff0c;我们每天都可以看到一些关于数据分析的新鲜应用&#xff0c;从而帮助人们获取到有价值的信息。例如&#xff0c;网购时经常发现电商平台向我们推荐商品&#xff0c;往往这类商品都是我们最近浏览的&…

printf(%d, -10u); 这个输出什么呀, 0或1?

printf("%d", -1<0u); 这个输出什么呀, 0或1?周银辉 既然我这么问了, 那么答案自然不是1&#xff0c;而是0看看下面的代码: 对于-10u输出为-1&#xff0c;似乎理所当然&#xff0c;但为什么-1<0u却输出0呢&#xff0c;也就是说-1不小于0u&#xff0c;好神奇啊…