python实现C4.5

原理

原理就不在此过多赘述,可自行搜索,或者看我之前写的学习心得:https://blog.csdn.net/weixin_38273255/article/details/88752468

代码

在这里就直接上代码了。
代码和之前写的ID3大部分都是一样的,在这就不贴重复代码了,只将不同的代码在这贴出来。
之前ID3链接:https://blog.csdn.net/weixin_38273255/article/details/88981748
只需要将ID3中的creat.py换成这里的代码就可以了。
creat.py

#coding: utf-8
from numpy import *
from scipy import *
from math import log
import operator
import draw as dr#计算给定数据的香浓熵:
def calcShannonEnt(dataSet):numEntries = len(dataSet)  labelCounts = {}  #类别字典(类别的名称为键,该类别的个数为值)for featVec in dataSet:currentLabel = featVec[-1]  if currentLabel not in labelCounts.keys():  #还没添加到字典里的类型labelCounts[currentLabel] = 0 labelCounts[currentLabel] += 1 shannonEnt = 0.0  for key in labelCounts:  #求出每种类型的熵prob = float(labelCounts[key])/numEntries  #每种类型个数占所有的比值shannonEnt -= prob * log(prob, 2)return shannonEnt   #返回熵#按照给定的特征划分数据集
def splitDataSet(dataSet, axis, value):retDataSet = []  for featVec in dataSet:  #按dataSet矩阵中的第axis列的值等于value的分数据集if featVec[axis] == value:      #值等于value的,每一行为新的列表(去除第axis个数据)reducedFeatVec = featVec[:axis]reducedFeatVec.extend(featVec[axis+1:])  retDataSet.append(reducedFeatVec) return retDataSet  #返回分类后的新矩阵#选择最好的数据集划分方式
def chooseBestFeatureToSplit(dataSet):  numFeatures = len(dataSet[0])-1  #求属性的个数baseEntropy = calcShannonEnt(dataSet)bestInfoGain = 0.0  bestFeature = -1  for i in range(numFeatures):  #求所有属性的信息增益featList = [example[i] for example in dataSet]  uniqueVals = set(featList)  #第i列属性的取值(不同值)数集合newEntropy = 0.0  splitInfo = 0.0 for value in uniqueVals:  #求第i列属性每个不同值的熵*他们的概率subDataSet = splitDataSet(dataSet, i , value)  prob = len(subDataSet)/float(len(dataSet))  #求出该值在i列属性中的概率newEntropy += prob * calcShannonEnt(subDataSet)  #求i列属性各值对于的熵求和splitInfo -= prob * log(prob, 2) if splitInfo == 0:continueinfoGain = (baseEntropy - newEntropy) / splitInfo   #求出第i列属性的信息增益率print(infoGain)if(infoGain > bestInfoGain):  #保存信息增益率最大的信息增益率值以及所在的下表(列值i)bestInfoGain = infoGain  bestFeature = i  return bestFeature  #找出出现次数最多的分类名称
def majorityCnt(classList):  classCount = {}  for vote in classList:  if vote not in classCount.keys(): classCount[vote] = 0  classCount[vote] += 1  sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse=True)return sortedClassCount[0][0]  #创建树
def createTree(dataSet, labels):  classList = [example[-1] for example in dataSet]     #创建需要创建树的训练数据的结果列表(例如最外层的列表是[N, N, Y, Y, Y, N, Y])if classList.count(classList[0]) == len(classList):  #如果所有的训练数据都是属于一个类别,则返回该类别return classList[0]   if (len(dataSet[0]) == 1):  #训练数据只给出类别数据(没给任何属性值数据),返回出现次数最多的分类名称return majorityCnt(classList) bestFeat = chooseBestFeatureToSplit(dataSet)    #选择信息增益最大的属性进行分(返回值是属性类型列表的下标)bestFeatLabel = labels[bestFeat]  #根据下表找属性名称当树的根节点myTree = {bestFeatLabel:{}}  #以bestFeatLabel为根节点建一个空树del(labels[bestFeat])  #从属性列表中删掉已经被选出来当根节点的属性featValues = [example[bestFeat] for example in dataSet]  #找出该属性所有训练数据的值(创建列表)uniqueVals = set(featValues)  #求出该属性的所有值得集合(集合的元素不能重复)for value in uniqueVals:  #根据该属性的值求树的各个分支subLabels = labels[:]  myTree[bestFeatLabel][value] = createTree(splitDataSet(dataSet, bestFeat, value), subLabels)  #根据各个分支递归创建树return myTree  #生成的树#实用决策树进行分类
def classify(inputTree, featLabels, testVec):  keys = list(inputTree.keys())firstStr = keys[0]secondDict = inputTree[firstStr]  featIndex = featLabels.index(firstStr)  for key in secondDict.keys():  if testVec[featIndex] == key:  if type(secondDict[key]).__name__ == 'dict':  classLabel = classify(secondDict[key], featLabels, testVec)  else: classLabel = secondDict[key]  return classLabel  #读取数据文档中的训练数据(生成二维列表)
def createTrainData():lines_set = open('Dataset.txt','rb').readlines()labelLine = lines_set[2] labels = labelLine.strip().split()lines_set = lines_set[4:11]dataSet = [] for line in lines_set:data = line.split() dataSet.append(data) return dataSet, labels#读取数据文档中的测试数据(生成二维列表)
def createTestData():lines_set = open('Dataset.txt','rb').readlines()lines_set = lines_set[15:22]dataSet = [] for line in lines_set:data = line.strip().split() dataSet.append(data) return dataSet# myDat, labels = createTrainData()  # myTree = createTree(myDat,labels)
# print(myTree)
# dr.createPlot(myTree)
# bootList = ['outlook','temperature', 'humidity', 'windy']
# testList = createTestData()
# for testData in testList:
#     dic = classify(myTree, bootList, testData)
#     print(dic)

