理论部分参考博客机器学习实战-决策树

"""
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的一个简单案例相关推荐

  1. 机器学习算法 04 —— 决策树(ID3、C4.5、CART,剪枝,特征提取,回归决策树)

    文章目录 系列文章 决策树 1 决策树算法简介 2 决策树分类的原理 2.1 信息熵 2.2 决策树划分依据-信息增益(ID3) 2.3 决策树划分依据-信息增益率(C4.5) 2.4 决策树划分依据 ...

  2. BaseAdapter的一个简单案例

    BaseAdapter的一个简单案例 主Activity import android.os.Bundle; import android.app.Activity; import android.v ...

  3. Python机器学习实践:决策树判别汽车金融违约用户

    文章发布于公号[数智物语] (ID:decision_engine),关注公号不错过每一篇干货. 转自 | 法纳斯特(公众号ID:walker398) 作者 | 小F 决策树呈树形结构,是一种基本的回 ...

  4. Python3的tkinter写一个简单的小程序

    一.这个学期开始学习python,但是看了python2和python3,最后还是选择了python3 本着熟悉python的原因,并且也想做一些小程序来增加自己对python的熟练度.所以写了一个简 ...

  5. 决策树分析例题经典案例_决策树原理及一个简单的小例子

    首先通过两个图来引入什么是决策树. 是否学习的决策过程 决策树是仿树结构来进行决策的,例如上图来说,我们要对'是否学习'这个问题进行决策时,通常伴随一系列的子决策.先看是否有'对象',有的话是否需要' ...

  6. 性能测试入门(二)转:JMeter基础之一 一个简单的性能测试

    转自:虫师博客 https://www.cnblogs.com/fnng/archive/2012/12/22/2829479.html 个人总结: 关键词:固定QPS限制,线程组设置 测试需求. 1 ...

  7. 一个简单案例教你如何用Typescript写Vuex

    案例源代码: github.com/danielhuoo/- 前言 相信很多人都像我一样,学习使用了vuex后,想把项目改写成Typescript.但是官方教程要么晦涩难懂,要么缺少鲜活的例子.我花了 ...

  8. python如何初始化一个二维数组_使用Python实现一个简单的商品期货布林指标突破策略...

    布林指标突破策略,思路非常简单.使用Python语言编写该策略,也非常容易实现,加上回测配置信息,有70行代码,实际可以更加精简,鉴于教学策略,没有使用难懂的Python语法,使用的是比较基础的语句. ...

  9. 21 Rest高级客户端实践(七):一个小案例

    文章目录 1 准备 2 编码 1 准备 之前的索引 PUT books {"settings": {"number_of_shards": 3, "n ...

  10. scrapy框架系列 (2) 一个简单案例

    学习目标 创建一个Scrapy项目 定义提取的结构化数据(Item) 编写爬取网站的 Spider 并提取出结构化数据(Item) 编写 Item Pipelines 来存储提取到的Item(即结构化 ...

最新文章

  1. 如何简单地利用Bitmap为中介储存图片到数据库中
  2. 使用python3 解析html对称标签
  3. C#Windows 服务制作安装删除. 用户注销后,程序继续运行 (转载)
  4. BM26 求二叉树的层序遍历(变形更新中)
  5. 大数据 机器学习 算法概论
  6. html语义化有哪些优点,语义化的HTML结构到底有什么好处?
  7. netty支持哪些协议_从零学习netty网络IO通讯开发框架
  8. hybrid App cordova打包webapp PhoneGap
  9. 382.链表随机节点
  10. ADMM算法的应用: 降低SDP算法复杂度
  11. netty权威指南 微云_《Netty权威指南》(一)走进 Java NIO
  12. uniapp调起打印机(调起第三方打印软件)适用app,将页面生成图片打印的两种方式
  13. 聊聊测试覆盖率的六大门派
  14. Word2016删除插入尾注参考文献下横线
  15. java如何表格一样对齐_如何水平对齐表格? (How can I horizontally align a form?)
  16. php本地环境搭建教程,用 phpstudy 搭建本地 php 环境及安装 wordpress 教程
  17. Android系统打不开,安卓手机打不开pdf文件怎么解决?
  18. 天耀18期 -08.面向对象-上转型【作业】
  19. 在Java 17中偏向锁可算废了
  20. 模拟电路6(共射基本放大电路的组成及工作原理)

热门文章

  1. 台式计算机怎么查是32位还是64位,Win7系统怎么看电脑是32位还是64位?
  2. STM32F103ZET6+TJA1050 HAL CAN通讯笔记
  3. Android 方法耗时打印插件
  4. ls、du命令的用法
  5. LMP90080-芯片手册
  6. DNW的详细配置及使用过程
  7. ABB 机械臂的部分代码
  8. IPS(Intrusion Prevention System)入侵防护系统原理
  9. Android SQlite基本用法
  10. Golang ToLower和ToLowerSpecial源码探究