基于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获取当前公网ip并自动断开宽带连接实例代码
Jan 12 Python
详解Python自建logging模块
Jan 29 Python
详解python字节码
Feb 07 Python
Python实现查看系统启动项功能示例
May 10 Python
python字符串与url编码的转换实例
May 10 Python
Python 查看list中是否含有某元素的方法
Jun 27 Python
python批量修改图片大小的方法
Jul 24 Python
django之跨表查询及添加记录的示例代码
Oct 16 Python
Django 简单实现分页与搜索功能的示例代码
Nov 07 Python
对tensorflow中的strides参数使用详解
Jan 04 Python
python实现将列表中各个值快速赋值给多个变量
Apr 02 Python
利用Python实现字幕挂载(把字幕文件与视频合并)思路详解
Oct 21 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分页函数代码(简单实用型)
2010/12/02 PHP
php读取本地文件常用函数(fopen与file_get_contents)
2013/09/09 PHP
PHP中使用gettext解决国际化问题的例子(i18n)
2014/06/13 PHP
php打印一个边长为N的实心和空心菱型的方法
2015/03/02 PHP
php实现在服务器上创建目录的方法
2015/03/16 PHP
PHP内存使用情况如何获取
2015/10/10 PHP
PHP正则获取页面所有图片地址
2016/03/23 PHP
PHP使用反射机制实现查找类和方法的所在位置
2016/04/22 PHP
ThinkPHP5+UEditor图片上传到阿里云对象存储OSS功能示例
2019/08/05 PHP
laravel 根据不同组织加载不同视图的实现
2019/10/14 PHP
JQuery困惑—包装集 DOM节点
2009/10/16 Javascript
基于jquery的禁用右键、文本选择功能、复制按键的实现代码
2013/08/27 Javascript
jQuery实现公告文字左右滚动的实例代码
2013/10/29 Javascript
javascript中怎么做对象的类型判断
2013/11/11 Javascript
jQuery插件jcrop+Fileapi完美实现图片上传+裁剪+预览的代码分享
2015/04/22 Javascript
超详细的javascript数组方法汇总
2015/11/21 Javascript
信息页文内画中画广告js实现代码(文中加载广告方式)
2016/01/03 Javascript
利用jQuery来动态为属性添加或者删除属性的简单方法
2016/12/02 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
基于Koa(nodejs框架)对json文件进行增删改查的示例代码
2019/02/02 NodeJs
在vue中使用Base64转码的案例
2020/08/07 Javascript
js实现简易拖拽的示例
2020/10/26 Javascript
windows下python模拟鼠标点击和键盘输示例
2014/02/28 Python
使用Python简单的实现树莓派的WEB控制
2016/02/18 Python
Google开源的Python格式化工具YAPF的安装和使用教程
2016/05/31 Python
apache部署python程序出现503错误的解决方法
2017/07/24 Python
Python小整数对象池和字符串intern实例解析
2020/03/21 Python
css3 伪类选择器快速复习小结
2019/09/10 HTML / CSS
html5模拟平抛运动(模拟小球平抛运动过程)
2013/07/25 HTML / CSS
Kiehl’s科颜氏西班牙官方网站:源自美国的植物护肤品牌
2020/02/22 全球购物
信息部岗位职责
2013/11/12 职场文书
高考标语大全
2014/06/05 职场文书
写字楼租赁意向书
2014/07/30 职场文书
单位单身证明样本
2014/10/11 职场文书
2015年机械设备管理工作总结
2015/05/04 职场文书
redis客户端实现高可用读写分离的方式详解
2021/07/04 Redis