结果

运行结果见:
https://blog.csdn.net/weixin_38273255/article/details/88981203

python实现C4.5相关推荐

  1. 机器学习经典分类算法 —— C4.5算法(附python实现代码)

    目录 理论介绍 什么是分类 分类的步骤 什么是决策树 决策树归纳 信息增益 相关理论基础 计算公式 ID3 C4.5 python实现 参考资料 理论介绍 什么是分类 分类属于机器学习中监督学习的一种 ...

  2. python算法书籍-有哪些用 Python 语言讲算法和数据结构的书?

    1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and ...

  3. python基本原理概论_怎样开始自学Python?

    本人才疏学浅,学识大多浅尝辄止,故文章若有错误,不论是文字笔误还是理解有错,烦请您留言以告知,本人必定感激不尽! **Python分类下的系列文章,不断更新中,如果你迫不及待地想要看看写得如何可以先试 ...

  4. 利用sklearn 实现ID3、CART、C4.5 算法挑西瓜

    利用sklearn 实现ID3.CART.C4.5 算法挑西瓜 一.ID3算法 1. 基础知识 2. 划分标准 3. 缺点 4. 利用sklearn实现ID3算法 二.C4.5算法 1. 基础知识 2 ...

  5. 【机器学习笔记7】决策树原理及应用

    目录 构造决策树的算法 信息增益与信息增益比 熵 经验熵 条件熵 信息增益 信息增益率 关于CART算法和基尼系数 决策树的构建 ID3算法 C4.5算法 决策树的剪枝 预剪枝 后剪枝 利用sklea ...

  6. 大厂直通车【C认证】踵磅来袭

    欢迎各位小伙伴们! 首先为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题.从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官 你还在 ...

  7. 决策树模型 - (ID3算法、C4.5算法) - Python代码实现

    目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 ...

  8. C4.5决策树生成算法完整版(Python),连续属性的离散化, 缺失样本的添加权重处理, 算法缺陷的修正, 代码等

    C4.5决策树生成算法完整版(Python) 转载请注明出处:©️ Sylvan Ding ID3算法实验 决策树从一组无次序.无规则的事例中推理出决策树表示的分类规则,采用自顶向下的递归方式,在决策 ...

  9. python机器学习案例系列教程——决策树(ID3、C4.5、CART)

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 决策树简介 决策树算是最好理解的分类器了.决策树就是一个多层if-else函数,就是对对象属性进行多层if-else判断,获取目标属性 ...

  10. 决策树之ID3、C4.5、C5.0等五大算法及python实现

    每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- C5.0决策树之ID3.C4.5.C5.0算法 ...

最新文章

  1. ABP源码分析三十:ABP.RedisCache
  2. html链接外部css样式表,CSS外部样式表是什么?
  3. 【数据库原理及应用】经典题库附答案(14章全)——第四章:关系系统及其优化
  4. 基于(7, 5)归零非删余Turbo码的参数识别与分析
  5. 世界之窗浏览器怎么隐藏收藏栏?
  6. Base64 编码/解码器
  7. oracle重做日志的信息,Oracle重做日志和日志挖掘
  8. 四款主流同步软件介绍
  9. 2021-10-20
  10. Python 实现定时任务的八种方案
  11. 数据结构:堆栈的区别
  12. 码农小汪-synchronized
  13. matlab中画花瓣,matlab花瓣图的编程原理是什么,向天下大侠求解!!!!给力的? 爱问知识人...
  14. 【每日一题】一起冲击蓝桥杯吧——Day09【蓝桥真题一起练】
  15. cv2批量修改图片大小
  16. 苹果cms修改服务器,购买m1938工作室制作的苹果cms模板如何安装修改苹果cms页面说明...
  17. 重装系统服务器2012r2,SCCM2012R2网络部署重装系统
  18. 《前端》eval函数
  19. Tkinter Treeview tag_configure失效问题
  20. Vmware Ubuntu实现文件拖拽

热门文章

  1. 用asp.net写的一个购物网站
  2. 如何在没有安装安卓环境的mac os上装adb环境.
  3. 芭蕉树上第十二根芭蕉--opencv配置问题
  4. lpad与rpad函数
  5. 无线网络连接不上请检查服务器,为什么无线网络连接不上?
  6. RxJS 6 —— operators
  7. 兔子会死怎么办? 古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,假如兔子会死
  8. 有赞搜索系统的架构演进
  9. html向下的箭头符号,向下的箭头符号
  10. 读书笔记(一)数联网——大数据如何互联