一  ID3算法的大致思想

基本的ID3算法是通过自顶向下构造决策树来进行学习的。我们首先思考的是树的构造从哪里开始,这就涉及到选择属性进行树的构造了,那么怎样选择属性呢?为了解决这个问题,我们使用统计测试来确定每一个实例属性单独分类训练样例的能力,把分类能力最好的属性作为树根节点的测试。然后为根节点属性的每个可能值产生一个分支,并把训练样例排列到适当的分支之下。然后重复整个过程,用每个分支节点关联的训练样例来选取在该点被测试的最佳属性。这形成了对合格决策树的贪婪搜索,也就是算法从不回溯重新考虑以前的选择。

下面是ID3算法进行二分类的流程

从图中我们可以看出决策树的构造是一个递归的过程

二  熵(entropy)和信息增益(information gain)

ID3算法的核心问题是选取在树的每个结点要测试的属性,这里我们用属性的信息增益来衡量属性对训练样例的区分能力,属性的信息增益越大,表示区分能力越强。ID3算法在增长树的每一步使用信息增益标准从候选属性中选择属性。

首先在这里说一下 熵的概念,在信息论中广泛使用的一个度量标准,称为熵,它刻画了任意样例集的纯度。

给定包含关于某个目标概念的正反样例的样例集S,那么S相对这个布尔型分类的熵为:
Entropy(S) ≡-p⊕log2p⊕-pΘlog2pΘ

其中p⊕是S中正例的比例,pΘ是在S中反例的比例。如果S的所有成员属于同一类,辣么S的熵为0,当集合中正反样例的数量相等时熵为1,其他情况介于0和1之间。

上面是关于目标分类为bool类型下的熵,更一般的,如果目标属性具有c个不同的值,那么S相对于c个状态的分类的熵定义为:

其中pi 是S中属于类别i的比例。

用信息增益度量期望的熵降低

有了熵作为衡量训练样例集合纯度的标准,现在可以定义属性分类数据的效力的度量标准。这个标准被称为信息增益。简单的说,一个属性的信息增益就是由于使用这个属性分割样例而导致的期望熵降低。更精确地说,一个属性A相对样例集合S的信息增益Gain(S,A)被定义为:

其中Values(A)是属性A所有可能值的集合,Sv是属性A的值为v的子集。等式的第一项就是原来集合S的熵,第二项是用A分类S后熵的期望值。这个第二项描述的期望熵就是每个子集的熵的加权和,权值为属于Sv的样例占原始样例S的比例,所以Gain(S,A)是由于知道属性A的值而导致的期望熵减少。

三 使用python实现一个简单的决策树的生成

1. 计算数据集的香农熵

 """
Created on Sat May 14 13:58:26 2016 @author: MyHome
"""
'''计算给定数据集的香农熵''' from math import log def calcShannonEnt(dataSet):
numEntries = len(dataSet)
labelCounts = {}
for featVec in dataSet:
currentLabel = featVec[-1]
labelCounts[currentLabel] = labelCounts.get(currentLabel,0) + 1
shannonEnt = 0.0
for key in labelCounts:
pro = float(labelCounts[key])/numEntries
shannonEnt = -pro * log(pro,2) return shannonEnt

2.创建数据

 def createDataSet():

     dataSet = [['Sunny','Hot','High','Weak','No'],['Sunny','Hot','High','Strong','No'],\
['Overcast','Hot','High','Weak','Yes'],['Rain','Mild','High','Weak','Yes'],\
['Rain','Cool','Normal','Weak','Yes'],['Rain','Cool','Normal','Strong','No'],\
['Overcast','Cool','Normal','Strong','Yes'],['Sunny','Mild','High','Weak','No'],\
['Sunny','Cool','Normal','Weak','Yes'],['Rain','Mild','Normal','Weak','Yes'],\
['Sunny','Mild','Normal','Strong','Yes'],['Overcast','Mild','High','Strong','Yes'],\
['Overcast','Hot','Normal','Weak','Yes'],['Rain','Mild','High','Strong','No']] labels = ['Outlook','Temperature','Humidity','Wind']
return dataSet,labels

3.按照给定的特征划分数据集(根据某一属性的属性值对数据集进行划分)

 def splitDataSet(dataSet,axis,value):
retDataSet = []
for featVec in dataSet:
if featVec[axis] == value:
reducedFeatVec = featVec[:axis]
reducedFeatVec.extend(featVec[axis + 1 :])
retDataSet.append(reducedFeatVec) return retDataSet

4.计算数据集中各属性的信息增益,选出当前最佳分类属性

 def chooseBestFeatureToSplit(dataSet):
numFeatures = len(dataSet[0]) - 1
baseEntropy = calcShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeature = -1
for i in range(numFeatures):
featList = [example[i] for example in dataSet]
uniqueVals = set(featList)
newEntropy = 0.0
for value in uniqueVals:
subDataSet = splitDataSet(dataSet,i,value)
prob = len(subDataSet)/float(len(dataSet))
newEntropy += prob *calcShannonEnt(subDataSet)
infoGain = baseEntropy - newEntropy
if (infoGain >bestInfoGain):
bestInfoGain = infoGain
bestFeature = i
return bestFeature

5.如果数据集已经处理了所有属性,但是类标签依然不是唯一的,此时我们需要决定如何定义该叶子节点,在这种情况下,我们通常会采用多数表决的方法决定该叶子节点的分类

 def majorityCnt(classList):
