基于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 while、for、生成器、列表推导等语句的执行效率测试
Jun 03 Python
Python set常用操作函数集锦
Nov 15 Python
Python3处理HTTP请求的实例
May 10 Python
Python简单读写Xls格式文档的方法示例
Aug 17 Python
Laravel+Dingo/Api 自定义响应的实现
Feb 17 Python
Python实现的服务器示例小结【单进程、多进程、多线程、非阻塞式】
May 23 Python
关于 Python opencv 使用中的 ValueError: too many values to unpack
Jun 28 Python
Pytorch 神经网络—自定义数据集上实现教程
Jan 07 Python
python GUI库图形界面开发之PyQt5动态(可拖动控件大小)布局控件QSplitter详细使用方法与实例
Mar 06 Python
Python3通过chmod修改目录或文件权限的方法示例
Jun 08 Python
Django扫码抽奖平台的配置过程详解
Jan 14 Python
Python接口自动化系列之unittest结合ddt的使用教程详解
Feb 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
PHP 多维数组排序(usort,uasort)
2010/06/30 PHP
浅析PHP的静态成员函数效率更高的原因
2014/06/13 PHP
详解 PHP加密解密字符串函数附源码下载
2015/12/18 PHP
php 数组随机取值的简单实例
2016/05/23 PHP
php通过pecl方式安装扩展的实例讲解
2018/02/02 PHP
PHP使用文件锁解决高并发问题示例
2018/03/29 PHP
JavaScript面向对象编程
2008/03/02 Javascript
网页源代码保护(禁止右键、复制、另存为、查看源文件)
2012/05/23 Javascript
全面兼容的javascript时间格式化函数(比较实用)
2014/05/14 Javascript
什么是Node.js?Node.js详细介绍
2014/06/01 Javascript
深入理解JavaScript系列(35):设计模式之迭代器模式详解
2015/03/03 Javascript
jQuery旋转木马式幻灯片轮播特效
2015/12/04 Javascript
使用jquery获取url以及jquery获取url参数的实现方法
2016/05/25 Javascript
jQuery实现可拖拽的许愿墙效果【附demo源码下载】
2016/09/14 Javascript
如何实现json数据可视化详解
2016/11/24 Javascript
Vue.js使用v-show和v-if的注意事项
2016/12/13 Javascript
JavaScript选取(picking)和反选(rejecting)对象的属性方法
2017/08/16 Javascript
javascript实现留言板功能
2020/02/08 Javascript
微信小程序 flexbox layout快速实现基本布局的解决方案
2020/03/24 Javascript
[01:10:24]DOTA2-DPC中国联赛 正赛 VG vs Aster BO3 第一场 2月28日
2021/03/11 DOTA
python端口扫描系统实现方法
2014/11/19 Python
Python如何判断数独是否合法
2016/09/08 Python
python中tkinter的应用:修改字体的实例讲解
2019/07/17 Python
django云端留言板实例详解
2019/07/22 Python
python GUI库图形界面开发之PyQt5菜单栏控件QMenuBar的详细使用方法与实例
2020/02/28 Python
Python操作Excel把数据分给sheet
2020/05/20 Python
TecoBuy澳大利亚:在线电子和小工具商店
2020/06/25 全球购物
计算机应用应届生求职信
2014/07/12 职场文书
婚宴邀请函
2015/01/30 职场文书
新员工试用期自我评价
2015/03/10 职场文书
2015年毕业生个人自荐书
2015/03/24 职场文书
《绝招》教学反思
2016/02/20 职场文书
该怎么书写道歉信?
2019/07/03 职场文书
在pyCharm中下载第三方库的方法
2021/04/18 Python
MySQL 角色(role)功能介绍
2021/04/24 MySQL
MySQL 数据 data 基本操作
2022/05/04 MySQL