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的Template使用指南
Sep 11 Python
Python实现把utf-8格式的文件转换成gbk格式的文件
Jan 22 Python
关于Python元祖,列表,字典,集合的比较
Jan 06 Python
python3.x实现发送邮件功能
May 22 Python
python生成密码字典的方法
Jul 06 Python
对Python 多线程统计所有csv文件的行数方法详解
Feb 12 Python
python3 json数据格式的转换(dumps/loads的使用、dict to str/str to dict、json字符串/字典的相互转换)
Apr 01 Python
Python爬虫实现百度翻译功能过程详解
May 29 Python
python爬虫把url链接编码成gbk2312格式过程解析
Jun 08 Python
用 Django 开发一个 Python Web API的方法步骤
Dec 03 Python
pdf论文中python画的图Type 3 fonts字体不兼容的解决方案
Apr 24 Python
刚学完怎么用Python实现定时任务,转头就跑去撩妹!
Jun 05 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
thinkphp的URL路由规则与配置实例
2014/11/26 PHP
PHP入门教程之日期与时间操作技巧总结(格式化,验证,获取,转换,计算等)
2016/09/11 PHP
详解thinkphp实现excel数据的导入导出(附完整案例)
2016/12/29 PHP
Laravel中为什么不使用blpop取队列详析
2018/08/01 PHP
用JavaScript获取网页中的js、css、Flash等文件
2006/12/20 Javascript
一个高效的JavaScript压缩工具下载集合
2007/03/06 Javascript
jquery imgareaselect 使用利用js与程序结合实现图片剪切
2009/07/30 Javascript
sencha touch 模仿tabpanel导航栏TabBar的实例代码
2013/10/24 Javascript
javascript scrollTop正解使用方法
2013/11/14 Javascript
ECMAScript6的新特性箭头函数(Arrow Function)详细介绍
2014/06/07 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
JAVA四种基本排序方法实例总结
2015/07/24 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
connection reset by peer问题总结及解决方案
2016/10/21 Javascript
详解JavaScript中数组的reduce方法
2016/12/02 Javascript
详解前端自动化工具gulp自动添加版本号
2016/12/20 Javascript
vue组件间通信解析
2017/03/01 Javascript
对vue里函数的调用顺序介绍
2018/03/17 Javascript
JS实现字符串中去除指定子字符串方法分析
2018/05/17 Javascript
在vue中v-bind使用三目运算符绑定class的实例
2018/09/29 Javascript
JavaScript数据结构与算法之检索算法实例分析【顺序查找、最大最小值、自组织查询】
2019/02/22 Javascript
javascript中call,apply,bind的区别详解
2020/12/11 Javascript
Python判断两个list是否是父子集关系的实例
2018/05/04 Python
使用Python写一个量化股票提醒系统
2018/08/22 Python
python xlwt如何设置单元格的自定义背景颜色
2019/09/03 Python
python切片作为占位符使用实例讲解
2021/02/17 Python
Columbia美国官网:美国著名的户外服装品牌
2016/11/24 全球购物
澳大利亚玩具剧场:Toy Playhouse
2019/03/03 全球购物
超级搞笑检讨书
2014/01/15 职场文书
小学学习雷锋活动总结
2014/07/03 职场文书
机电系毕业生求职信
2014/07/11 职场文书
2014年党员加强作风建设思想汇报
2014/09/15 职场文书
先进个人推荐材料
2014/12/29 职场文书
Python数据分析之pandas函数详解
2021/04/21 Python
Elasticsearch 聚合查询和排序
2022/04/19 Python
python运行脚本文件的三种方法实例
2022/06/25 Python