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网络编程之UDP通信实例(含服务器端、客户端、UDP广播例子)
Apr 25 Python
python实现给字典添加条目的方法
Sep 25 Python
Python列表(list)、字典(dict)、字符串(string)基本操作小结
Nov 28 Python
Python的网络编程库Gevent的安装及使用技巧
Jun 24 Python
python opencv 直方图反向投影的方法
Feb 24 Python
python找出一个列表中相同元素的多个索引实例
Jun 11 Python
python中的列表与元组的使用
Aug 08 Python
解决Python计算矩阵乘向量,矩阵乘实数的一些小错误
Aug 26 Python
python GUI库图形界面开发之PyQt5滑块条控件QSlider详细使用方法与实例
Feb 28 Python
python实现简易版学生成绩管理系统
Jun 22 Python
一文弄懂Pytorch的DataLoader, DataSet, Sampler之间的关系
Jul 03 Python
Python实战实现爬取天气数据并完成可视化分析详解
Jun 16 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的5个入手程序
2006/11/23 PHP
php 分页函数multi() discuz
2009/06/21 PHP
基于PHP常用字符串的总结(待续)
2013/06/07 PHP
PHP数组排序之sort、asort与ksort用法实例
2014/09/08 PHP
PHP模板解析类实例
2015/07/09 PHP
php获取远程图片并下载保存到本地的方法分析
2016/10/08 PHP
浏览器页面区域大小的js获取方法
2013/09/21 Javascript
jquery教程限制文本框只能输入数字和小数点示例分享
2014/01/13 Javascript
Jquery 监视按键,按下回车键触发某方法的实现代码
2014/05/11 Javascript
Jquery网页内滑动缓冲导航的实现代码
2015/04/05 Javascript
Bootstrap每天必学之缩略图与警示窗
2015/11/29 Javascript
js事件处理程序跨浏览器解决方案
2016/03/27 Javascript
jQuery基于ajax操作json数据简单示例
2017/01/05 Javascript
微信小程序中实现手指缩放图片的示例代码
2018/03/13 Javascript
JS判断两个数组或对象是否相同的方法示例
2019/02/28 Javascript
使用webpack编译es6代码的方法步骤
2019/04/28 Javascript
vue递归组件实战之简单树形控件实例代码
2019/08/27 Javascript
一步一步实现Vue的响应式(对象观测)
2019/09/02 Javascript
微信小程序点击view动态添加样式过程解析
2020/01/21 Javascript
js 计算月/周的第一天和最后一天代码
2020/02/01 Javascript
javascript canvas封装动态时钟
2020/09/30 Javascript
[00:53]TI3正赛第三天 DK怒破A队不败金身 现场国旗飘扬热血激昂
2013/08/10 DOTA
简单谈谈Python中函数的可变参数
2016/09/02 Python
浅谈Python由__dict__和dir()引发的一些思考
2017/10/30 Python
python使用opencv对图像mask处理的方法
2019/07/05 Python
python实现两个字典合并,两个list合并
2019/12/02 Python
浅析python 定时拆分备份 nginx 日志的方法
2020/04/27 Python
浅谈python opencv对图像颜色通道进行加减操作溢出
2020/06/03 Python
为什么在使用动态 SQL 语句时必须为低层数据库对象授予权限
2012/12/13 面试题
小加工厂管理制度
2014/01/21 职场文书
信息专业毕业生五年职业规划参考
2014/02/06 职场文书
大学生职业生涯规划书参考模板
2014/03/05 职场文书
财产保全担保书范文
2014/04/01 职场文书
公司采购主管岗位职责
2014/06/17 职场文书
2019最新婚庆对联集锦!
2019/07/10 职场文书
SONY AN-LP1 短波有源天线放大器
2021/04/22 无线电