基于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抓取网页正文的源码
Jun 11 Python
Python单元测试框架unittest简明使用实例
Apr 13 Python
用Python编写一个每天都在系统下新建一个文件夹的脚本
May 04 Python
python中yield的用法详解——最简单,最清晰的解释
Apr 04 Python
django自带serializers序列化返回指定字段的方法
Aug 21 Python
Pytorch之contiguous的用法
Dec 31 Python
python实现百度OCR图片识别过程解析
Jan 17 Python
基于Python3.6中的OpenCV实现图片色彩空间的转换
Feb 03 Python
Python Scrapy框架第一个入门程序示例
Feb 05 Python
postman和python mock测试过程图解
Feb 22 Python
python实现拼接图片
Mar 23 Python
详解Python函数print用法
Jun 18 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中的Base62类(适用于数值转字符串)
2013/08/12 PHP
WordPress中制作导航菜单的PHP核心方法讲解
2015/12/11 PHP
Zend Studio使用技巧两则
2016/04/01 PHP
php多线程并发实现方法
2016/09/30 PHP
基于php(Thinkphp)+jquery 实现ajax多选反选不选删除数据功能
2017/02/24 PHP
Eclipse PHPEclipse 配置的具体步骤
2017/08/08 PHP
php数据库的增删改查 php与javascript之间的交互
2017/08/31 PHP
php微信开发之关键词回复功能
2018/06/13 PHP
laravel5.1 ajax post 传值_token示例
2019/10/24 PHP
二行代码解决全部网页木马
2008/03/28 Javascript
jquery $.ajax各个事件执行顺序
2010/10/15 Javascript
6款新颖的jQuery和CSS3进度条插件推荐
2013/03/05 Javascript
javascript中style.left和offsetLeft的用法说明
2014/03/07 Javascript
JavaScript中定义函数的三种方法
2015/03/12 Javascript
vue+webpack 打包文件 404 页面空白的解决方法
2018/02/28 Javascript
vue-rx的初步使用教程
2018/09/21 Javascript
js/jquery遍历对象和数组的方法分析【forEach,map与each方法】
2019/02/27 jQuery
深入理解使用Vue实现Context-Menu的思考与总结
2019/03/09 Javascript
小程序点餐界面添加购物车左右摆动动画
2020/09/23 Javascript
关于angular 8.1使用过程中的一些记录
2020/11/25 Javascript
[01:14:55]EG vs Spirit Supermajor 败者组 BO3 第三场 6.4
2018/06/05 DOTA
python使用递归解决全排列数字示例
2014/02/11 Python
Python 使用Numpy对矩阵进行转置的方法
2019/01/28 Python
Python快速转换numpy数组中Nan和Inf的方法实例说明
2019/02/21 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
Python Tornado批量上传图片并显示功能
2020/03/26 Python
俄罗斯香水和化妆品购物网站:Л’Этуаль
2018/05/10 全球购物
英国定做窗帘和纺织品面料一站式商店:Dekoria
2018/08/29 全球购物
GWT (Google Web Toolkit)有哪些主要的原件组成?
2015/06/08 面试题
教研活动总结
2014/04/28 职场文书
和睦家庭事迹
2014/05/14 职场文书
2015元旦文艺汇演主持稿(开场白+结束语)
2014/12/14 职场文书
500字小学生检讨书
2015/02/19 职场文书
浅析Python中的套接字编程
2021/06/22 Python
Python中的pprint模块
2021/11/27 Python
详解OpenCV获取高动态范围(HDR)成像
2022/04/29 Python