决策树的概念其实不难理解,下面一张图是某女生相亲时用到的决策树:

基本上可以理解为:一堆数据,附带若干属性,每一条记录最后都有一个分类(见或者不见),然后根据每种属性可以进行划分(比如年龄是>30还是<=30),这样构造出来的一棵树就是我们所谓的决策树了,决策的规则都在节点上,通俗易懂,分类效果好。

那为什么跟节点要用年龄,而不是长相?这里我们在实现决策树的时候采用的是ID3算法,在选择哪个属性作为节点的时候采用信息论原理,所谓的信息增益。信息增益指原有数据集的熵-按某个属性分类后数据集的熵。信息增益越大越好(说明按某个属性分类后比较纯),我们会选择使得信息增益最大的那个属性作为当层节点的标记,再进行递归构造决策树。

首先我们构造数据集:

  1. def createDataSet():
  2. dataSet = [[1,1,'yes'],[1,1,'yes'],[1,0,'no'],[0,1,'no'],[0,1,'no']]
  3. features = ['no surfacing','flippers']
  4. return dataSet,features

构造决策树:(采用python字典来递归构造,一些代码看看就能看懂)

  1. def treeGrowth(dataSet,features):
  2. classList = [example[-1] for example in dataSet]
  3. if classList.count(classList[0])==len(classList):
  4. return classList[0]
  5. if len(dataSet[0])==1:# no more features
  6. return classify(classList)
  7.  
  8. bestFeat = findBestSplit(dataSet)#bestFeat is the index of best feature
  9. bestFeatLabel = features[bestFeat]
  10. myTree = {bestFeatLabel:{}}
  11. featValues = [example[bestFeat] for example in dataSet]
  12. uniqueFeatValues = set(featValues)
  13. del (features[bestFeat])
  14. for values in uniqueFeatValues:
  15. subDataSet = splitDataSet(dataSet,bestFeat,values)
  16. myTree[bestFeatLabel][values] = treeGrowth(subDataSet,features)
  17. return myTree

当没有多余的feature,但是剩下的样本不完全是一样的类别是,采用出现次数多的那个类别:

  1. def classify(classList):
  2. '''
  3. find the most in the set
  4. '''
  5. classCount = {}
  6. for vote in classList:
  7. if vote not in classCount.keys():
  8. classCount[vote] = 0
  9. classCount[vote] += 1
  10. sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True)
  11. return sortedClassCount[0][0]

寻找用于分裂的最佳属性:(遍历所有属性,算信息增益)

  1. def findBestSplit(dataset):
  2. numFeatures = len(dataset[0])-1
  3. baseEntropy = calcShannonEnt(dataset)
  4. bestInfoGain = 0.0
  5. bestFeat = -1
  6. for i in range(numFeatures):
  7. featValues = [example[i] for example in dataset]
  8. uniqueFeatValues = set(featValues)
  9. newEntropy = 0.0
  10. for val in uniqueFeatValues:
  11. subDataSet = splitDataSet(dataset,i,val)
  12. prob = len(subDataSet)/float(len(dataset))
  13. newEntropy += prob*calcShannonEnt(subDataSet)
  14. if(baseEntropy - newEntropy)>bestInfoGain:
  15. bestInfoGain = baseEntropy - newEntropy
  16. bestFeat = i
  17. return bestFeat

选择完分裂属性后,就行数据集的分裂:

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

计算数据集的熵:

  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():
  7. labelCounts[currentLabel] = 0
  8. labelCounts[currentLabel] += 1
  9. shannonEnt = 0.0
  10.  
  11. for key in labelCounts:
  12. prob = float(labelCounts[key])/numEntries
  13. if prob != 0:
  14. shannonEnt -= prob*log(prob,2)
  15. return shannonEnt

下面根据上面构造的决策树进行数据的分类:

  1. def predict(tree,newObject):
  2. while isinstance(tree,dict):
  3. key = tree.keys()[0]
  4. tree = tree[key][newObject[key]]
  5. return tree
  6.  
  7. if __name__ == '__main__':
  8. dataset,features = createDataSet()
  9. tree = treeGrowth(dataset,features)
  10. print tree
  11. print predict(tree,{'no surfacing':1,'flippers':1})
  12. print predict(tree,{'no surfacing':1,'flippers':0})
  13. print predict(tree,{'no surfacing':0,'flippers':1})
  14. print predict(tree,{'no surfacing':0,'flippers':0})

结果如下:

决策树是这样的:

