(上接第三章)

  3.3.1 信息增益率

  信息增益率的定义如下:

  GainRatio(S,A) = Gain(S,A)/SplitInfo(S,A)

  其中Gain(S,A)就是ID3算法中的信息增益,而划分信息SplitInfo(S,A)代表了按照特征A划分样本集S的广度和均匀性。

  

  其中Si到Sc是特征A的C个不同值构成的样本子集

  3.3.2 C4.5的实现

  

#coding:utf-8from numpy import *
import math
import copy
import cPickle as pickle# 定义一个ID3DTree的类来封装算法:
class ID3DTree(object):def __init__(self):        #构造方法self.tree    = {}      #生成的树self.dataSet = []      #数据集self.label   = []      #标签集#数据导入函数def loadDataSet(self,path,labels):recordlist   = []fp           = open(path,"rb")content      = fp.read()fp.close()rowlist      = content.splitlines() #按行转换为一维表recordlist   = [row.split(" ") for row in rowlist if row.strip()]self.dataSet = recordlistself.labels  = labels#执行决策树函数def train(self):labels    = copy.deepcopy(self.labels)self.tree = self.buildTree(self.dataSet,labels)# 3.2.3 决策树主方法# (1)构建决策树:创建决策树主程序def buildTree(self,dataSet,labels):cateList = [data[-1] for data in dataSet]  #抽取源数据集的决策标签列#程序的终止条件1:如果classList只有一种决策标签,停止划分,返回这个决策标签if cateList.count(cateList[0]) == len(cateList):return cateList[0]#程序的终止条件2:如果数据集的第一个决策标签只有一个,则返回这个决策标签if len(dataSet[0]) == 1:return self.maxCate(cateList)#算法核心:bestFeat,featValueList = self.getBestFeat(dataSet)  #返回数据集的最优特征轴bestFeatLabel = labels[bestFeat]tree          = {bestFeatLabel:{}}del(labels[bestFeat])#抽取最优特征轴的列向量# uniqueVals = set([data[bestFeat] for data in dataSet]) #去重for value in featValueLis:  #决策树递归生长subLabels = labels[:]  #将删除后的特征类别接建立子类别集#按最优特征列和值分割数据集splitDataset = self.splitDataSet(dataSet,bestFeat,value)subTree      = self.buildTree(splitDataset,subLabels)tree[bestFeatLabel][value] = subTreereturn tree#计算出现次数最多的类别标签def maxCate(self,catelist):items = dict([(catelist.count(i),i) for i in catelist])return items([max(items.keys())])#计算最优特征def getBestFeat(self,dataSet):#计算特征向量维,其中最后一列用于类别标签,因此要减去# numFeatures  = len(dataSet[0])-1             #特征向量维数=行向量维数-1Num_Feats    = len(dataSet[0][:-1])totality     = len(dataSet)BaseEntropy  = self.computeEntropy(dataSet)  #基础熵:源数据香农熵ConditionEntropy = []                        #初始化条件熵slpitInfo    = []                            #for C4.5,calculate gain ratooallFeatVList = []for f in xrange(Num_Feats):featList = [example[f] for example in dataSet][splitI,featureValueList] = self.computeSplitInfo(featList)allFeatVList.append(featureValueList)slpitInfo.append(splitI)resultGain = 0.0for value in featureValueList:subSet     = self.splitDataSet(dataSet,f,value)appearNum  = float(len(subSet))subEntropy = self.computeEntropy(subSet)resultGain += (appearNum/totality)*subEntropyConditionEntropy.append(resultGain)     #总条件熵infoGainArray    = BaseEntropy*ones(Num_Feats)-array(ConditionEntropy)infoGainRatio    = infoGainArray/array(slpitInfo) #c4.5 信息增益的计算bastFeatureIndex = argsort(-infoGainArray)[0]return bastFeatureIndex ,allFeatVList[bastFeatureIndex]#计算信息熵def computeEntropy(self,dataSet):              #计算香农熵datalen  = float(len(dataSet))cateList = [data[-1] for data in dataSet]  #从数据集中得到类别标签#得到类别为key,出现次数value的字典items    = dict([(i,cateList.count(i)) for i in cateList])infoEntropy = 0.0for key in items: #香农熵:=-p*log2(p) --infoEntropy = -prob*log(prob,2)prob = float(items[key])/dataleninfoEntropy -= prob*math.log(prob,2)return infoEntropy#(5)划分数据集:分割数据集;删除特征轴所在的数据列,返回剩余的数据集def splitDataSet(self,dataSet,axis,value):rtnList = []for featVec in dataSet:if featVec[axis] == value:rFeatVec     = featVec[:axis]    #list操作:提取0~(axis-1)的元素rFeatVec.extend(featVec[axis+1:])#lsit操作:将特征轴(列)之后的元素加回
                rtnList.append(rFeatVec)return rtnList                          #剔除已选择的一列#计算划分信息def computeSplitInfo(self,featureVList):numEntries = len(featureVList)featureValueSetList = list(set(featureVList))valueCount = [featureVList.count(featVec) for featVec in featureValueSetList]#caclulate shannonEntpList = [float(item)/numEntries from item in valueCount]lList [item*math.log(item,2) for item in pList]splitInfo = -sum(lList)return splitInfo,featureValueSetList

  

转载于:https://www.cnblogs.com/wuchuanying/p/6245115.html

