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 序列化 pickle/cPickle模块使用介绍
Nov 30 Python
python通过get,post方式发送http请求和接收http响应的方法
May 26 Python
python插入排序算法实例分析
Jul 03 Python
举例讲解Python设计模式编程中对抽象工厂模式的运用
Mar 02 Python
Python代码实现KNN算法
Dec 20 Python
教你使用python画一朵花送女朋友
Mar 29 Python
python判断数字是否是超级素数幂
Sep 27 Python
Python用5行代码写一个自定义简单二维码
Oct 21 Python
Python实现剪刀石头布小游戏(与电脑对战)
Dec 31 Python
pytorch之ImageFolder使用详解
Jan 06 Python
python golang中grpc 使用示例代码详解
Jun 03 Python
python 下划线的不同用法
Oct 24 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 无限级数据JSON格式及JS解析
2010/07/17 PHP
php连接数据库代码应用分析
2011/05/29 PHP
php删除与复制文件夹及其文件夹下所有文件的实现代码
2013/01/23 PHP
PHP将回调函数作用到给定数组单元的方法
2014/08/19 PHP
PHP实现动态web服务器方法
2015/07/29 PHP
PHP hebrev()函数用法讲解
2019/02/21 PHP
PHP图像处理 imagestring添加图片水印与文字水印操作示例
2020/02/06 PHP
jQuery 扩展对input的一些操作方法
2009/10/30 Javascript
jQuery图片滚动图片的效果(另类实现)
2013/06/02 Javascript
Javascript毫秒数用法实例
2015/02/05 Javascript
使用javascript提交form表单方法汇总
2015/06/25 Javascript
老生常谈js动态添加事件--- 事件委托
2016/07/19 Javascript
Express之托管静态文件的方法
2018/06/01 Javascript
React-router4路由监听的实现
2018/08/07 Javascript
vue搜索和vue模糊搜索代码实例
2019/05/07 Javascript
原生js实现日历效果
2020/03/02 Javascript
[59:08]DOTA2上海特级锦标赛C组小组赛#2 LGD VS Newbee第一局
2016/02/27 DOTA
Python实现动态添加类的属性或成员函数的解决方法
2014/07/16 Python
用Python代码来绘制彭罗斯点阵的教程
2015/04/03 Python
Python线程下使用锁的技巧分享
2018/09/13 Python
Python判断字符串是否xx开始或结尾的示例
2019/08/08 Python
解决pycharm每次打开项目都需要配置解释器和安装库问题
2020/02/26 Python
html5中地理位置定位api接口开发应用小结
2013/01/04 HTML / CSS
携程英文网站:Trip.com
2017/02/07 全球购物
微软新西兰官方网站:Microsoft New Zealand
2018/08/17 全球购物
蹦床仓库:Trampoline Warehouse
2018/12/06 全球购物
印度尼西亚最好的小工具在线商店:Erafone.com
2019/03/26 全球购物
德国最大的婴儿用品网上商店:Kidsroom.de(支持中文)
2020/09/02 全球购物
求职信名称怎么写
2014/05/26 职场文书
七一党日活动总结
2014/07/08 职场文书
丧事答谢词
2015/01/05 职场文书
办公室岗位职责范本
2015/04/11 职场文书
2015年教研组工作总结
2015/05/04 职场文书
一篇文章告诉你如何实现Vue前端分页和后端分页
2022/02/18 Vue.js
处理canvas绘制图片模糊问题
2022/05/11 Javascript
MySQL中TIMESTAMP类型返回日期时间数据中带有T的解决
2022/12/24 MySQL