python基于ID3思想的决策树


Posted in Python onJanuary 03, 2018

这是一个判断海洋生物数据是否是鱼类而构建的基于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()

最后我们测试一下这个脚本即可,如果想把这个生成的决策树用图像画出来,也只是在需要在脚本里面定义一个plottree的函数即可。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python Django框架实现自定义表单提交
Mar 25 Python
TensorFlow Session使用的两种方法小结
Jul 30 Python
python 递归深度优先搜索与广度优先搜索算法模拟实现
Oct 22 Python
使用Python自动生成HTML的方法示例
Aug 06 Python
python使用if语句实现一个猜拳游戏详解
Aug 27 Python
执行Django数据迁移时报 1091错误及解决方法
Oct 14 Python
opencv设置采集视频分辨率方式
Dec 10 Python
如何基于python测量代码运行时间
Dec 25 Python
jupyter notebook 添加kernel permission denied的操作
Apr 21 Python
利用python对mysql表做全局模糊搜索并分页实例
Jul 12 Python
使用Python下载抖音各大V视频的思路详解
Feb 06 Python
Python网络编程之ZeroMQ知识总结
Apr 25 Python
python遍历文件夹下所有excel文件
Jan 03 #Python
Python将多份excel表格整理成一份表格
Jan 03 #Python
Python将多个excel文件合并为一个文件
Jan 03 #Python
python中的字典操作及字典函数
Jan 03 #Python
Python将多个excel表格合并为一个表格
Feb 22 #Python
使用Python+Splinter自动刷新抢12306火车票
Jan 03 #Python
Python实现简易Web爬虫详解
Jan 03 #Python
You might like
PHP学习笔记(一):基本语法之标记、空白、和注释
2015/04/17 PHP
php编写简单的文章发布程序
2015/06/18 PHP
PHP实现的多文件上传类及用法示例
2016/05/06 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
Laravel Eloquent ORM 实现查询表中指定的字段
2019/10/17 PHP
基于jquery的横向滚动条(滑动条)
2011/02/24 Javascript
jQuery实现切换页面布局使用介绍
2011/10/09 Javascript
Javascript实现视频轮播在pc端与移动端均可
2013/09/29 Javascript
简介JavaScript中toTimeString()方法的使用
2015/06/12 Javascript
简单的jQuery入门指引
2015/07/28 Javascript
详解JavaScript中基于原型prototype的继承特性
2016/05/05 Javascript
利用Node.js+Koa框架实现前后端交互的方法
2017/02/27 Javascript
微信小程序 登录的简单实现
2017/04/19 Javascript
基于vue-router 多级路由redirect 重定向的问题
2018/09/03 Javascript
微信小程序BindTap快速连续点击目标页面跳转多次问题处理
2019/04/08 Javascript
Layui 动态禁止select下拉的例子
2019/09/03 Javascript
微信小程序scroll-view点击项自动居中效果的实现
2020/03/25 Javascript
python基于urllib实现按照百度音乐分类下载mp3的方法
2015/05/25 Python
在Python的Django框架下使用django-tagging的教程
2015/05/30 Python
浅谈Python 中整型对象的存储问题
2016/05/16 Python
python实现可以断点续传和并发的ftp程序
2016/09/13 Python
Python使用内置json模块解析json格式数据的方法
2017/07/20 Python
用PyInstaller把Python代码打包成单个独立的exe可执行文件
2018/05/26 Python
Python一键查找iOS项目中未使用的图片、音频、视频资源
2019/08/12 Python
Python面向对象之多态原理与用法案例分析
2019/12/30 Python
在django中form的label和verbose name的区别说明
2020/05/20 Python
keras多显卡训练方式
2020/06/10 Python
印度网上药店:1mg
2017/10/13 全球购物
美国学校用品、教室和教学商店:Discount School Supply
2018/04/04 全球购物
eBay荷兰购物网站:eBay.nl
2020/06/26 全球购物
30年同学聚会感言
2014/01/30 职场文书
运动会方阵解说词
2014/02/12 职场文书
竞选班干部演讲稿300字
2014/08/20 职场文书
2014年宣传工作总结
2014/11/18 职场文书
2014年世界艾滋病日演讲稿
2014/11/28 职场文书
JavaScript 反射学习技巧
2021/10/16 Javascript