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标准库之随机数 (math包、random包)介绍
Nov 25 Python
老生常谈python之鸭子类和多态
Jun 13 Python
Python使用pip安装报错:is not a supported wheel on this platform的解决方法
Jan 23 Python
Python获取网段内ping通IP的方法
Jan 31 Python
Ubuntu18.04下python版本完美切换的解决方法
Jun 14 Python
python3 使用Opencv打开USB摄像头,配置1080P分辨率的操作
Dec 11 Python
在flask中使用python-dotenv+flask-cli自定义命令(推荐)
Jan 05 Python
Pycharm小白级简单使用教程
Jan 08 Python
详谈tensorflow gfile文件的用法
Feb 05 Python
Python文件时间操作步骤代码详解
Apr 13 Python
Python 3.10 的首个 PEP 诞生,内置类型 zip() 迎来新特性(推荐)
Jul 03 Python
解决pytorch 损失函数中输入输出不匹配的问题
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
Sony CFR 320 修复改造
2020/03/14 无线电
浏览器预览PHP文件时顶部出现空白影响布局分析原因及解决办法
2013/01/11 PHP
php获取淘宝分类id示例
2014/01/16 PHP
php解析字符串里所有URL地址的方法
2015/04/03 PHP
功能强大的PHP图片处理类(水印、透明度、旋转)
2015/10/21 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
javascript 常用关键字列表集合
2007/12/04 Javascript
Jquery拖拽并简单保存的实现代码
2010/11/28 Javascript
jquery获得keycode的示例代码
2013/12/30 Javascript
Jquery对象和Dom对象的区别分析
2014/11/20 Javascript
jQuery检测输入的字符串包含的中英文的数量
2015/04/17 Javascript
javascript 中的 delete及delete运算符
2015/11/15 Javascript
jQuery代码性能优化的10种方法
2016/06/21 Javascript
Angular外部使用js调用Angular控制器中的函数方法或变量用法示例
2016/08/05 Javascript
JavaScript中this的四个绑定规则总结
2016/09/26 Javascript
bootstrap常用组件之头部导航实现代码
2017/04/20 Javascript
React操作真实DOM实现动态吸底部的示例
2017/10/23 Javascript
实用的 vue tags 创建缓存导航的过程实现
2020/12/03 Vue.js
[51:06]2018DOTA2亚洲邀请赛3月29日 小组赛A组 KG VS Liquid
2018/03/30 DOTA
[32:17]完美世界DOTA2联赛循环赛LBZS vs Forest第二场 10月30日
2020/10/31 DOTA
python实现划词翻译
2020/04/23 Python
Python模拟登录的多种方法(四种)
2018/06/01 Python
对python3新增的byte类型详解
2018/12/04 Python
使用python 写一个静态服务(实战)
2019/06/28 Python
Django Celery异步任务队列的实现
2019/07/24 Python
用Python实现校园通知更新提醒功能
2019/11/23 Python
结合CSS3的布局新特征谈谈常见布局方法
2016/01/22 HTML / CSS
浅析canvas元素的html尺寸和css尺寸对元素视觉的影响
2019/07/22 HTML / CSS
表扬信格式
2014/01/12 职场文书
关于保护环境的建议书
2014/08/26 职场文书
小学教师暑期培训方案
2014/08/28 职场文书
事业单位人员的自我评价范文
2014/09/21 职场文书
上级领导检查欢迎词
2015/09/30 职场文书
党性教育心得体会(共6篇)
2016/01/21 职场文书
《异世界四重奏》剧场版6月10日上映 PV视觉图原创角色发表
2022/03/20 日漫
python绘制云雨图raincloud plot
2022/08/05 Python