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实现代码行数统计示例分享
Feb 10 Python
在Python下尝试多线程编程
Apr 28 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 Python
Python实现自定义函数的5种常见形式分析
Jun 16 Python
利用python GDAL库读写geotiff格式的遥感影像方法
Nov 29 Python
Python面向对象之类的内置attr属性示例
Dec 14 Python
基于树莓派的语音对话机器人
Jun 17 Python
django实现支付宝支付实例讲解
Oct 17 Python
调用其他python脚本文件里面的类和方法过程解析
Nov 15 Python
Python脚本操作Excel实现批量替换功能
Nov 20 Python
ubuntu16.04升级Python3.5到Python3.7的方法步骤
Aug 20 Python
Pycharm新手使用教程(图文详解)
Sep 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
基于mysql的论坛(7)
2006/10/09 PHP
上传文件先创建目录 再上传到目录里面去
2010/12/29 PHP
PHP实现在线阅读PDF文件的方法
2015/06/23 PHP
Yii2框架可逆加密简单实现方法
2017/08/25 PHP
javascript 读取图片文件的大小
2009/06/25 Javascript
JSON语法五大要素图文介绍
2012/12/04 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
九种js弹出对话框的方法总结
2013/03/12 Javascript
将HTML的左右尖括号等转义成实体形式的两种实现方式
2014/05/04 Javascript
JS获取iframe中longdesc属性的方法
2015/04/01 Javascript
javascript顺序加载图片的方法
2015/07/18 Javascript
jQuery.prop() 使用详解
2015/07/19 Javascript
BootStrap日期控件在模态框中选择时间下拉菜单无效的原因及解决办法(火狐下不能点击)
2016/08/18 Javascript
详解使用nvm管理多版本node的方法
2017/08/30 Javascript
JavaScript的Object.defineProperty详解
2018/07/09 Javascript
微信小程序导航栏滑动定位功能示例(实现CSS3的positionsticky效果)
2019/01/24 Javascript
js实现简单的贪吃蛇游戏
2020/04/23 Javascript
详解Vue的mixin策略
2020/11/19 Vue.js
[01:15]PWL S2开团时刻第二期——他们杀 我就白给
2020/11/25 DOTA
Python中将字典转换为列表的方法
2016/09/21 Python
Ubuntu 下 vim 搭建python 环境 配置
2017/06/12 Python
PyQt实现界面翻转切换效果
2018/04/20 Python
对Python Class之间函数的调用关系详解
2019/01/23 Python
使用pandas把某一列的字符值转换为数字的实例
2019/01/29 Python
在Python中使用filter去除列表中值为假及空字符串的例子
2019/11/18 Python
详解Canvas 实现炫丽的粒子运动效果(粒子生成文字)
2018/02/01 HTML / CSS
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
广州足迹信息技术有限公司Java软件工程师试题
2014/02/15 面试题
如何利用XMLHTTP检测URL及探测服务器信息
2013/11/10 面试题
办公室人员先进事迹
2014/01/27 职场文书
《胖乎乎的小手》教学反思
2014/02/26 职场文书
岗位廉洁从业承诺书
2014/03/28 职场文书
清明节网上祭英烈活动总结
2014/04/30 职场文书
股东授权委托书范文
2014/09/13 职场文书
少先队辅导员事迹材料
2014/12/24 职场文书
python可视化大屏库big_screen示例详解
2021/11/23 Python