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 相关文章推荐
tornado框架blog模块分析与使用
Nov 21 Python
python基础教程之基本数据类型和变量声明介绍
Aug 29 Python
python中正则表达式的使用详解
Oct 17 Python
Python全局变量操作详解
Apr 14 Python
Python通过Django实现用户注册和邮箱验证功能代码
Dec 11 Python
浅谈python 读excel数值为浮点型的问题
Dec 25 Python
对python 判断数字是否小于0的方法详解
Jan 26 Python
Python中按键来获取指定的值
Mar 02 Python
Gauss-Seidel迭代算法的Python实现详解
Jun 29 Python
python__new__内置静态方法使用解析
Jan 07 Python
Python3自动生成MySQL数据字典的markdown文本的实现
May 07 Python
Python Django路径配置实现过程解析
Nov 05 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
thinkphp实现面包屑导航(当前位置)例子分享
2014/05/10 PHP
php多线程并发实现方法
2016/09/30 PHP
PHP应用跨时区功能的实现方法
2019/03/21 PHP
在IE下获取object(ActiveX)的Param的代码
2009/09/15 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
Highcharts 非常实用的Javascript统计图demo示例
2013/07/03 Javascript
几种延迟加载JS代码的方法加快网页的访问速度
2013/10/12 Javascript
Javascript中的回调函数和匿名函数的回调示例介绍
2014/05/12 Javascript
jQuery中die()方法用法实例
2015/01/19 Javascript
简介JavaScript中用于处理正切的Math.tan()方法
2015/06/15 Javascript
JS实现状态栏跑马灯文字效果代码
2015/10/24 Javascript
vue与bootstrap实现时间选择器的示例代码
2017/08/26 Javascript
微信小程序 MinUI组件库系列之badge徽章组件示例
2018/08/20 Javascript
JS实现百度网盘任意文件强制下载功能
2018/08/31 Javascript
微信小程序授权登录解决方案的代码实例(含未通过授权解决方案)
2019/05/10 Javascript
Django中实现一个高性能计数器(Counter)实例
2014/07/09 Python
python 获取网页编码方式实现代码
2017/03/11 Python
Python基于matplotlib绘制栈式直方图的方法示例
2017/08/09 Python
Centos下实现安装Python3.6和Python2共存
2018/08/15 Python
Python闭包思想与用法浅析
2018/12/27 Python
Python3 执行系统命令并获取实时回显功能
2019/07/09 Python
python虚拟环境模块venv使用及示例
2020/03/04 Python
使用python实现微信小程序自动签到功能
2020/04/27 Python
Django使用rest_framework写出API
2020/05/21 Python
日本民宿预约平台:STAY JAPAN
2017/07/01 全球购物
Lulu Guinness露露·吉尼斯官网:红唇包
2019/02/03 全球购物
软件测试工程师面试问题精选
2016/10/28 面试题
会计人员岗位职责
2014/03/19 职场文书
《东方明珠》教学反思
2014/04/20 职场文书
银行职员自我鉴定
2014/04/20 职场文书
大学新生军训自我鉴定范文
2014/09/13 职场文书
开业庆典活动策划方案
2014/09/21 职场文书
2015年城管个人工作总结范文
2015/04/20 职场文书
2015年保险业务员工作总结
2015/05/27 职场文书
永远是春天观后感
2015/06/12 职场文书
Mysql索引失效 数据库表中有索引还是查询很慢
2022/05/15 MySQL