classCount = {}
for vote in classList:
if vote not in classCount.keys():
classCount[vote] = 0
classCount[vote] += 1 sortedClassCount = sorted(classCount.iteritems(),key = operator.itemgetter(1),reverse = True) return sortedClassCount[0][0]

6. 构造树

 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)
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

7.运行结果

 dataSet,labels = createDataSet()

 createTree(dataSet,labels)
Out[10]:
{'Outlook': {'Overcast': 'Yes',
'Rain': {'Wind': {'Strong': 'No', 'Weak': 'Yes'}},
'Sunny': {'Humidity': {'High': 'No', 'Normal': 'Yes'}}}}

根据结果我们可以画出决策树

四 总结

我们通过不断选取当前最佳属性来把数据集进行划分,直到遍历所有属性或每个分支下的所有样例都为同一类为止,这是一个不断递归生成树的过程。

决策树的基本ID3算法的更多相关文章

  1. python数据分析算法(决策树2)CART算法

    CART(Classification And Regression Tree),分类回归树,,决策树可以分为ID3算法,C4.5算法,和CART算法.ID3算法,C4.5算法可以生成二叉树或者多叉树 ...

  2. ID3算法Java实现

    ID3算法java实现 1 ID3算法概述 1.1 信息熵 熵是无序性(或不确定性)的度量指标.假如事件A的全概率划分是(A1,A2,...,An),每部分发生的概率是(p1,p2,...,pn).那 ...

  3. 深入了解机器学习决策树模型——C4.5算法

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第22篇文章,我们继续决策树的话题. 上一篇文章当中介绍了一种最简单构造决策树的方法--ID3算法,也就是每次选择一个特 ...

  4. 决策树ID3算法的java实现(基本试用所有的ID3)

    已知:流感训练数据集,预定义两个类别: 求:用ID3算法建立流感的属性描述决策树 流感训练数据集 No. 头痛 肌肉痛 体温 患流感 1 是(1) 是(1) 正常(0) 否(0) 2 是(1) 是(1 ...

  5. 数据挖掘之决策树ID3算法(C#实现)

    决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...

  6. 决策树 -- ID3算法小结

          ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...

  7. 决策树-预测隐形眼镜类型 (ID3算法,C4.5算法,CART算法,GINI指数,剪枝,随机森林)

    1. 1.问题的引入 2.一个实例 3.基本概念 4.ID3 5.C4.5 6.CART 7.随机森林 2. 我们应该设计什么的算法,使得计算机对贷款申请人员的申请信息自动进行分类,以决定能否贷款? ...

  8. 决策树笔记:使用ID3算法

    决策树笔记:使用ID3算法 决策树笔记:使用ID3算法 机器学习 先说一个偶然的想法:同样的一堆节点构成的二叉树,平衡树和非平衡树的区别,可以认为是"是否按照重要度逐渐降低"的顺序 ...

  9. ID3算法 决策树的生成(2)

    # coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...

随机推荐

  1. php 获取图片主要颜色的方法

    本文章向码农们介绍php 获取图片主要颜色的方法,主要涉及php针对图片的相关操作技巧,需要的码农可以参考一下. $i = imagecreatefromjpeg("image.jpg&qu ...

  2. 动手学servlet(四) cookie和session

    Cookie   cookie是保存在客户端的一个“键值对”,用来存储用户的一些信息 cookie的应用: -在电子商务会话中标识用户 -对网站进行定制,比如你经常浏览哪些内容,就展示哪些页面给你 - ...

  3. Android——ScrollView

    1.activity_scrollview.xml <?xml version="1.0" encoding="utf-8"?><Scroll ...

  4. NHibernate 中使用 nvarchar(max) 类型

    在 NHibernate 中使用字符串类型,默认会映射到字符类型,在 SQLServer 中,NVARCHAR 类型最大长度是 4000 字符,如果超过 4000,比如使用 SQL Server 中的 ...

  5. JavaScript 变量克隆和判断变量类型

    一.变量克隆 在js中经常会遇到将一个变量赋值给一个新的变量这种情况,这对于基本类型很容易去实现,直接通过等号赋值就可以了,对于引用类型就不能这样了.(注:像函数,正则也可以直接通过等号赋值) 这里我 ...

  6. Landsat8免费下载地址

    一.国外 Landsat8提供免费下载,在USGS上有两个网站,下面介绍的这个网站操作比较方便.这里大赞美国的USGS和NASA机构,不但提供免费下载的数据,而且下载网站制作和维护的非常便捷.废话少说 ...

  7. ASP.NET的SEO:目录

    ASP.NET的SEO:基础知识 ASP.NET的SEO:Global.asax和HttpModule中的RewritePath()方法--友好的URL ASP.NET的SEO:正则表达式 ASP.N ...

  8. hdu2571

    if(x==1) f(x,y)=max{f(x,y-1),f(x,z)}  {y%z==0&&1<y/z<=y&&1<=z<<y} els ...

  9. RocketMQ学习记录

    RocketMQ是一款分布式.队列模型的消息中间件,具有以下特点: 1.能够保证严格的消息顺序 2.提供丰富的消息拉取模式 3.高效的订阅者水平扩展能力 4.实时的消息订阅机制 5.亿级消息堆积能力 ...

  10. kickstart简介 20140707

    kickstart是红帽发行版中的一种安装方式,它通过以配置文件的方式来记录linux系统安装是的各项参数和想要安装的软件.只要配置正确, 整个安装过程中无需人工交互参与,达到无人值守安装的目的,因而 ...