基于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实现bucket排序算法实例分析
May 04 Python
python获取当前运行函数名称的方法实例代码
Apr 06 Python
python机器学习之KNN分类算法
Aug 29 Python
使用Template格式化Python字符串的方法
Jan 22 Python
详解python项目实战:模拟登陆CSDN
Apr 04 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
pytorch 在网络中添加可训练参数,修改预训练权重文件的方法
Aug 17 Python
基于python2.7实现图形密码生成器的实例代码
Nov 05 Python
python将时分秒转换成秒的实例
Dec 07 Python
python之语音识别speech模块
Sep 09 Python
Python 实现二叉查找树的示例代码
Dec 21 Python
这样写python注释让代码更加的优雅
Jun 02 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中使用Oracle数据库(2)
2006/10/09 PHP
PHP读取文件内容后清空文件示例代码
2014/03/18 PHP
YII框架关联查询操作示例
2019/04/29 PHP
Javascript客户端将指定区域导出到Word、Excel的代码
2008/10/22 Javascript
网页禁用右键实现代码(JavaScript代码)
2009/10/29 Javascript
Javascript的构造函数和constructor属性
2010/01/09 Javascript
使用JQuery进行跨域请求
2010/01/25 Javascript
早该知道的7个JavaScript技巧
2013/03/27 Javascript
Jquery仿淘宝京东多条件筛选可自行结合ajax加载示例
2013/08/28 Javascript
javaScript使用EL表达式的几种方式
2014/05/27 Javascript
JavaScript中的setUTCDate()方法使用详解
2015/06/11 Javascript
javascript中setInterval的用法
2015/07/19 Javascript
javascript类型系统 Window对象学习笔记
2016/01/07 Javascript
快速解决Canvas.toDataURL 图片跨域的问题
2016/05/10 Javascript
js评分组件使用详解
2017/06/06 Javascript
vue mint-ui 实现省市区街道4级联动示例(仿淘宝京东收货地址4级联动)
2017/10/16 Javascript
angularjs使用div模拟textarea文本框的方法
2018/10/02 Javascript
vue组件文档(.md)中如何自动导入示例(.vue)详解
2019/01/25 Javascript
通过vue手动封装on、emit、off的代码详解
2019/05/29 Javascript
Electron vue的使用教程图文详解
2019/07/05 Javascript
windows下create-react-app 升级至3.3.1版本踩坑记
2020/02/17 Javascript
原生JavaScript创建不可变对象的方法简单示例
2020/05/07 Javascript
[01:27:43]VGJ.S vs TNC Supermajor 败者组 BO3 第三场 6.6
2018/06/07 DOTA
在python中pandas读文件,有中文字符的方法
2018/12/12 Python
python 直接赋值和copy的区别详解
2019/08/07 Python
Pandas-Cookbook 时间戳处理方式
2019/12/07 Python
Python concurrent.futures模块使用实例
2019/12/24 Python
django和flask哪个值得研究学习
2020/07/31 Python
django教程如何自学
2020/07/31 Python
英国排名第一的LED灯泡网站:LED Bulbs
2019/09/03 全球购物
湖南卫视在线视频媒体平台:芒果TV
2019/10/30 全球购物
教师个人剖析材料
2014/02/05 职场文书
投标授权委托书范文
2014/08/02 职场文书
2014年小学重阳节活动策划方案
2014/09/16 职场文书
初中班主任教育随笔
2015/08/15 职场文书
ant design charts 获取后端接口数据展示
2022/05/25 Javascript