python代码实现ID3决策树算法


Posted in Python onDecember 20, 2017

本文实例为大家分享了python实现ID3决策树算法的具体代码,供大家参考,具体内容如下

''''' 
Created on Jan 30, 2015 
 
@author: 史帅 
''' 
 
from math import log 
import operator 
import re 
 
def fileToDataSet(fileName): 
  ''''' 
  此方法功能是:从文件中读取样本集数据,样本数据的格式为:数据以空白字符分割,最后一列为类标签 
     
    参数: 
      fileName:存放样本集数据的文件路径 
     
    返回值: 
      dataSet:样本集数据组成的二维数组 
  ''' 
  file=open(fileName, mode='r') 
  lines=file.readlines() 
  dataSet=[] 
  index=0 
  p=re.compile(r"\s+") 
  for line in lines: 
    line=p.split(line.strip()) 
    dataSet.append(line) 
    index+=1 
  return dataSet 
 
def calculateShannonEntropy(dataSet): 
  ''''' 
  此方法功能是:计算样本集数据类别的信息熵,样本数据的格式为二维数组 
     
    参数: 
      dataSet:样本集数据组成的二维数组 
     
    返回值: 
      shannonEntropy:样本集数据类别的信息熵 
  ''' 
  dataCount=len(dataSet) 
  classCountDic={} 
  for data in dataSet: 
    label=data[-1] 
    if label not in classCountDic.keys(): 
      classCountDic[label]=0 
    classCountDic[label]+=1 
  shannonEntropy=0.0 
  for key in classCountDic: 
    prob=float(classCountDic[key])/dataCount 
    shannonEntropy-=prob*log(prob,2) 
  return shannonEntropy 
 
def splitDataSet(dataSet,axis,value): 
  ''''' 
  此方法功能是:对样本集数据按照某一特征进行分割,使得分割后的数据集中该特征的值全部等于同一个值,并且将分割后的数据中该特征列去除 
   
    参数: 
      dataSet:待分割的样本集数据,二维数组 
      axis:特征所在样本集数据列中的位置 
      value:样本集数据分割后该特征的值 
       
    返回值: 
      splitedDataSet:按照所在位置为axis的特征进行分割,并且该特征值为value的样本集数据的子集 
  ''' 
  splitedDataSet=[] 
  for data in dataSet: 
    if data[axis]==value: 
      splitedData=data[:axis] 
      splitedData.extend(data[axis+1:]) 
      splitedDataSet.append(splitedData) 
  return splitedDataSet 
 
def chooseBestFeatureToSlipt(dataSet): 
  ''''' 
  此方法功能是:分别计算整个样本集数据的信息熵与按照各个特征分割后的数据集的信息熵之差,得到使差值最大的分割方案,得到该分割方案的特征 
   
    参数: 
      dataSet:待分割的样本集数据,二维数组 
       
    返回值: 
      bestFeature:按照分割前后信息熵差值最大的分割方案得到的特征,返回此特征所在样本集数据列中的位置 
  ''' 
  bestFeature=-1 
  dataSetShannonEntropy=calculateShannonEntropy(dataSet) 
  infoGain=0 
  featureCount=len(dataSet[0])-1 
  for i in range(featureCount): 
    featureList=[example[i] for example in dataSet] 
    featureSet=set(featureList) 
    splitedDataSetShannonEntropy=0 
    for feature in featureSet: 
      splitedDataSet=splitDataSet(dataSet,i,feature) 
      splitedDataSetShannonEntropy+=float(len(splitedDataSet))/len(dataSet)*calculateShannonEntropy(splitedDataSet) 
    if dataSetShannonEntropy-splitedDataSetShannonEntropy>infoGain: 
      infoGain=dataSetShannonEntropy-splitedDataSetShannonEntropy 
      bestFeature=i 
  return bestFeature 
 
def majorityClass(classList): 
  ''''' 
  此方法功能是:从类别列表中得到个数最多的类别 
   
    参数: 
      classList:类别列表,一维数组 
       
    返回值: 
      类别列表中个数最多的类别 
  ''' 
  classCountDic={} 
  for label in classList: 
    if label not in classCountDic.keys(): 
      classCountDic[label]=0 
    classCountDic[label]+=1 
  classCountDic=sorted(classCountDic.item(),key=operator.itemgetter(1),reverse=True) 
  return classCountDic[0][0] 
 
 
def createTree(dataSet,features): 
  ''''' 
  此方法功能是:根据训练样本集数据创建对分类最有效的决策树 
   
    参数: 
      dataSet:训练样本集数据,二维数组 
      features:与训练样本集数据中各列的特征值相对应的特征名称集合,一维数组 
     
    返回值: 
      tree:根据训练样本集数据所创建的,对分类最有效的决策树 
  ''' 
  subFeatures=features[:] 
  classList=[example[-1] for example in dataSet] 
  if classList.count(classList[0])==len(classList): 
    return classList[0] 
  if len(dataSet[0])==1: 
    return majorityClass(classList) 
  bestFeature=chooseBestFeatureToSlipt(dataSet) 
  label=subFeatures[bestFeature] 
  tree={label:{}} 
  del(subFeatures[bestFeature]) 
  featureList=[example[bestFeature] for example in dataSet] 
  featureSet=set(featureList) 
  for feature in featureSet: 
    splitedDataSet=splitDataSet(dataSet,bestFeature,feature) 
    tree[label][feature]=createTree(splitedDataSet, subFeatures) 
  return tree 
   
