python实现C4.5
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相关推荐
- 机器学习经典分类算法 —— C4.5算法(附python实现代码)
目录 理论介绍 什么是分类 分类的步骤 什么是决策树 决策树归纳 信息增益 相关理论基础 计算公式 ID3 C4.5 python实现 参考资料 理论介绍 什么是分类 分类属于机器学习中监督学习的一种 ...
- python算法书籍-有哪些用 Python 语言讲算法和数据结构的书?
1.Python数据结构篇 数据结构篇主要是阅读[Problem Solving with Python](Welcome to Problem Solving with Algorithms and ...
- python基本原理概论_怎样开始自学Python?
本人才疏学浅,学识大多浅尝辄止,故文章若有错误,不论是文字笔误还是理解有错,烦请您留言以告知,本人必定感激不尽! **Python分类下的系列文章,不断更新中,如果你迫不及待地想要看看写得如何可以先试 ...
- 利用sklearn 实现ID3、CART、C4.5 算法挑西瓜
利用sklearn 实现ID3.CART.C4.5 算法挑西瓜 一.ID3算法 1. 基础知识 2. 划分标准 3. 缺点 4. 利用sklearn实现ID3算法 二.C4.5算法 1. 基础知识 2 ...
- 【机器学习笔记7】决策树原理及应用
目录 构造决策树的算法 信息增益与信息增益比 熵 经验熵 条件熵 信息增益 信息增益率 关于CART算法和基尼系数 决策树的构建 ID3算法 C4.5算法 决策树的剪枝 预剪枝 后剪枝 利用sklea ...
- 大厂直通车【C认证】踵磅来袭
欢迎各位小伙伴们! 首先为大家推荐一款刷题神奇哦 点击链接访问牛客网 各大互联网大厂面试真题.从基础到入阶乃至原理刨析类面试题 应有尽有,赶快来装备自己吧!助你面试稳操胜券,solo全场面试官 你还在 ...
- 决策树模型 - (ID3算法、C4.5算法) - Python代码实现
目录 算法简介 信息熵(Entropy) 信息增益(Information gain) - ID3算法 信息增益率(gain ratio) - C4.5算法 源数据 代码实现 - ID3算法 代码实现 ...
- C4.5决策树生成算法完整版(Python),连续属性的离散化, 缺失样本的添加权重处理, 算法缺陷的修正, 代码等
C4.5决策树生成算法完整版(Python) 转载请注明出处:©️ Sylvan Ding ID3算法实验 决策树从一组无次序.无规则的事例中推理出决策树表示的分类规则,采用自顶向下的递归方式,在决策 ...
- python机器学习案例系列教程——决策树(ID3、C4.5、CART)
全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 决策树简介 决策树算是最好理解的分类器了.决策树就是一个多层if-else函数,就是对对象属性进行多层if-else判断,获取目标属性 ...
- 决策树之ID3、C4.5、C5.0等五大算法及python实现
每每以为攀得众山小,可.每每又切实来到起点,大牛们,缓缓脚步来俺笔记葩分享一下吧,please~ --------------------------- C5.0决策树之ID3.C4.5.C5.0算法 ...
最新文章
- ABP源码分析三十:ABP.RedisCache
- html链接外部css样式表,CSS外部样式表是什么?
- 【数据库原理及应用】经典题库附答案(14章全)——第四章:关系系统及其优化
- 基于(7, 5)归零非删余Turbo码的参数识别与分析
- 世界之窗浏览器怎么隐藏收藏栏?
- Base64 编码/解码器
- oracle重做日志的信息,Oracle重做日志和日志挖掘
- 四款主流同步软件介绍
- 2021-10-20
- Python 实现定时任务的八种方案
- 数据结构:堆栈的区别
- 码农小汪-synchronized
- matlab中画花瓣,matlab花瓣图的编程原理是什么,向天下大侠求解!!!!给力的? 爱问知识人...
- 【每日一题】一起冲击蓝桥杯吧——Day09【蓝桥真题一起练】
- cv2批量修改图片大小
- 苹果cms修改服务器,购买m1938工作室制作的苹果cms模板如何安装修改苹果cms页面说明...
- 重装系统服务器2012r2,SCCM2012R2网络部署重装系统
- 《前端》eval函数
- Tkinter Treeview tag_configure失效问题
- Vmware Ubuntu实现文件拖拽