基于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编程时利用wxPython来支持多线程的方法
Apr 07 Python
Python编程实现删除VC临时文件及Debug目录的方法
Mar 22 Python
python发送邮件实例分享
Jul 28 Python
详解python 拆包可迭代数据如tuple, list
Dec 29 Python
mvc框架打造笔记之wsgi协议的优缺点以及接口实现
Aug 01 Python
解决win64 Python下安装PIL出错问题(图解)
Sep 03 Python
python如何以表格形式打印输出的方法示例
Jun 21 Python
python求最大值最小值方法总结
Jun 25 Python
Python urlencode和unquote函数使用实例解析
Mar 31 Python
pyecharts调整图例与各板块的位置间距实例
May 16 Python
python 实现一个图形界面的汇率计算器
Nov 09 Python
Python基础进阶之海量表情包多线程爬虫功能的实现
Dec 17 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与Java的时间类型
2013/06/22 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(九)
2014/06/24 PHP
smarty模板引擎之内建函数用法
2015/03/30 PHP
PHP中多线程的两个实现方法
2016/10/14 PHP
PHP实现mysqli批量执行多条语句的方法示例
2017/07/22 PHP
php成功操作redis cluster集群的实例教程
2019/01/13 PHP
基于jquery的模态div层弹出效果
2010/08/21 Javascript
事件冒泡是什么如何用jquery阻止事件冒泡
2013/03/20 Javascript
Extjs4 类的定义和扩展实例
2013/06/28 Javascript
浅谈JavaScript中定义变量时有无var声明的区别
2014/08/18 Javascript
用js通过url传参把数据从一个页面传到另一个页面
2014/09/01 Javascript
JS判断浏览器是否支持某一个CSS3属性的方法
2014/10/17 Javascript
jQuery实现仿QQ空间装扮预览图片的鼠标提示效果代码
2015/10/30 Javascript
javascript入门之string对象【新手必看】
2016/11/22 Javascript
详解jquery easyui之datagrid使用参考
2016/12/05 Javascript
jQuery实现简易的输入框字数计数功能示例
2017/01/16 Javascript
php输出全部gb2312编码内的汉字方法
2017/03/04 Javascript
Vue.js展示AJAX数据简单示例讲解
2017/03/29 Javascript
详解vue.js+UEditor集成 [前后端分离项目]
2017/07/07 Javascript
node.js的http.createServer过程深入解析
2019/06/06 Javascript
微信小程序实现定位及到指定位置导航的示例代码
2019/08/20 Javascript
[00:47]DOTA2荣耀之路6:玩不了啦!
2018/05/30 DOTA
python 排列组合之itertools
2013/03/20 Python
python基础教程之udp端口扫描
2014/02/10 Python
Python标准库urllib2的一些使用细节总结
2015/03/16 Python
Python标准库shutil模块使用方法解析
2020/03/10 Python
OpenCV Python实现拼图小游戏
2020/03/23 Python
纯CSS3实现滚动的齿轮动画效果
2014/06/05 HTML / CSS
英国家庭珠宝商:T. H. Baker
2018/02/08 全球购物
环境工程专业个人求职信
2013/12/05 职场文书
项目管理计划书
2014/01/09 职场文书
少先队学雷锋活动月总结
2014/03/09 职场文书
教室布置标语
2014/06/26 职场文书
七夕活动策划方案
2014/08/16 职场文书
2014年个人工作总结范文
2014/11/07 职场文书
Linux在两个服务器直接传文件的操作方法
2022/08/05 Servers