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下的Mysql模块MySQLdb安装详解
Apr 09 Python
Python生成pdf文件的方法
Aug 04 Python
python urllib爬取百度云连接的实例代码
Jun 19 Python
Python内置函数reversed()用法分析
Mar 20 Python
pandas把dataframe转成Series,改变列中值的类型方法
Apr 10 Python
Python使用os.listdir()和os.walk()获取文件路径与文件下所有目录的方法
Apr 01 Python
在django中图片上传的格式校验及大小方法
Jul 28 Python
Python Django Vue 项目创建过程详解
Jul 29 Python
解决Python使用列表副本的问题
Dec 19 Python
Python3.7黑帽编程之病毒篇(基础篇)
Feb 04 Python
用python对excel查重
Dec 07 Python
Python数据模型与Python对象模型的相关总结
Jan 26 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
apache2.2.4+mysql5.0.77+php5.2.8安装精简
2009/04/29 PHP
php采集内容中带有图片地址的远程图片并保存的方法
2015/01/03 PHP
PHP 实现人民币小写转换成大写的方法及大小写转换函数
2017/11/17 PHP
JavaScript CSS修改学习第二章 样式
2010/02/19 Javascript
Javascript和HTML5利用canvas构建Web五子棋游戏实现算法
2013/07/17 Javascript
非html5实现js版弹球游戏示例代码
2013/09/22 Javascript
jQuery中removeClass()方法用法实例
2015/01/05 Javascript
js实现进度条的方法
2015/02/13 Javascript
使用AngularJS和PHP的Laravel实现单页评论的方法
2015/06/19 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
Three.js 再探 - 写一个微信跳一跳极简版游戏
2018/01/04 Javascript
在vue里使用codemirror遇到的问题
2018/11/01 Javascript
JS异步宏队列与微队列原理区别详解
2020/07/02 Javascript
Element图表初始大小及窗口自适应实现
2020/07/10 Javascript
微信小程序实现简单的select下拉框
2020/11/23 Javascript
基于vue项目设置resolves.alias: '@'路径并适配webstorm
2020/12/02 Vue.js
Python远程桌面协议RDPY安装使用介绍
2015/04/15 Python
Python面向对象编程中关于类和方法的学习笔记
2016/06/30 Python
使用Python实现windows下的抓包与解析
2018/01/15 Python
Jupyter notebook在mac:linux上的配置和远程访问的方法
2019/01/14 Python
Python实现的排列组合、破解密码算法示例
2019/04/12 Python
python 批量添加的button 使用同一点击事件的方法
2019/07/17 Python
python 使用递归回溯完美解决八皇后的问题
2020/02/26 Python
keras训练曲线,混淆矩阵,CNN层输出可视化实例
2020/06/15 Python
Python如何读取、写入JSON数据
2020/07/28 Python
纯css3实现效果超级炫的checkbox复选框和radio单选框
2014/09/01 HTML / CSS
聪明的粉丝购买门票的地方:TickPick
2018/03/09 全球购物
美国婴儿和儿童服装购物网站:PatPat
2020/10/01 全球购物
通信工程毕业生求职信
2013/11/16 职场文书
成功经营餐厅的创业计划书范文
2013/12/26 职场文书
新学期校长寄语
2014/01/18 职场文书
综合办公室岗位职责
2015/04/11 职场文书
单位领导婚礼致辞
2015/07/28 职场文书
钓鱼岛事件感想
2015/08/11 职场文书
一文搞懂Golang 时间和日期相关函数
2021/12/06 Golang
Python使用pyecharts控件绘制图表
2022/06/05 Python