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 相关文章推荐
Python3 正在毁灭 Python的原因分析
Nov 28 Python
python3利用smtplib通过qq邮箱发送邮件方法示例
Dec 03 Python
Python机器学习logistic回归代码解析
Jan 17 Python
python web.py开发httpserver解决跨域问题实例解析
Feb 12 Python
python远程连接服务器MySQL数据库
Jul 02 Python
Python之列表实现栈的工作功能
Jan 28 Python
Python API 自动化实战详解(纯代码)
Jun 11 Python
python读写文件write和flush的实现方式
Feb 21 Python
keras 模型参数,模型保存,中间结果输出操作
Jul 06 Python
手把手教你将Flask应用封装成Docker服务的实现
Aug 19 Python
python如何提升爬虫效率
Sep 27 Python
聊聊Python String型列表求最值的问题
Jan 18 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
利用递归把多维数组转为一维数组的函数
2006/10/09 PHP
基于ubuntu下nginx+php+mysql安装配置的具体操作步骤
2013/04/28 PHP
php接口数据加密、解密、验证签名
2015/03/12 PHP
php单一接口的实现方法
2015/06/20 PHP
PHP中ID设置自增后不连续的原因分析及解决办法
2016/08/21 PHP
js cookies 常见网页木马挂马代码 24小时只加载一次
2009/04/13 Javascript
输入自动提示搜索提示功能的javascript:sugggestion.js
2013/09/02 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
javascript实现下班倒计时效果的方法(可桌面通知)
2015/07/10 Javascript
AngularJS 文件上传控件 ng-file-upload详解
2017/01/13 Javascript
浅析bootstrap原理及优缺点
2017/03/19 Javascript
详解layui弹窗父子窗口之间传参数的方法
2018/01/16 Javascript
浅析vue深复制
2018/01/29 Javascript
Javascript通过控制类名更改样式
2019/05/24 Javascript
微信小程序实现手势滑动效果
2019/08/26 Javascript
使用Vue调取接口,并渲染数据的示例代码
2019/10/28 Javascript
vue 开发企业微信整合案例分析
2019/12/02 Javascript
Ant Design Pro 之 ProTable使用操作
2020/10/31 Javascript
[01:11:32]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第二场 8.15
2019/08/17 DOTA
利用打码兔和超人打码自封装的打码类分享
2014/03/16 Python
利用numpy+matplotlib绘图的基本操作教程
2017/05/03 Python
详解Django中六个常用的自定义装饰器
2018/07/04 Python
Python面向对象之接口、抽象类与多态详解
2018/08/27 Python
python3 实现对图片进行局部切割的方法
2018/12/05 Python
python爬虫项目设置一个中断重连的程序的实现
2019/07/26 Python
Selenium向iframe富文本框输入内容过程图解
2020/04/10 Python
python读取图片颜色值并生成excel像素画的方法实例
2021/02/19 Python
索引覆盖(Index Covering)查询含义
2012/02/18 面试题
介绍一下MD5加密算法
2016/11/12 面试题
医学毕业生自我鉴定
2013/10/30 职场文书
书法培训心得体会
2014/01/05 职场文书
高二英语教学反思
2014/01/19 职场文书
2014年小学生教师节演讲稿范文
2014/09/10 职场文书
2014年预备党员群众路线教育实践活动对照检查材料思想汇报
2014/10/02 职场文书
合作协议书格式范本
2016/03/21 职场文书
Redis实现一个账号只能登录一个设备
2022/04/19 Redis