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 相关文章推荐
以911新闻为例演示Python实现数据可视化的教程
Apr 23 Python
python实现矩阵乘法的方法
Jun 28 Python
Python的Django框架中的数据库配置指南
Jul 17 Python
python语言使用技巧分享
May 31 Python
python人民币小写转大写辅助工具
Jun 20 Python
Python多进程与服务器并发原理及用法实例分析
Aug 21 Python
编写多线程Python服务器 最适合基础
Sep 14 Python
使用 Python 实现微信群友统计器的思路详解
Sep 26 Python
django解决跨域请求的问题
Nov 11 Python
Python下利用BeautifulSoup解析HTML的实现
Jan 17 Python
python语言time库和datetime库基本使用详解
Dec 25 Python
Django视图类型总结
Feb 17 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
memcache命令启动参数中文解释
2014/01/13 PHP
php 解析xml 的四种方法详细介绍
2016/10/26 PHP
php实用代码片段整理
2016/11/12 PHP
简单JS代码压缩器
2006/10/12 Javascript
javascript forEach通用循环遍历方法
2010/10/11 Javascript
CodeMirror2 IE7/IE8 下面未知运行时错误的解决方法
2012/03/29 Javascript
js中页面的重新加载(当前页面/上级页面)及frame或iframe元素引用介绍
2013/01/24 Javascript
Javascript浮点数乘积运算出现多位小数的解决方法
2014/02/17 Javascript
javascript实现节点(div)名称编辑
2014/12/17 Javascript
js 判断附件后缀的简单实现方法
2016/10/11 Javascript
ionic cordova一次上传多张图片(类似input file提交表单)的实现方法
2016/12/16 Javascript
使用jsonp实现跨域获取数据实例讲解
2016/12/25 Javascript
PHP实现记录代码运行时间封装类实例教程
2017/05/08 Javascript
Javascript实现信息滚动效果
2017/05/18 Javascript
Vue2.0结合webuploader实现文件分片上传功能
2018/03/09 Javascript
vue实现图片预览组件封装与使用
2019/07/13 Javascript
微信小程序JS加载esmap地图的实例详解
2019/09/04 Javascript
javascript删除数组元素的七个方法示例
2019/09/09 Javascript
python 开发的三种运行模式详细介绍
2017/01/18 Python
python编程通过蒙特卡洛法计算定积分详解
2017/12/13 Python
python2.7到3.x迁移指南
2018/02/01 Python
python自动登录12306并自动点击验证码完成登录的实现源代码
2018/04/25 Python
Python 实现在文件中的每一行添加一个逗号
2018/04/29 Python
Python中偏函数用法示例
2018/06/07 Python
Python占用的内存优化教程
2019/07/28 Python
python文档字符串(函数使用说明)使用详解
2019/07/30 Python
python文件读写代码实例
2019/10/21 Python
html特殊符号示例 html特殊字符编码对照表
2014/01/14 HTML / CSS
vivo智能手机官方商城:vivo
2016/09/22 全球购物
adidas官方旗舰店:德国运动用品制造商
2017/11/25 全球购物
英国旅行箱包和行李箱购物网站:Travel Luggage & Cabin Bags
2019/08/26 全球购物
八年级数学教学反思
2014/01/31 职场文书
高中军训感言1000字
2014/03/01 职场文书
安全生产月活动总结
2014/05/04 职场文书
分居协议书范本
2014/11/03 职场文书
安全教育的主题班会
2015/08/13 职场文书