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 的 with 语句详解
Jun 13 Python
Python将阿拉伯数字转换为罗马数字的方法
Jul 10 Python
使用Python写个小监控
Jan 27 Python
Python实现网络端口转发和重定向的方法
Sep 19 Python
python 接口测试response返回数据对比的方法
Feb 11 Python
Python使用matplotlib模块绘制图像并设置标题与坐标轴等信息示例
May 04 Python
更换Django默认的模板引擎为jinja2的实现方法
May 28 Python
python实现文件的备份流程详解
Jun 18 Python
使用python分析统计自己微信朋友的信息
Jul 19 Python
Python守护进程实现过程详解
Feb 10 Python
pytorch学习教程之自定义数据集
Nov 10 Python
python基于pexpect库自动获取日志信息
Feb 01 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
上海地方志办公室-上海电子仪表工业志
2021/03/04 无线电
PHP cron中的批处理
2008/09/16 PHP
浅谈COOKIE和SESSION区别
2015/07/19 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
Laravel find in set排序实例
2019/10/09 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
2020/05/02 PHP
网络图片延迟加载实现代码 超越jquery控件
2010/03/27 Javascript
javascript限制文本框只允许输入数字(曾经与现在的方法对比)
2013/01/18 Javascript
JS 毫秒转时间示例代码
2013/09/22 Javascript
JQuery中使文本框获得焦点的方法实例分析
2015/02/28 Javascript
数组Array的排序sort方法
2017/02/17 Javascript
Node.js中Bootstrap-table的两种分页的实现方法
2017/09/18 Javascript
Vue修改mint-ui默认样式的方法
2018/02/03 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
详解vue 数组和对象渲染问题
2018/09/21 Javascript
微信小程序如何获取手机验证码
2018/11/04 Javascript
vue动态添加路由addRoutes之不能将动态路由存入缓存的解决
2019/02/19 Javascript
解决在Vue中使用axios用form表单出现的问题
2019/10/30 Javascript
JavaScript实现公告栏上下滚动效果
2020/03/13 Javascript
[04:10]2016国际邀请赛中国区预选赛第二日TOP10精彩集锦
2016/06/28 DOTA
在 Django/Flask 开发服务器上使用 HTTPS
2014/07/03 Python
在Django中创建URLconf相关的通用视图的方法
2015/07/20 Python
numpy.linspace 生成等差数组的方法
2018/07/02 Python
python3通过selenium爬虫获取到dj商品的实例代码
2019/04/25 Python
python 实现将Numpy数组保存为图像
2020/01/09 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
关于Python 中的时间处理包datetime和arrow的方法详解
2020/03/19 Python
有影响力的品牌之家:Our Social Collective
2019/06/08 全球购物
在阿联酋购买翻新手机和平板电脑:Teckzu
2021/02/12 全球购物
C# .NET面试题
2015/11/28 面试题
质检部部长职责
2013/12/16 职场文书
学校纪律作风整改措施思想汇报
2014/10/11 职场文书
2015年科协工作总结
2015/05/19 职场文书
JavaScript选择器函数querySelector和querySelectorAll
2021/11/27 Javascript
Sql Server 行数据的某列值想作为字段列显示的方法
2022/04/20 SQL Server
ubuntu如何搭建vsftpd服务器
2022/12/24 Servers