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中的各种装饰器详解
Apr 11 Python
python的else子句使用指南
Feb 27 Python
关于python的bottle框架跨域请求报错问题的处理方法
Mar 19 Python
在python3.5中使用OpenCV的实例讲解
Apr 02 Python
利用Python在一个文件的头部插入数据的实例
May 02 Python
Python爬取个人微信朋友信息操作示例
Aug 03 Python
python使用knn实现特征向量分类
Dec 26 Python
Python实现高斯函数的三维显示方法
Dec 29 Python
pyqt5 键盘监听按下enter 就登陆的实例
Jun 25 Python
pytorch使用horovod多gpu训练的实现
Sep 09 Python
Python实现加密的RAR文件解压的方法(密码已知)
Sep 11 Python
python for循环赋值问题
Jun 03 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来处理多个提交任务
2006/10/09 PHP
PHP个人网站架设连环讲(二)
2006/10/09 PHP
检测png图片是否完整的php代码
2010/09/06 PHP
浅谈PHP中关于foreach使用引用变量的坑
2016/11/14 PHP
总结的一些PHP开发中的tips(必看篇)
2017/03/24 PHP
jQuery ajax+PHP实现的级联下拉列表框功能示例
2019/02/12 PHP
css把超出的部分显示为省略号的方法兼容火狐
2008/07/23 Javascript
javascript call和apply方法
2008/11/24 Javascript
JavaScript 笔记二 Array和Date对象方法
2010/05/22 Javascript
window.location.href中url中数据量太大时的解决方法
2013/12/23 Javascript
编写高效jQuery代码的4个原则和5个技巧
2014/04/24 Javascript
Nodejs的express使用教程
2015/11/23 NodeJs
JavaScript资源预加载组件和滑屏组件的使用推荐
2016/03/10 Javascript
Bootstrap教程JS插件滚动监听学习笔记分享
2016/05/18 Javascript
vuex实现简易计数器
2016/10/27 Javascript
jquery点击展示与隐藏更多内容
2016/12/03 Javascript
jQuery学习之DOM节点的插入方法总结
2017/01/22 Javascript
原生JS进行前后端同构
2018/04/22 Javascript
通过函数作用域和块级作用域看javascript的作用域链
2018/08/05 Javascript
详解Node.js异步处理的各种写法
2019/06/09 Javascript
JS async 函数的含义和用法实例总结
2020/04/08 Javascript
vue中组件通信详解(父子组件, 爷孙组件, 兄弟组件)
2020/07/27 Javascript
使用Python下载歌词并嵌入歌曲文件中的实现代码
2015/11/13 Python
详细介绍Python的鸭子类型
2016/09/12 Python
用pytorch的nn.Module构造简单全链接层实例
2020/01/14 Python
python上传时包含boundary时的解决方法
2020/04/08 Python
tensorflow之读取jpg图像长和宽实例
2020/06/18 Python
python wsgiref源码解析
2021/02/06 Python
HTML5事件方法全部汇总
2016/05/12 HTML / CSS
大学生饮食配送创业计划书
2014/01/04 职场文书
幼儿园消防安全制度
2014/01/26 职场文书
宿舍保安职务说明书
2014/02/25 职场文书
英语教育专业自荐信
2014/05/29 职场文书
2016年寒假社会实践活动总结
2015/10/10 职场文书
简历自我评价范文
2019/04/24 职场文书
《废话连篇——致新手》——chinapizza
2022/04/05 无线电