基于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 相关文章推荐
Django应用程序中如何发送电子邮件详解
Feb 04 Python
python安装模块如何通过setup.py安装(超简单)
May 05 Python
pandas使用get_dummies进行one-hot编码的方法
Jul 10 Python
Python实现批量修改图片格式和大小的方法【opencv库与PIL库】
Dec 03 Python
python实现任意位置文件分割的实例
Dec 14 Python
python实现趣味图片字符化
Apr 30 Python
Python 静态方法和类方法实例分析
Nov 21 Python
基于Python数据分析之pandas统计分析
Mar 03 Python
Keras 使用 Lambda层详解
Jun 10 Python
Python应用实现双指数函数及拟合代码实例
Jun 19 Python
python中怎么表示空值
Jun 19 Python
Python+Xlwings 删除Excel的行和列
Dec 19 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中__get()和__set()的用法实例详解
2013/06/04 PHP
php接口与接口引用的深入解析
2013/08/09 PHP
php有效防止同一用户多次登录
2015/11/19 PHP
PHPStorm+XDebug进行调试图文教程
2016/06/13 PHP
如何在PHP中读写文件
2020/09/07 PHP
JS 如果改变span标签的是否隐藏属性
2011/10/06 Javascript
js控制鼠标事件移动及移出效果显示
2014/10/19 Javascript
javascript实现详细时间提醒信息效果的方法
2015/03/11 Javascript
BootStrap无限级分类(无限极分类封装版)
2016/08/26 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
Angular中实现树形结构视图实例代码
2017/05/05 Javascript
bootstrap选项卡扩展功能详解
2017/06/14 Javascript
简单谈谈React中的路由系统
2017/07/25 Javascript
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
mpvue 如何使用腾讯视频插件的方法
2018/07/16 Javascript
vue在自定义组件中使用v-model进行数据绑定的方法
2019/03/25 Javascript
Vue  webpack 项目自动打包压缩成zip文件的方法
2019/07/24 Javascript
HTML+JS实现“代码雨”效果源码(黑客帝国文字下落效果)
2020/03/17 Javascript
在vue中封装方法以及多处引用该方法详解
2020/08/14 Javascript
使用Python对MySQL数据操作
2017/04/06 Python
Python实现九宫格式的朋友圈功能内附“马云”朋友圈
2019/05/07 Python
Python开发之基于模板匹配的信用卡数字识别功能
2020/01/13 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
Python实现RabbitMQ6种消息模型的示例代码
2020/03/30 Python
python基于pygame实现飞机大作战小游戏
2020/11/19 Python
Jupyter安装拓展nbextensions及解决官网下载慢的问题
2021/03/03 Python
wordpress添加Html5的表单验证required方法小结
2020/08/18 HTML / CSS
质检部岗位职责
2013/11/11 职场文书
教师业务学习制度
2014/01/25 职场文书
领导干部考核评语
2015/01/04 职场文书
销售会议开幕词
2015/01/28 职场文书
导游词300字
2015/02/13 职场文书
副总经理岗位职责范本
2015/04/08 职场文书
教师“一帮一”结对子活动总结
2015/05/07 职场文书
感恩信:写给爸爸妈妈的一封感谢信
2019/09/12 职场文书
Python中time标准库的使用教程
2022/04/13 Python