(二)机器学习实践Python3-决策树ID3的一个简单案例
理论部分参考博客机器学习实战-决策树
"""
ID3决策树
"""
from math import log
from operator import itemgetterdef calShannonEnt(dataSet):"""计算dataset的信息熵:param dataSet::return:"""data_num = len(dataSet)labelCounts = {}for featVec in dataSet:currentLabel = featVec[-1]labelCounts[currentLabel] = labelCounts.get(currentLabel, 0) + 1ShannonEnt = 0.0for key in labelCounts:prob = float(labelCounts[key]) / data_num # 当前这类样本所占的比例ShannonEnt -= prob * log(prob, 2) # 计算信息熵(香农熵)return ShannonEntdef spiltDataSet(dataSet, axis, value):"""计算axis列特征中值为value的数据集(去除axis列):param dataSet: 需要被划分的数据集:param axis: 特征列序号:param value: 特征的值:return: axis列值为value且不包含axis列的数据集"""retDataSet = []for featVec in dataSet:if featVec[axis] == value:reductedFeatVec = featVec[:axis]reductedFeatVec.extend(featVec[axis + 1:])retDataSet.append(reductedFeatVec)return retDataSetdef createDataSet():dataSet = [[1, 1, 'yes'], [1, 1, 'yes'], [1, 0, 'no'], [0, 1, 'no'], [0, 1, 'no']]feature_labels = ['no sufaceing', 'flippers']return dataSet, feature_labelsdef chooseBestFeatureToSpilt(dataSet):"""在数据集中选择最适合分类的特征:param dataSet:数据集:return:返回特征所在的列axis存在多个最合适的特征的时候取第一个"""numFeatures = len(dataSet[0]) - 1 # 最后一列是标签值y去掉,前面的列都是特征# 计算原始的信息熵baseEntropy = calShannonEnt(dataSet)bestinforGain = 0.0bestFeature = -1for i in range(numFeatures):# 计算当前特征的值的集合featureList = [example[i] for example in dataSet]uniqueVals = set(featureList)newEntropy = 0.0# 计算根据当前特征进行划分时的信息熵的期望值(条件熵)for value in uniqueVals:subDataSet = spiltDataSet(dataSet, i, value)prob = len(subDataSet) / float(len(dataSet)) # 根据当前特征的值划分得到的数据集的比例newEntropy += prob * calShannonEnt(subDataSet)# 计算信息增益并记录信息增益最大时的特征特征序列# 信息增益最大时,新的熵最小infoGain = baseEntropy - newEntropyif infoGain > bestinforGain:bestinforGain = infoGainbestFeature = ireturn bestFeature # 如果新信息熵比原始信息熵还大就返回-1def majorityCut(classList):""":param classList: 一维特征数据集:return: 返回出现频率最高的特征的值"""classCount = {}for tmp in classList:classCount[tmp] = classCount.get(tmp, 0) + 1sortedClassCount = sorted(classCount.items(), key=itemgetter(1), reverse=True)return sortedClassCount[0][0]def creatTree(dataSet, input_feature_labels):""":param dataSet: 数据集(最后一列为label):param fetureLable: 每个特征的名称:return:"""feature_label = input_feature_labels[:] # 使用input_feature_labels的拷贝classList = [example[-1] for example in dataSet] # 当前数据集的标签# 如果该数据集的标签完全相同则停止继续划分,返回标签值if classList.count(classList[0]) == len(classList):return classList[0]# 如果数据集只有一个特征列(也就是只剩下标签了),则返回出现频率最高的标签值if len(dataSet[0]) == 1:return majorityCut(dataSet)bestFeature = chooseBestFeatureToSpilt(dataSet)bestFeatureLabel = feature_label[bestFeature]myTree = {bestFeatureLabel: {}}del (feature_label[bestFeature])featureValues = [example[bestFeature] for example in dataSet]uniqueVals = set(featureValues)for value in uniqueVals:subLabels = feature_label[:]myTree[bestFeatureLabel][value] = creatTree(spiltDataSet(dataSet, bestFeature, value), subLabels)return myTreedef classify(inputTree, featLabels, testVec):""":param inputTree: 输入树:param featLabels:每个特征的名称:param testVec:测试数据:return:返回预测值"""firstStr = list(inputTree.keys())[0]secondDict = inputTree[firstStr]featIndex = featLabels.index(firstStr)predictLabel = -1for key in secondDict.keys():if testVec[featIndex] == key:if type(secondDict[key]).__name__ == 'dict':predictLabel = classify(secondDict[key], featLabels, testVec)else:predictLabel = secondDict[key]return predictLabeldef storeTree(inputTree, filename):# 存储决策树""":param inputTree: 输入的决策树:param filename: 存储树的文件名:return:"""import picklefw = open(filename, 'wb')pickle.dump(inputTree, fw)fw.close()def grabTree(filename):import picklefr = open(filename, 'rb')return pickle.load(fr)if __name__ == "__main__":dataSet, feature_labels = createDataSet()tree = creatTree(dataSet, feature_labels)storeTree(tree, 'treeStorage.txt')mytree = grabTree('treeStorage.txt')ans = classify(mytree, feature_labels, [1, 0])print(ans)ans = classify(mytree, feature_labels, [1, 1])print(ans)
(二)机器学习实践Python3-决策树ID3的一个简单案例相关推荐
- 机器学习算法 04 —— 决策树(ID3、C4.5、CART,剪枝,特征提取,回归决策树)
文章目录 系列文章 决策树 1 决策树算法简介 2 决策树分类的原理 2.1 信息熵 2.2 决策树划分依据-信息增益(ID3) 2.3 决策树划分依据-信息增益率(C4.5) 2.4 决策树划分依据 ...
- BaseAdapter的一个简单案例
BaseAdapter的一个简单案例 主Activity import android.os.Bundle; import android.app.Activity; import android.v ...
- Python机器学习实践:决策树判别汽车金融违约用户
文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | 法纳斯特(公众号ID:walker398) 作者 | 小F 决策树呈树形结构,是一种基本的回 ...
- Python3的tkinter写一个简单的小程序
一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...
- 决策树分析例题经典案例_决策树原理及一个简单的小例子
首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...
- 性能测试入门(二)转:JMeter基础之一 一个简单的性能测试
转自:虫师博客 https://www.cnblogs.com/fnng/archive/2012/12/22/2829479.html 个人总结: 关键词:固定QPS限制,线程组设置 测试需求. 1 ...
- 一个简单案例教你如何用Typescript写Vuex
案例源代码: github.com/danielhuoo/- 前言 相信很多人都像我一样,学习使用了vuex后,想把项目改写成Typescript.但是官方教程要么晦涩难懂,要么缺少鲜活的例子.我花了 ...
- python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...
布林指标突破策略,思路非常简单.使用Python语言编写该策略,也非常容易实现,加上回测配置信息,有70行代码,实际可以更加精简,鉴于教学策略,没有使用难懂的Python语法,使用的是比较基础的语句. ...
- 21 Rest高级客户端实践(七):一个小案例
文章目录 1 准备 2 编码 1 准备 之前的索引 PUT books {"settings": {"number_of_shards": 3, "n ...
- scrapy框架系列 (2) 一个简单案例
学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的 Spider 并提取出结构化数据(Item) 编写 Item Pipelines 来存储提取到的Item(即结构化 ...
最新文章
- 如何简单地利用Bitmap为中介储存图片到数据库中
- 使用python3 解析html对称标签
- C#Windows 服务制作安装删除. 用户注销后,程序继续运行 (转载)
- BM26 求二叉树的层序遍历(变形更新中)
- 大数据 机器学习 算法概论
- html语义化有哪些优点,语义化的HTML结构到底有什么好处?
- netty支持哪些协议_从零学习netty网络IO通讯开发框架
- hybrid App cordova打包webapp PhoneGap
- 382.链表随机节点
- ADMM算法的应用: 降低SDP算法复杂度
- netty权威指南 微云_《Netty权威指南》(一)走进 Java NIO
- uniapp调起打印机(调起第三方打印软件)适用app,将页面生成图片打印的两种方式
- 聊聊测试覆盖率的六大门派
- Word2016删除插入尾注参考文献下横线
- java如何表格一样对齐_如何水平对齐表格? (How can I horizontally align a form?)
- php本地环境搭建教程,用 phpstudy 搭建本地 php 环境及安装 wordpress 教程
- Android系统打不开,安卓手机打不开pdf文件怎么解决?
- 天耀18期 -08.面向对象-上转型【作业】
- 在Java 17中偏向锁可算废了
- 模拟电路6(共射基本放大电路的组成及工作原理)