{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

四个预测:

yes
no
no
no

和给定的数据集分类一样(预测的数据是从给定数据集里面抽取的,当然一般数据多的话,会拿一部分做训练数据,剩余的做测试数据)

归纳一下ID3的优缺点:

优点:实现比较简单,产生的规则如果用图表示出来的话,清晰易懂,分类效果好

缺点:只能处理属性值离散的情况(连续的用C4.5),在选择最佳分离属性的时候容易选择那些属性值多的一些属性。

决策树之ID3算法实现(python)的更多相关文章

  1. 机器学习之决策树(ID3)算法与Python实现

    机器学习之决策树(ID3)算法与Python实现 机器学习中,决策树是一个预测模型:他代表的是对象属性与对象值之间的一种映射关系.树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每 ...

  2. 【Machine Learning】决策树之ID3算法 (2)

    决策树之ID3算法 Content 1.ID3概念 2.信息熵 3.信息增益 Information Gain 4. ID3 bias 5. Python算法实现(待定) 一.ID3概念 ID3算法最 ...

  3. 决策树之ID3算法

    一.决策树之ID3算法简述 1976年-1986年,J.R.Quinlan给出ID3算法原型并进行了总结,确定了决策树学习的理论.这可以看做是决策树算法的起点.1993,Quinlan将ID3算法改进 ...

  4. 机器学习笔记----- ID3算法的python实战

    本文申明:本文原创,如有转载请申明.数据代码来自实验数据都是来自[美]Peter Harrington 写的<Machine Learning in Action>这本书,侵删. Hell ...

  5. 鹅厂优文 | 决策树及ID3算法学习

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~. 作者:袁明凯|腾讯IEG测试开发工程师 决策树的基础概念 决策树是一种用树形结构来辅助行为研究.决策分析以及机器学习的方式,是机器学习中的 ...

  6. 【Machine Learning·机器学习】决策树之ID3算法(Iterative Dichotomiser 3)

    目录 1.什么是决策树 2.如何构造一棵决策树? 2.1.基本方法 2.2.评价标准是什么/如何量化评价一个特征的好坏? 2.3.信息熵.信息增益的计算 2.4.决策树构建方法 3.算法总结 @ 1. ...

  7. 简单易学的机器学习算法——决策树之ID3算法

    一.决策树分类算法概述     决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类.例如对于如下数据集 (数据集) 其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是 ...

  8. 机器学习-决策树之ID3算法

    概述 决策树(Decision Tree)是一种非参数的有监督学习方法,它是一种树形结构,所以叫决策树.它能够从一系列有特征和标签的数据中总结出决策规则,并用树状图的结构来呈现这些规则,以解决分类和回 ...

  9. [置顶] ID3算法的python实现

    这篇文章的内容接着http://blog.csdn.net/xueyunf/article/details/9214727的内容,所有还有部分函数在http://blog.csdn.net/xueyu ...

随机推荐

  1. QListWidget方式显示缩略图

    最近在工作中经常遇到了一个问题就是把把文件夹中的图片全部以缩略图的形式显示出来,刚开始的时候一头雾水,不知道怎么办,经过在网上查资料,发现QListWidget控件可以实现图片的缩略图显示,但是不知道 ...

  2. ipython with ubuntu

    在Linux环境下,其实IDE环境配置比较容易配.所以建议用linux做开发. 首选启动终端:Ctrl+Alt+T sudo apt-get update sudo apt-get install p ...

  3. Cocos2d-x学习笔记(3)

    Cocos2d-x有一个包括全部其它头文件的cocos2d.h,仅仅要在使用时包括这个头文件,就能够使用引擎的全部功能.Cocos2d-x的类都放置于cocos2d的命名空间下,如引擎下的" ...

  4. AVR32开发环境搭建

    下面是搭建AVR32开发环境的过程记录: 1.AVR32的编译环境下载  (到这里下载  as5installer-stable-5.1.208-full.exe) 如果你在安装的过程中碰到如下问题: ...

  5. [转] unix/linux下线程私有数据实现原理及使用方法

     在维护每个线程的私有数据的时候,我们可能会想到分配一个保存线程数据的数组,用线程的ID作为数组的索引来实现访问,但是有一个问题是系统生成的线程 ID不能保证是一个小而连续的整数,并且用数组实现的时候 ...

  6. JavaScripts学习日记——BOM

    IE 3.0 和 Netscape Navigator 3.0 提供了一种特性 - BOM(浏览器对象模型),可以对浏览器窗口进行访问和操作.使用 BOM,开发者可以移动窗口.改变状态栏中的文本以及执 ...

  7. My way on Linux - 知识梳理计划

    知识梳理计划图 近期计划把自己学习的工作中用到的Linux知识梳理下,敬请期待.

  8. js 闭包和回调

    原文:http://www.cnblogs.com/yuyuj/p/4525530.html 之前的工作都是基于老大搭建的框架,仿照他写的例子写的请求,很多东东也都做好了封装,只需要了解下直接调用就好 ...

  9. MVC4过滤器(转)

    先来看看一个例子演示过滤器有什么用: public class AdminController : Controller { // ... instance variables and constru ...

  10. C# 获取远程xml文件

    /// <summary> /// 加载远程XML文档 /// </summary> /// <param name="URL"></pa ...