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的Django框架测试驱动开发的教程
Apr 22 Python
Python使用剪切板的方法
Jun 06 Python
Django自定义认证方式用法示例
Jun 23 Python
Windows平台Python连接sqlite3数据库的方法分析
Jul 12 Python
对Python中的条件判断、循环以及循环的终止方法详解
Feb 08 Python
Python MySQL 日期时间格式化作为参数的操作
Mar 02 Python
python GUI库图形界面开发之PyQt5多线程中信号与槽的详细使用方法与实例
Mar 08 Python
Python web如何在IIS发布应用过程解析
May 27 Python
Django中使用Celery的方法步骤
Dec 07 Python
python 第三方库paramiko的常用方式
Feb 20 Python
python FTP编程基础入门
Feb 27 Python
Python 调用C++封装的进一步探索交流
Mar 04 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
WordPress主题中添加文章列表页页码导航的PHP代码实例
2015/12/22 PHP
验证token、回复图文\文本、推送消息的实用微信类php代码
2016/06/28 PHP
PHP高并发和大流量解决方案整理
2021/03/09 PHP
一款js和css代码压缩工具[附JAVA环境配置方法]
2010/04/16 Javascript
Mac OS X 系统下安装和部署Egret引擎开发环境
2014/09/03 Javascript
使用ajax+jqtransform实现动态加载select
2014/12/01 Javascript
js实现图片点击左右轮播
2015/07/08 Javascript
JS实现弹出浮动窗口(支持鼠标拖动和关闭)实例详解
2015/08/06 Javascript
AngularJS控制器继承自另一控制器
2016/05/09 Javascript
bootstrap 表单验证使用方法
2017/01/11 Javascript
JavaScript拖动层Div代码
2017/03/01 Javascript
微信小程序图片选择、上传到服务器、预览(PHP)实现实例
2017/05/11 Javascript
Node调用Java的示例代码
2017/09/20 Javascript
javascript 开发之网页兼容各种浏览器
2017/09/28 Javascript
vue-cli项目优化方法- 缩短首屏加载时间
2018/04/01 Javascript
layui实现数据表格table分页功能(ajax异步)
2019/07/27 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
Python简单日志处理类分享
2015/02/14 Python
Python中pip安装非PyPI官网第三方库的方法
2015/06/02 Python
python先序遍历二叉树问题
2017/11/10 Python
python中将字典形式的数据循环插入Excel
2018/01/16 Python
使用python获取csv文本的某行或某列数据的实例
2018/04/03 Python
详解Python3 中hasattr()、getattr()、setattr()、delattr()函数及示例代码数
2018/04/18 Python
WIn10+Anaconda环境下安装PyTorch(避坑指南)
2019/01/30 Python
pyqt5 实现 下拉菜单 + 打开文件的示例代码
2019/06/20 Python
Django基础三之视图函数的使用方法
2019/07/18 Python
Python解决pip install时出现的Could not fetch URL问题
2019/08/01 Python
基于matplotlib中ion()和ioff()的使用详解
2020/06/16 Python
Python Selenium实现无可视化界面过程解析
2020/08/25 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
财务经理的岗位职责
2013/12/17 职场文书
工程项目建议书范文
2014/03/12 职场文书
2014年党支部书记工作总结
2014/12/04 职场文书
淮阳太昊陵导游词
2015/02/10 职场文书
Pytest实现setup和teardown的详细使用详解
2021/04/17 Python
Win11黑色桌面背景怎么办?Win11黑色壁纸解决方法汇总
2022/04/05 数码科技