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 17 Python
在Django框架中运行Python应用全攻略
Jul 17 Python
Python爬虫代理IP池实现方法
Jan 05 Python
Python 对象中的数据类型
May 13 Python
Python+Socket实现基于UDP协议的局域网广播功能示例
Aug 31 Python
Python中__slots__属性介绍与基本使用方法
Sep 05 Python
Python打开文件,将list、numpy数组内容写入txt文件中的方法
Oct 26 Python
python代码中怎么换行
Jun 17 Python
python如何支持并发方法详解
Jul 25 Python
Pytorch 扩展Tensor维度、压缩Tensor维度的方法
Sep 09 Python
Numpy ndarray 多维数组对象的使用
Feb 10 Python
Python爬虫之自动爬取某车之家各车销售数据
Jun 02 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
PHP4实际应用经验篇(7)
2006/10/09 PHP
php xml文件操作实现代码(二)
2009/03/20 PHP
PHP基于文件存储实现缓存的方法
2015/07/20 PHP
Laravel中间件实现原理详解
2016/10/09 PHP
PHP预定义超全局数组变量小结
2018/08/20 PHP
浅谈Javascript面向对象编程
2011/11/15 Javascript
Javascript模块化编程(一)模块的写法最佳实践
2013/01/17 Javascript
js 图片随机不定向浮动的实现代码
2013/07/02 Javascript
点击弹出层外区域关闭弹出层jquery特效示例
2013/08/25 Javascript
动态添加option及createElement使用示例
2014/01/26 Javascript
js日期对象兼容性的处理方法
2014/01/28 Javascript
JS的事件绑定深入认识
2014/06/26 Javascript
AngularJS语法详解(续)
2015/01/23 Javascript
TypeOf这些知识点你了解吗
2016/02/21 Javascript
简单谈谈javascript中this的隐式绑定
2016/02/22 Javascript
JavaScript核心语法总结(推荐)
2016/06/02 Javascript
谈谈对JavaScript原生拖放的深入理解
2016/09/20 Javascript
详解axios在node.js中的post使用
2017/04/27 Javascript
Node.js JSON模块用法实例分析
2019/01/04 Javascript
利用es6 new.target来对模拟抽象类的方法
2019/05/10 Javascript
JS函数进阶之prototy用法实例分析
2020/01/15 Javascript
简单了解JavaScript作用域
2020/07/31 Javascript
为Python程序添加图形化界面的教程
2015/04/29 Python
Python实现随机生成有效手机号码及身份证功能示例
2017/06/05 Python
python 3.5实现检测路由器流量并写入txt的方法实例
2017/12/17 Python
Python实现新型冠状病毒传播模型及预测代码实例
2020/02/05 Python
python 实现图片裁剪小工具
2021/02/02 Python
判断单链表中是否存在环
2012/07/16 面试题
应届毕业生就业自荐信
2013/10/26 职场文书
物理专业本科生自荐信
2014/01/30 职场文书
素食餐饮项目创业计划书
2014/02/02 职场文书
教师节促销活动方案
2014/02/14 职场文书
初中生评语大全
2014/04/24 职场文书
知识就是力量演讲稿
2014/09/13 职场文书
laravel添加角色和模糊搜索功能的实现代码
2021/06/22 PHP
抖音动画片,皮皮虾,《治愈系》动画在用这首REMIX作为背景音乐,Anak ,The last world with you完整版
2022/03/16 杂记