基于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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
在Python的web框架中编写创建日志的程序的教程
Apr 30 Python
Python处理PDF及生成多层PDF实例代码
Apr 24 Python
Python机器学习之K-Means聚类实现详解
Feb 22 Python
对django xadmin自定义菜单的实例详解
Jan 03 Python
python使用pymongo操作mongo的完整步骤
Apr 13 Python
Flask框架模板渲染操作简单示例
Jul 31 Python
TensorFlow基本的常量、变量和运算操作详解
Feb 03 Python
解决keras,val_categorical_accuracy:,0.0000e+00问题
Jul 02 Python
jupyter notebook远程访问不了的问题解决方法
Jan 11 Python
Pandas||过滤缺失数据||pd.dropna()函数的用法说明
May 14 Python
Python爬虫基础之简单说一下scrapy的框架结构
Jun 26 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 setcookie函数的参数说明及其用法
2014/04/20 PHP
php实现ip白名单黑名单功能
2015/03/12 PHP
PHP中curl_setopt函数用法实例分析
2015/04/16 PHP
qTip 基于JQuery的Tooltip插件[兼容性好]
2010/09/01 Javascript
JS实现仿微博可关闭弹出层效果
2015/09/21 Javascript
浅谈JavaScript的全局变量与局部变量
2016/06/10 Javascript
Vue.js开发环境快速搭建教程
2017/03/17 Javascript
Vue.js结合Ueditor富文本编辑器的实例代码
2017/07/11 Javascript
vue微信分享 vue实现当前页面分享其他页面
2017/12/02 Javascript
webpack实现一个行内样式px转vw的loader示例
2018/09/13 Javascript
js实现盒子滚动动画效果
2020/08/09 Javascript
[01:34]2014DOTA2展望TI 剑指西雅图VG战队专访
2014/06/30 DOTA
python实现linux下使用xcopy的方法
2015/06/28 Python
Python实现把数字转换成中文
2015/06/29 Python
python 从csv读数据到mysql的实例
2018/06/21 Python
python中csv文件的若干读写方法小结
2018/07/04 Python
对python 多个分隔符split 的实例详解
2018/12/20 Python
python中如何使用分步式进程计算详解
2019/03/22 Python
PyQt 实现使窗口中的元素跟随窗口大小的变化而变化
2019/06/18 Python
python安装scipy的步骤解析
2019/09/28 Python
Python 3.8正式发布重要新功能一览
2019/10/17 Python
Python Django模板之模板过滤器与自定义模板过滤器示例
2019/10/18 Python
后端开发使用pycharm的技巧(推荐)
2020/03/27 Python
基于Python采集爬取微信公众号历史数据
2020/11/27 Python
PUMA官方商城:世界领先的运动品牌之一
2016/11/16 全球购物
新西兰最大的品牌运动鞋购物网站:Platypus NZ
2017/10/27 全球购物
加拿大建筑和装修专家:Reno-Depot
2017/12/21 全球购物
西班牙美妆电商:Perfume’s Club(有中文站)
2018/08/08 全球购物
Bose英国官方网站:美国知名音响品牌
2020/01/26 全球购物
保安队长职务说明书
2014/02/23 职场文书
艺术设计专业求职自荐信
2014/05/19 职场文书
校园标语大全
2014/06/19 职场文书
2014年党员自我剖析材料
2014/10/07 职场文书
2015年教务处干事工作总结
2015/07/22 职场文书
导游词之云南-元阳梯田
2019/10/08 职场文书
win10系统计算机图标怎么调出来?win10调出计算机图标的方法
2022/08/14 数码科技