基于Python实现的ID3决策树功能示例


Posted in Python onJanuary 02, 2018

本文实例讲述了基于Python实现的ID3决策树功能。分享给大家供大家参考,具体如下:

ID3算法是决策树的一种,它是基于奥卡姆剃刀原理的,即用尽量用较少的东西做更多的事。ID3算法,即Iterative Dichotomiser 3,迭代二叉树3代,是Ross Quinlan发明的一种决策树算法,这个算法的基础就是上面提到的奥卡姆剃刀原理,越是小型的决策树越优于大的决策树,尽管如此,也不总是生成最小的树型结构,而是一个启发式算法。

如下示例是一个判断海洋生物数据是否是鱼类而构建的基于ID3思想的决策树

# coding=utf-8
import operator
from math import log
import time
def createDataSet():
  dataSet = [[1, 1, 'yes'],
        [1, 1, 'yes'],
        [1, 0, 'no'],
        [0, 1, 'no'],
        [0, 1, 'no'],
        [0,0,'maybe']]
  labels = ['no surfaceing', 'flippers']
  return dataSet, labels
# 计算香农熵
def calcShannonEnt(dataSet):
  numEntries = len(dataSet)
  labelCounts = {}
  for feaVec in dataSet:
    currentLabel = feaVec[-1]
    if currentLabel not in labelCounts:
      labelCounts[currentLabel] = 0
    labelCounts[currentLabel] += 1
  shannonEnt = 0.0
  for key in labelCounts:
    prob = float(labelCounts[key]) / numEntries
    shannonEnt -= prob * log(prob, 2)
  return shannonEnt
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
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
# 因为我们递归构建决策树是根据属性的消耗进行计算的,所以可能会存在最后属性用完了,但是分类
# 还是没有算完,这时候就会采用多数表决的方式计算节点分类
def majorityCnt(classList):
  classCount = {}
  for vote in classList:
    if vote not in classCount.keys():
      classCount[vote] = 0
    classCount[vote] += 1
  return 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)
  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
def main():
  data, label = createDataSet()
  t1 = time.clock()
  myTree = createTree(data, label)
  t2 = time.clock()
  print myTree
  print 'execute for ', t2 - t1
if __name__ == '__main__':
  main()

运行结果如下:

{'no surfaceing': {0: {'flippers': {0: 'maybe', 1: 'no'}}, 1: {'flippers': {0: 'no', 1: 'yes'}}}}
execute for 0.0103958394532

最后我们测试一下这个脚本即可,如果想把这个生成的决策树用图像画出来,也只是在需要在脚本里面定义一个plottree的函数即可。

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
Python实现全角半角转换的方法
Aug 18 Python
Python2.x版本中基本的中文编码问题解决
Oct 12 Python
Python+树莓派+YOLO打造一款人工智能照相机
Jan 02 Python
Python获取指定文件夹下的文件名的方法
Feb 06 Python
将TensorFlow的模型网络导出为单个文件的方法
Apr 23 Python
python+pyqt5实现图片批量缩放工具
Mar 18 Python
pytorch中交叉熵损失(nn.CrossEntropyLoss())的计算过程详解
Jan 02 Python
使用Python实现牛顿法求极值
Feb 10 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
浅谈JupyterNotebook导出pdf解决中文的问题
Apr 22 Python
python实现xlwt xlrd 指定条件给excel行添加颜色
Jul 14 Python
Python关于OS文件目录处理的实例分享
May 23 Python
python实现基于SVM手写数字识别功能
May 27 #Python
Python中字典的浅拷贝与深拷贝用法实例分析
Jan 02 #Python
python+matplotlib绘制简单的海豚(顶点和节点的操作)
Jan 02 #Python
Python实现进程同步和通信的方法
Jan 02 #Python
mac系统安装Python3初体验
Jan 02 #Python
Python中static相关知识小结
Jan 02 #Python
python tensorflow基于cnn实现手写数字识别
Jan 01 #Python
You might like
防止MySQL注入或HTML表单滥用的PHP程序
2009/01/21 PHP
关于php 接口问题(php接口主要也就是运用curl,curl函数)
2013/07/01 PHP
四种php中webservice实现的简单架构方法及实例
2015/02/03 PHP
Laravel 5 框架入门(三)
2015/04/09 PHP
PHP实现的DES加密解密类定义与用法示例
2020/11/02 PHP
jquery中选择块并改变属性值的方法
2013/07/31 Javascript
javascript如何实现暂停功能
2015/11/06 Javascript
浅谈javascript中的constructor
2016/06/08 Javascript
javascript运算符——位运算符全面介绍
2016/07/14 Javascript
AngularJS之ionic 框架下实现 Localstorage本地存储
2017/04/22 Javascript
angularjs中的$eval方法详解
2017/04/24 Javascript
vue 组件高级用法实例详解
2018/04/11 Javascript
详解如何制作并发布一个vue的组件的npm包
2018/11/10 Javascript
js对象属性名驼峰式转下划线的实例代码
2020/09/17 Javascript
vue data有值,但是页面{{}} 取不到值的解决
2020/11/09 Javascript
vue中实现点击空白区域关闭弹窗的两种方法
2020/12/30 Vue.js
Python读取ini文件、操作mysql、发送邮件实例
2015/01/01 Python
Python的__builtin__模块中的一些要点知识
2015/05/02 Python
python实现简单ftp客户端的方法
2015/06/28 Python
python3 图片referer防盗链的实现方法
2018/03/12 Python
Python利用matplotlib做图中图及次坐标轴的实例
2019/07/08 Python
pytorch 实现将自己的图片数据处理成可以训练的图片类型
2020/01/08 Python
计算pytorch标准化(Normalize)所需要数据集的均值和方差实例
2020/01/15 Python
浅谈python输出列表元素的所有排列形式
2020/02/26 Python
python 爬取腾讯视频评论的实现步骤
2021/02/18 Python
AmazeUI的JS表单验证框架实战示例分享
2020/08/21 HTML / CSS
美国马匹用品和马钉购物网站:State Line Tack
2018/08/05 全球购物
精伦电子Java笔试题
2013/01/16 面试题
售后服务科岗位职责范文
2013/11/13 职场文书
口头翻译求职人自荐信
2013/12/07 职场文书
初中作文评语大全
2014/04/23 职场文书
学校工作推荐信范文
2014/07/11 职场文书
申报优秀教师材料
2014/12/16 职场文书
营销计划书范文
2015/01/17 职场文书
数学考试作弊检讨书300字
2015/02/16 职场文书
小学英语教学随笔
2015/08/14 职场文书