def classify(inX,tree,features): 
  ''''' 
  此方法功能是:根据创建好的决策树,对特定的数据进行分类 
   
    参数: 
      inX:待分类的数据,特征值向量,一维数组 
      tree:根据决策树算法创建好的最有效的决策树 
      features:与训练样本集数据中各列的特征值相对应的特征名称集合,一维数组 
       
    返回值: 
      label:待分类的数据通过决策树分类之后的类别 
  ''' 
  feature=list(tree.keys())[0] 
  featureIndex=features.index(feature) 
  secondTree=tree[feature][inX[featureIndex]] 
  if type(secondTree).__name__=="dict": 
    label=classify(inX,secondTree,features) 
  else: 
    label=secondTree 
  return label

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python里隐藏的“禅”
Jun 16 Python
Python写的贪吃蛇游戏例子
Jun 16 Python
Python库urllib与urllib2主要区别分析
Jul 13 Python
Python实现读取文件最后n行的方法
Feb 23 Python
使用pygame模块编写贪吃蛇的实例讲解
Feb 05 Python
python保存网页图片到本地的方法
Jul 24 Python
Python全排列操作实例分析
Jul 24 Python
Python二叉树的遍历操作示例【前序遍历,中序遍历,后序遍历,层序遍历】
Dec 24 Python
python实现websocket的客户端压力测试
Jun 25 Python
python 图片二值化处理(处理后为纯黑白的图片)
Nov 01 Python
python模拟点击在ios中实现的实例讲解
Nov 26 Python
python缺失值的解决方法总结
Jun 09 Python
python决策树之CART分类回归树详解
Dec 20 #Python
python中文乱码不着急,先看懂字节和字符
Dec 20 #Python
python决策树之C4.5算法详解
Dec 20 #Python
python 3.6 +pyMysql 操作mysql数据库(实例讲解)
Dec 20 #Python
python实现ID3决策树算法
Dec 20 #Python
理解python中生成器用法
Dec 20 #Python
Python利用turtle库绘制彩虹代码示例
Dec 20 #Python
You might like
一个PHP数组应该有多大的分析
2009/07/30 PHP
php 高效率写法 推荐
2010/02/21 PHP
PHP 面向对象程序设计(oop)学习笔记 (四) - 异常处理类Exception
2014/06/12 PHP
在PHP中实现使用Guzzle执行POST和GET请求
2019/10/15 PHP
QQ邮箱的一个文本编辑器代码
2007/03/14 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
jquery 操作iframe的几种方法总结
2013/12/13 Javascript
IE6已终止操作问题的2种情况及解决
2014/04/23 Javascript
javascript手风琴下拉菜单实现代码
2015/11/12 Javascript
javascript运算符——逻辑运算符全面解析
2016/06/27 Javascript
微信小程序 image组件binderror使用例子与js中的onerror区别
2017/02/15 Javascript
JS简单判断字符在另一个字符串中出现次数的2种常用方法
2017/04/20 Javascript
微信小程序 刷新上拉下拉不会断详细介绍
2017/05/11 Javascript
浅谈Angular4实现热加载开发旅程
2017/09/08 Javascript
JavaScript+H5实现微信摇一摇功能
2018/05/23 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
vue3.0中使用postcss-pxtorem的具体方法
2019/11/20 Javascript
微信小程序实现单个或多个倒计时功能
2020/11/01 Javascript
python使用WMI检测windows系统信息、硬盘信息、网卡信息的方法
2015/05/15 Python
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
详解Python中类的定义与使用
2017/04/11 Python
Python3多线程版TCP端口扫描器
2019/08/31 Python
pytorch数据预处理错误的解决
2020/02/20 Python
探究 canvas 绘图中撤销(undo)功能的实现方式详解
2018/05/17 HTML / CSS
台湾网友喜爱的综合型网路购物商城:Yahoo! 奇摩购物中心
2018/03/10 全球购物
计算机专业大学生的自我评价
2013/11/14 职场文书
党的群众路线教育实践活动批评与自我批评
2014/02/16 职场文书
团日活动总结
2014/04/28 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
中职三好学生事迹材料
2014/08/24 职场文书
法人授权委托书
2014/09/16 职场文书
民间借贷纠纷起诉书
2015/08/03 职场文书
2016教师节感恩话语
2015/12/09 职场文书
启迪人心的励志语录:脾气永远不要大于本事
2020/01/02 职场文书
Nginx如何配置Http、Https、WS、WSS的方法步骤
2021/05/11 Servers
redis不能访问本机真实ip地址的解决方案
2021/07/07 Redis