基于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 用Redis简单实现分布式爬虫的方法
Nov 23 Python
python用户评论标签匹配的解决方法
May 31 Python
Python 实现「食行生鲜」签到领积分功能
Sep 26 Python
浅谈python 导入模块和解决文件句柄找不到问题
Dec 15 Python
python执行CMD指令,并获取返回的方法
Dec 19 Python
在Pycharm中对代码进行注释和缩进的方法详解
Jan 20 Python
对Python实现累加函数的方法详解
Jan 23 Python
python删除列表元素的三种方法(remove,pop,del)
Jul 22 Python
Python学习笔记之For循环用法详解
Aug 14 Python
python框架django项目部署相关知识详解
Nov 04 Python
浅谈对python中if、elif、else的误解
Aug 20 Python
Python安装第三方库攻略(pip和Anaconda)
Oct 15 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
php公用函数列表[正则]
2007/02/22 PHP
Server.HTMLEncode让代码在页面里显示为源代码
2013/12/08 PHP
php之curl实现http与https请求的方法
2014/10/21 PHP
php封装db类连接sqlite3数据库的方法实例
2017/12/19 PHP
Prototype使用指南之enumerable.js
2007/01/10 Javascript
js数字输入框(包括最大值最小值限制和四舍五入)
2009/11/24 Javascript
Jquery+JSon 无刷新分页实现代码
2010/04/01 Javascript
jquery、js调用iframe父窗口与子窗口元素的方法整理
2014/07/31 Javascript
js中遍历Map对象的简单实例
2016/08/08 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
微信小程序 两种滑动方式(横向滑动,竖向滑动)详细及实例代码
2017/01/13 Javascript
NodeJS遍历文件生产文件列表功能示例
2017/01/22 NodeJs
JavaScript ES6中export、import与export default的用法和区别
2017/03/14 Javascript
JS ES6中setTimeout函数的执行上下文示例
2017/04/27 Javascript
详解如何用webpack打包一个网站应用项目
2017/07/12 Javascript
AngularJS中控制器函数的定义与使用方法示例
2017/10/10 Javascript
mint-ui 时间插件使用及获取选择值的方法
2018/02/09 Javascript
JavaScript从原型到原型链深入理解
2019/06/03 Javascript
vue 集成 vis-network 实现网络拓扑图的方法
2019/08/07 Javascript
js实现3D旋转效果
2020/08/18 Javascript
[02:56]DOTA2上海特锦赛小组赛解说FreeAgain采访花絮
2016/02/27 DOTA
[01:54]TI珍贵瞬间系列(三):翻盘
2020/08/28 DOTA
浅析Python的Django框架中的Memcached
2015/07/23 Python
Python爬虫获取整个站点中的所有外部链接代码示例
2017/12/26 Python
python如何派生内置不可变类型并修改实例化行为
2018/03/21 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
python tkinter组件使用详解
2019/09/16 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
2020/01/06 Python
Pycharm2020.1安装中文语言插件的详细教程(不需要汉化)
2020/08/07 Python
分享一个页面平滑滚动小技巧(推荐)
2019/10/23 HTML / CSS
HTML5中input输入框默认提示文字向左向右移动的示例代码
2020/09/10 HTML / CSS
Swisse官方海外旗舰店:澳大利亚销量领先,自然健康品牌
2017/12/15 全球购物
九一八事变纪念日演讲稿
2014/09/14 职场文书
2015年学校管理工作总结
2015/07/20 职场文书
JavaWeb实现显示mysql数据库数据
2022/03/19 Java/Android
DE1103使用报告
2022/04/05 无线电