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 multiprocessing模块中的Pipe管道使用实例
Apr 11 Python
简单谈谈Python中的闭包
Nov 30 Python
python实现将文件夹下面的不是以py文件结尾的文件都过滤掉的方法
Oct 21 Python
解决每次打开pycharm直接进入项目的问题
Oct 28 Python
Python+Pyqt实现简单GUI电子时钟
Feb 22 Python
自适应线性神经网络Adaline的python实现详解
Sep 30 Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 Python
在python里创建一个任务(Task)实例
Apr 25 Python
浅谈python量化 双均线策略(金叉死叉)
Jun 03 Python
Python使用Opencv实现边缘检测以及轮廓检测的实现
Dec 31 Python
学会Python数据可视化必须尝试这7个库
Jun 16 Python
Python获取指定日期是"星期几"的6种方法
Mar 13 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
javascript打开新窗口同时关闭旧窗口
2009/01/16 Javascript
基于jquery的页面划词搜索JS
2010/09/14 Javascript
jQuery 菜单随滚条改为以定位方式(固定要浏览器顶部)
2012/05/24 Javascript
nodejs中实现sleep功能实例
2015/03/24 NodeJs
用jQuery获取table中行id和td值的实现代码
2016/05/19 Javascript
微信小程序 label 组件详解及简单实例
2017/01/10 Javascript
jquery中绑定事件的异同
2017/02/28 Javascript
vue.js加载新的内容(实例代码)
2017/06/01 Javascript
深入剖析Node.js cluster模块
2018/05/23 Javascript
JavaScript门道之标准库
2018/05/26 Javascript
Vue实现侧边菜单栏手风琴效果实例代码
2018/05/31 Javascript
浅谈Vuex注入Vue生命周期的过程
2019/05/20 Javascript
nodejs使用node-xlsx生成excel的方法示例
2019/08/22 NodeJs
vscode 插件开发 + vue的操作方法
2020/06/05 Javascript
three.js 利用uv和ThreeBSP制作一个快递柜功能
2020/08/18 Javascript
[01:38]DOTA2 2015国际邀请赛中国区预选赛 Showopen
2015/06/01 DOTA
python设置检查点简单实现代码
2014/07/01 Python
使用python编写脚本获取手机当前应用apk的信息
2014/07/21 Python
Python内置函数之filter map reduce介绍
2014/11/30 Python
python实现学生管理系统
2018/01/11 Python
安装python时MySQLdb报错的问题描述及解决方法
2018/03/20 Python
浅谈python下tiff图像的读取和保存方法
2018/12/04 Python
python爬取酷狗音乐排行榜
2019/02/20 Python
Python列表切片常用操作实例解析
2019/12/16 Python
Python3爬虫中Selenium的用法详解
2020/07/10 Python
使用Python pip怎么升级pip
2020/08/11 Python
浅析Python模块之间的相互引用问题
2021/02/26 Python
生物科学专业个人求职信范文
2013/12/05 职场文书
农民入党思想汇报
2014/01/03 职场文书
小学教师国培感言
2014/02/08 职场文书
境外导游求职信
2014/02/27 职场文书
2014年体育部工作总结
2014/11/13 职场文书
老龙头导游词
2015/02/11 职场文书
2015年学习部工作总结范文
2015/03/31 职场文书
单方投资意向书
2015/05/11 职场文书
Java用自带的Image IO给图片添加水印
2021/06/15 Java/Android