基于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中偏函数partial用法实例分析
Jul 08 Python
Python编写简单的HTML页面合并脚本
Jul 11 Python
python实现单链表中删除倒数第K个节点的方法
Sep 28 Python
Django中使用MySQL5.5的教程
Dec 18 Python
windows10环境下用anaconda和VScode配置的图文教程
Mar 30 Python
Python3 hashlib密码散列算法原理详解
Mar 30 Python
使用Keras加载含有自定义层或函数的模型操作
Jun 10 Python
使用pytorch 筛选出一定范围的值
Jun 28 Python
Python爬虫模拟登陆哔哩哔哩(bilibili)并突破点选验证码功能
Dec 21 Python
python实现自动化群控的步骤
Apr 11 Python
尝试使用Python爬取城市租房信息
Apr 12 Python
Python爬取奶茶店数据分析哪家最好喝以及性价比
Sep 23 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
YII Framework框架教程之缓存用法详解
2016/03/14 PHP
php smtp实现发送邮件功能
2017/06/22 PHP
PHP addslashes()函数讲解
2019/02/03 PHP
PHP+Redis开发的书签案例实战详解
2019/07/09 PHP
php策略模式简单示例分析【区别于工厂模式】
2019/09/25 PHP
php中yar框架实例用法讲解
2020/12/27 PHP
超简单的jquery的AJAX用法
2010/05/10 Javascript
JavaScript浏览器选项卡效果
2010/08/25 Javascript
解决3.01版的jquery.form.js中文乱码问题的解决方法
2012/03/08 Javascript
JS脚本defer的作用示例介绍
2014/01/02 Javascript
javascript 判断是否是微信浏览器的方法
2016/10/09 Javascript
BootStrop前端框架入门教程详解
2016/12/25 Javascript
JS实现向iframe中表单传值的方法
2017/03/24 Javascript
angularJS利用ng-repeat遍历二维数组的实例代码
2017/06/03 Javascript
详解vue 配合vue-resource调用接口获取数据
2017/06/22 Javascript
Vue.js常用指令之循环使用v-for指令教程
2017/06/27 Javascript
详解基于vue-cli优化的webpack配置
2017/11/06 Javascript
vue移动端微信授权登录插件封装的实例
2018/08/28 Javascript
在vue和element-ui的table中实现分页复选功能
2019/12/04 Javascript
react基本安装与测试示例
2020/04/27 Javascript
微信小程序开发(二):页面跳转并传参操作示例
2020/06/01 Javascript
vue - props 声明数组和对象操作
2020/07/30 Javascript
python 动态获取当前运行的类名和函数名的方法
2014/04/15 Python
在Python中操作日期和时间之gmtime()方法的使用
2015/05/22 Python
详解Django中Request对象的相关用法
2015/07/17 Python
如何用python整理附件
2018/05/13 Python
Django中的文件的上传的几种方式
2018/07/23 Python
pandas修改DataFrame列名的实现方法
2019/02/22 Python
Python字符串的常见操作实例小结
2019/04/08 Python
python语言元素知识点详解
2019/05/15 Python
Django连接数据库并实现读写分离过程解析
2019/11/13 Python
python对execl 处理操作代码
2020/06/22 Python
后勤工作职责
2013/12/22 职场文书
房地产项目建议书
2014/03/12 职场文书
转正申请报告格式
2015/05/15 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书