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使用htpasswd实现基本认证授权的例子
Jun 10 Python
Python 反转字符串(reverse)的方法小结
Feb 20 Python
Numpy中转置transpose、T和swapaxes的实例讲解
Apr 17 Python
python输出100以内的质数与合数实例代码
Jul 08 Python
python实现随机梯度下降法
Mar 24 Python
Python之关于类变量的两种赋值区别详解
Mar 12 Python
python+opencv实现移动侦测(帧差法)
Mar 20 Python
快速解决jupyter启动卡死的问题
Apr 10 Python
Python flask路由间传递变量实例详解
Jun 03 Python
python爬虫工具例举说明
Nov 30 Python
Python编程根据字典列表相同键的值进行合并
Oct 05 Python
Python多线程实用方法以及共享变量资源竞争问题
Apr 12 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
递归列出所有文件和目录
2006/10/09 PHP
php MYSQL 数据备份类
2009/06/19 PHP
PHP采集利器 Snoopy 试用心得
2011/07/03 PHP
关于PHP递归算法和应用方法介绍
2013/04/15 PHP
用 Composer构建自己的 PHP 框架之使用 ORM
2014/10/30 PHP
php中chdir()函数用法实例
2014/11/13 PHP
PHP判断是否是微信打开还是浏览器打开的方法
2019/02/27 PHP
利用js实现选项卡的特别效果的实例
2013/03/03 Javascript
JavaScript制作的可折叠弹出式菜单示例
2014/04/04 Javascript
TypeScript 中接口详解
2015/06/19 Javascript
javascript检查某个元素在数组中的索引值
2016/03/30 Javascript
论Bootstrap3和Foundation5网格系统的异同
2016/05/16 Javascript
Bootstrap基本组件学习笔记之按钮组(8)
2016/12/07 Javascript
Bootstrap与Angularjs的模态框实例代码
2017/08/03 Javascript
微信小程序左滑动显示菜单功能的实现
2018/06/14 Javascript
看看“疫苗查询”小程序有温度的代码
2018/07/31 Javascript
vue elementUI使用tabs与导航栏联动
2019/06/21 Javascript
微信小程序顶部导航栏可滑动并选中放大
2019/12/05 Javascript
vue excel上传预览和table内容下载到excel文件中
2019/12/10 Javascript
在vue中使用axios实现post方式获取二进制流下载文件(实例代码)
2019/12/16 Javascript
[04:55]完美世界副总裁蔡玮:DOTA2的自由、公平与信任
2013/12/18 DOTA
[02:44]DOTA2英雄基础教程 克林克兹
2014/01/15 DOTA
python中的lambda表达式用法详解
2016/06/22 Python
Python 多线程实例详解
2017/03/25 Python
python 利用已有Ner模型进行数据清洗合并代码
2019/12/24 Python
CSS3教程(3):border-color网页边框色彩
2009/04/02 HTML / CSS
HTML5拖拽的简单实例
2016/05/30 HTML / CSS
香港No.1得奖零食网:香港零食大王
2016/07/22 全球购物
DC Shoes官网:美国滑板鞋和服饰品牌
2017/09/03 全球购物
美国潜水装备、水肺潜水和浮潜设备商店:Leisure Pro
2018/08/08 全球购物
毕业生求职简历的自我评价
2013/10/07 职场文书
节约用水倡议书
2014/04/16 职场文书
建筑院校毕业生求职信
2014/06/13 职场文书
党员群众路线教育实践活动剖析材料
2014/10/10 职场文书
大学迎新生欢迎词
2015/09/29 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python