基于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 相关文章推荐
使用Python3 编写简单信用卡管理程序
Dec 21 Python
使用Python的turtle模块画图的方法
Nov 15 Python
深入理解Python分布式爬虫原理
Nov 23 Python
python删除文本中行数标签的方法
May 31 Python
python算法与数据结构之冒泡排序实例详解
Jun 22 Python
Python解析命令行读取参数之argparse模块
Jul 26 Python
Python 用matplotlib画以时间日期为x轴的图像
Aug 06 Python
使用python模拟高斯分布例子
Dec 09 Python
keras处理欠拟合和过拟合的实例讲解
May 25 Python
常用的10个Python实用小技巧
Aug 10 Python
CocosCreator ScrollView优化系列之分帧加载
Apr 14 Python
Python基础之tkinter图形化界面学习
Apr 29 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
长波知识介绍
2021/03/01 无线电
PHP+jQuery翻板抽奖功能实现
2015/10/19 PHP
yii2.0框架场景的简单使用示例
2020/01/25 PHP
用正则表达式 动态创建/增加css style script 兼容IE firefox
2009/03/10 Javascript
实现png图片和png背景透明(支持多浏览器)的方法
2009/09/08 Javascript
Javascript Function对象扩展之延时执行函数
2010/07/06 Javascript
javascript 获取图片尺寸及放大图片
2013/09/04 Javascript
js onload处理html页面加载之后的事件
2013/10/30 Javascript
jquery左边浮动到一定位置时显示返回顶部按钮
2014/06/05 Javascript
jquery带动画效果幻灯片特效代码
2015/08/27 Javascript
JQuery实现图片轮播效果
2015/09/15 Javascript
js选择器全面解析
2016/06/27 Javascript
基于nodejs+express4.X实现文件下载的实例代码
2017/07/13 NodeJs
微信小程序如何获取openid及用户信息
2018/01/26 Javascript
完美解决linux下node.js全局模块找不到的情况
2018/05/16 Javascript
原生js实现拖拽移动与缩放效果
2020/08/24 Javascript
Python中集合的内建函数和内建方法学习教程
2015/08/19 Python
利用Python脚本生成sitemap.xml的实现方法
2017/01/31 Python
解决Python网页爬虫之中文乱码问题
2018/05/11 Python
简单了解python 邮件模块的使用方法
2019/07/24 Python
Python字典深浅拷贝与循环方式方法详解
2020/02/09 Python
Python爬虫爬取、解析数据操作示例
2020/03/27 Python
皇马官方商城:Real Madrid Store
2016/09/02 全球购物
如何提高MySql的安全性
2014/06/19 面试题
学前教育教师求职自荐信
2013/09/22 职场文书
厂长岗位职责
2014/02/19 职场文书
班级口号大全
2014/06/09 职场文书
学校党的群众路线教育实践活动总结报告
2014/07/03 职场文书
岗位说明书标准范本
2014/07/30 职场文书
2014年专项整治工作总结
2014/11/17 职场文书
2014年社区妇联工作总结
2014/12/02 职场文书
《丑小鸭》教学反思
2016/02/19 职场文书
先进党支部事迹材料2016
2016/02/26 职场文书
nginx.conf配置文件结构小结
2022/04/08 Servers
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android
Zabbix对Kafka topic积压数据监控的问题(bug优化)
2022/07/07 Servers