这里是3.x版本的Python,对代码做了一些修改。
其中画图的函数直接使用的是原代码中的函数,也做了一些修改。

书本配套的数据和2.7版本的源码可以在这里获取 :https://www.manning.com/books/machine-learning-in-action

from math import log
from ch3.treePlotter import createPlotdef calShannonEntropy(dataset):"""计算香浓熵:param dataset: 输入数据集:return: 熵"""num = len(dataset)label_liat = {}for x in dataset:label = x[-1]  # the last column is labelif label not in label_liat.keys():label_liat[label]=0label_liat[label] += 1shannonEnt = 0.0for key in label_liat:prob = float(label_liat[key]/num)shannonEnt -= prob * log(prob,2)# print("数据集的香浓熵为%f" % shannonEnt)return shannonEntdef splitDate(dataset, axis, value):"""根据某个特征划分数据集,:param dataset: 输入数据集:param axis: 数据集的每一列表示一个特征,axis取不同的值表示取不同的特征:param value: 根据这个特征划分的类别标记,在二叉树中常为2个,是或者否:return: 返回去掉了某个特征并且值是value的数据"""newdataset = []for x in dataset:if x[axis] == value:reduceFeat = x[:axis]reduceFeat.extend(x[axis+1:])newdataset.append(reduceFeat)return newdatasetdef keyFeatureSelect(dataset):"""通过信息增益判断哪个特征是关键特征并返回这个特征:param dataset: 输入数据集:return: 特征"""num_feature = len(dataset[0])-1base_entropy = calShannonEntropy(dataset)bestInfogain = 0bestfeature = -1for i in range(num_feature):featlist = [example[i] for example in dataset]feat_value = set(featlist)feat_entropy = 0for value in feat_value:subset = splitDate(dataset,i,value)prob = len(subset)/float(len(dataset))feat_entropy += prob * calShannonEntropy(subset)infoGain = base_entropy - feat_entropy# print("第%d个特征的信息增益%0.3f" %(i,infoGain))if (infoGain > bestInfogain):bestInfogain = infoGainbestfeature = i# print("第%d个特征最关键" % i)return  bestfeaturedef voteClass(classlist):"""通过投票的方式决定类别:param classlist: 输入类别的集合:return: 大多数类别的标签"""import operatorclasscount = {}for x in classlist:if x not in classcount.keys():classcount[x]=0classcount += 1sortclass = sorted(classcount.iteritems(),key = operator.itemgetter(1),reverse=True)return sortclass[0][0]def createTree(dataset,labels):"""递归构建树:param dataset: dataset:param labels: labels of feature:return:树"""labelsCopy = labels[:]          # 原代码没有这个,结果第一次运行之后第一个特征被删除了,所以做了修改classList = [example[-1] for example in dataset]if classList.count(classList[0]) == len(classList): #判断所有类标签是否相同return classList[0]if len(dataset[0]) == 1: # 是否历遍了所有特征(是否剩下一个特征)return voteClass(classList)bestFeat = keyFeatureSelect(dataset)bestFeatLabel = labelsCopy[bestFeat]tree = {bestFeatLabel:{}} # 使用字典实现树del labelsCopy[bestFeat]featValues = [example[bestFeat] for example in dataset]uniqueValue = set(featValues)for value in uniqueValue:subLabels = labelsCopy[:] #复制类标签到新的列表中,保证每次递归调用不改变原始列表tree[bestFeatLabel][value] = createTree(splitDate(dataset,bestFeat,value),subLabels)return treedef decTreeClassify(inputTree, featLables, testVec):"""使用决策树模型进行分类:param inputTree::param featLables::param testVec::return:"""firstStr = list(inputTree.keys())[0]    # 根节点secondDict = inputTree[firstStr]        # 节点下的值featIndex = featLables.index(firstStr)  # 获得第一个特征的label对应数据的位置for key in secondDict.keys():           # secondDict.keys()表示一个特征的取值if testVec[featIndex] == key:       # 比较测试向量中的值和树的节点值if type(secondDict[key]).__name__ == 'dict':classLabel = decTreeClassify(secondDict[key], featLables, testVec)else:classLabel = secondDict[key]return classLabeldef storeTree(inputTree, filename):"""store the trained Tree.:param inputTree: the the trained Tree:param filename: save tree as file name:return: None"""import picklefw = open(filename,'wb')pickle.dump(inputTree,fw)fw.close()print("tree save as", filename)def grabTree(filename):"""read stored tree from disk:param filename: the goal file:return: Tree"""print("load tree from disk...")import picklefr = open(filename,"rb")return pickle.load(fr)if __name__== '__main__':fr = open('lenses.txt')lense = [inst.strip().split('\t') for inst in fr.readlines()]train_set = lense[1:]test_set = lense[0]lenseLabels = ['age', 'prescript', 'astigmatic', 'tearRate']lenseTree = createTree(train_set, lenseLabels)createPlot(lenseTree)storeTree(lenseTree, 'lenseTree.txt')restoreTree = grabTree('lenseTree.txt')print(restoreTree)predict = decTreeClassify(restoreTree,lenseLabels,test_set)print(predict)

画出来的图:

运行结果:

{'tearRate': {'reduced': 'no lenses', 'normal': {'astigmatic': {'yes': {'prescript': {'myope': 'hard', 'hyper': {'age': {'pre': 'no lenses', 'presbyopic': 'no lenses', 'young': 'hard'}}}}, 'no': {'age': {'pre': 'soft', 'presbyopic': {'prescript': {'myope': 'no lenses', 'hyper': 'soft'}}, 'young': 'soft'}}}}}}