郑捷《机器学习算法原理与编程实践》学习笔记(第三章 决策树的发展)(二)_C4.5...相关推荐

  1. 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...

    7.1.1 回归与现代预测 7.1.2 最小二乘法 7.1.3 代码实现 (1)导入数据 def loadDataSet(self,filename): #加载数据集X = [];Y = []fr = ...

  2. 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD...

    4.5.1 SVD算法回顾 A = U∑VT 其中:A是N*M的矩阵,U是M*M的方阵(里面向量正交,称为左奇异向量),∑是一个M*N的矩阵,VT是一个N*N的矩阵(里面向量正交,右奇异向量) 那么奇 ...

  3. 【机器学习】《统计学习方法》学习笔记 第三章 k近邻法

    第三章 k k k 近邻法(KNN) 多分类模型,思路是将最近的 N N N 个邻居的分类值中的多数作为自己的分类值.没有显式的学习过程. 三个基本要素:距离度量. k k k 值选择和分类决策规则. ...

  4. 《机器学习:算法原理与编程实践》的读书笔记:SMO部分最难,大部分代码基于Scikit-Learn,决策树其实用处不大

    机器学习:算法原理与编程实践 目录 [隐藏] 1 机器学习的基础 2 中文文本分类 3 决策树的发展 4 推荐系统原理 5 梯度寻优 6 神经网络初步 7 预测的技术与哲学 8 万能分类器:SVM 9 ...

  5. OpenCV4机器学习算法原理与编程实战(附部分模型下载地址)

    一直想找本书,能在机器学习复杂的算法原理和高效的编程实战之间达到合适的平衡:让感兴趣的同学拿到就有能用的代码,还有基本原理的介绍,因为了解原理才知道什么时候用什么算法最合适,以及如何调整参数. 一直没 ...

  6. Python快速编程入门#学习笔记01# |第一章 :Python基础知识 (Python发展历程、常见的开发工具、import模块导入)

    全文目录 ==先导知识== 1 认识Python 1.1.1 Python的发展历程 1.1.2 Python语言的特点 2. Python解释器的安装与Python程序运行 1.2.1 安装Pyth ...

  7. Java编程思想学习笔记-第11章

    <?xml version="1.0" encoding="utf-8"?> Java编程思想学习笔记-第11章 Java编程思想学习笔记-第11章 ...

  8. Python快速编程入门#学习笔记03# |第二章 :Python基础(代码格式、标识符关键字、变量和数据类型、数字类型以及运算符)

    全文目录 ==先导知识== 学习目标: 2.1 代码格式 2.1.1 注释 2.1.2 缩进 2.1.3 语句换行 2.2 标识符和关键字 2.2.1 标识符 2.2.2 关键字 2.3 变量和数据类 ...

  9. python画一片树叶的故事_《Python数据分析与机器学习实战-唐宇迪》读书笔记第7章--决策树...

    第7章决策树 决策树算法是机器学习中最经典的算法之一.大家可能听过一些高深的算法,例如在竞赛中大杀四方的Xgboost.各种集成策略等,其实它们都是基于树模型来建立的,掌握基本的树模型后,再去理解集成 ...

  10. Opencv3编程入门学习笔记(三)之访问图像像素的三种方法

    访问图像像素的三种方法:指针访问,迭代器访问,动态地址访问.访问最快的为指针访问,以下算法在几毫秒,但指针访问容易造成内存泄漏:其次为迭代器访问:最后为动态地址访问. 以下程序是根据<OpenC ...

最新文章

  1. 2021年,自动驾驶将我们带到何处去?
  2. TensorFlow 等“开源陷阱,会掐住中国 AI 企业的命门吗?
  3. js实现全选和反选功能
  4. 音视频技术开发周刊 | 139
  5. java反射教程_Java反射教程
  6. 吴恩达深度学习 —— 4.7 参数 vs. 超参数
  7. PHP版本选择讲解:VC6与VC9,Thread Safe与None-Thread Safe等的选择
  8. c++怎么打印出句子中的各个单词_小学英语单词汇总篇 身体 食品、饮料 蔬菜...
  9. nagios安装文档
  10. 【python】编程语言入门经典100例--30
  11. 接入淘宝客+拼多多(多多客)+京东进行优惠券推广
  12. 移动招聘笔试计算机类,安徽移动计算机类笔试经验
  13. PDF文档加密签名处理
  14. 微信小程序开发手册离线版本-下载
  15. 【Unity国际版下载地址】
  16. 现下追求互动体验强的时代,企业展厅给客户传递更为全面的信息
  17. Python|range函数用法完全解读
  18. java8 朗姆表达式,Python基础
  19. 手机QQ协议抓包教程
  20. linux中$符号有什么作用,linux中的“$”符号表示什么

热门文章

  1. 削峰填谷,你只知道消息队列?
  2. 序列化对象互转--Jackson中的ObjectMapper,解决超类派生问题,序列化问题
  3. idea中module项目没有蓝色小方块问题
  4. 弗吉尼亚理工大学计算机科学,弗吉尼亚理工大学计算机科学排名第45(2020年TFE美国排名)...
  5. Django 数据迁移导入导出
  6. 神威太湖之光是微型计算机,计算机“天河二号“、“神威·太湖之光“是( )。...
  7. 如何制作一个蓄力跳的功能
  8. 树莓派/arm设备上安装火狐Firefox浏览器
  9. Frida 代码提示
  10. 防范WiFi探针嗅探敏感数据的保护方法