预测结果:

no lenses

参考《机器学习实战》

决策树实战2-使用决策树预测隐形眼镜类型相关推荐

  1. 机器学习实战3.3决策树项目案例02:预测隐形眼镜类型

    搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多人工智能.机器学习干货 csdn:https://blog.csdn.net/baidu_31657889/ github ...

  2. 机器学习实战--决策树ID3的构建、画图与实例:预测隐形眼镜类型

    声明 本文参考了<机器学习实战>书中代码,结合该书讲解,并加之自己的理解和阐述 机器学习实战系列博文 机器学习实战--k近邻算法改进约会网站的配对效果 机器学习实战--决策树的构建.画图与 ...

  3. 徒手写代码之《机器学习实战》-----决策树算法(2)(使用决策树预测隐形眼镜类型)

    使用决策树预测隐形眼镜类型 说明: 将数据集文件 'lenses.txt' 放在当前文件夹 from math import log import operator 熵的定义 "" ...

  4. 机器学习实战之决策树(四)示例:预测隐形眼镜类型(含数据集)

    决策树(四)示例:预测隐形眼镜类型 流程 代码 决策树小结 转载请注明作者和出处:https://blog.csdn.net/weixin_45814668 微信公众号:qiongjian0427 知 ...

  5. 《机器学习实战》学习笔记:绘制树形图使用决策树预测隐形眼镜类型

    上一节实现了决策树,但只是使用包含树结构信息的嵌套字典来实现,其表示形式较难理解,显然,绘制直观的二叉树图是十分必要的.Python没有提供自带的绘制树工具,需要自己编写函数,结合Matplotlib ...

  6. 机器学习——决策树实践(预测隐形眼镜类型)

    前言 之前把<机器学习实战>这本书的分类部分学完了,想自己动手实践一下,所以从前面的章节开始,慢慢熟悉代码. 今天在学习决策树的时候,发现书中并没有直接给出预测隐形眼镜类型的代码,于是想借 ...

  7. 【python和机器学习入门2】决策树3——使用决策树预测隐形眼镜类型

    参考博客:决策树实战篇之为自己配个隐形眼镜 (po主Jack-Cui,<--大部分内容转载自 参考书籍:<机器学习实战>--第三章3.4 <--决策树基础知识见前两篇 , 摘要 ...

  8. 03_使用决策树预测隐形眼镜类型

    使用决策树预测隐形眼镜类型 1.实验描述 使用Python编程,输入为隐形眼镜数据集,计算所有可能的特征的信息增益,选择最优的特征值划分数据集,进而递归地构建决策树.其中为了更加直观地呈现决策树,使用 ...

  9. 决策树(四):使用决策树预测隐形眼镜类型

    使用决策树预测隐形眼镜类型 介绍 代码部分 总结 介绍 本节我们将通过一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类型.使用小数据集 ,我们就可以利用决策树学到很多知识:眼科医生是如何判断患者需要 ...

  10. 决策树实例之预测隐形眼镜类型

    本节我们将通过一个例子讲解决策树如何预测患者需要佩戴的隐形眼镜类别,使用小数据集,我们就可以利用决策树学到很多知识 使用决策树预测隐形眼镜类型 收集数据:提供的文本文件 准备数据:解析tab键分隔的数 ...

最新文章

  1. 代码管理和版本管理的作业流程以及规范是怎样的?
  2. linux 命令访问url: curl http://www.baidu.com/index.html
  3. Nacos 1.0.0 GA,架构、功能与 API 设计全面重构
  4. 硬盘安装WIN7方法
  5. Spring 事务core 模块-RowMapper
  6. centos6上安装mysql8.0版本
  7. vs连接oracle数据库报错,用VS连接oracle数据库时ORA-12504错误
  8. [Leetcode] single number ii 找单个数
  9. APICloud开发者进阶之路 |纯手工编写日程表功能
  10. Magento的基本架构解析
  11. Bitbake基本语法
  12. Java对象的生与死
  13. 简单易用的C/C++ 图像库 stb_image stb_image_write
  14. 获取input输入值和获取form表单中的组件输入值区别
  15. 3月20 Bundle Adjustment光束平差法概述
  16. 2021年美容师(初级)报名考试及美容师(初级)考试试卷
  17. Selenium用户指南 - 第一章 Selenium 2.0 文档修订注解
  18. 传输媒体、表示媒体、感觉媒体、表现媒体的区别
  19. 求生之路2服务器搭建指南个人存档
  20. 菜鸟窝Kotlin+Jetpack实战学习笔记

热门文章

  1. 计算机文件是怎么存储的,电脑中重要的文档如何保存?有哪些的方法呢?
  2. 6页的试卷怎么打印?想要打印试卷去哪里打印
  3. 【车载IoT】国标《电动汽车远程服务与管理系统技术规范》:系统架构及协议概述
  4. Windows Server 2008(基本环境配置)
  5. 巴菲特致股东的一封信:1994年
  6. Microsoft Visual C++运行库下载地址 2008~2017等各版本下载
  7. DOTA HELPER 2.52 下载 魔兽本本转换器V3.2
  8. 正大国际期货:外盘期货交易中常见的五类技术分析方法
  9. 计算机网络——运输层协议
  10. 一些做谱面会用上的工具