决策树为字典格式,示例如下:

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

绘制决策树代码

import matplotlib.pyplot as plt

def getNumLeafs(myTree):

# 初始化树的叶子节点个数

numLeafs = 0

# myTree.keys()获取树的非叶子节点'no surfacing'和'flippers'

# list(myTree.keys())[0]获取第一个键名'no surfacing'

firstStr = list(myTree.keys())[0]

# 通过键名获取与之对应的值,即{0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}

secondDict = myTree[firstStr]

# 遍历树,secondDict.keys()获取所有的键

for key in secondDict.keys():

# 判断键是否为字典,键名1和其值就组成了一个字典,如果是字典则通过递归继续遍历,寻找叶子节点

if type(secondDict[key]).__name__ == 'dict':

numLeafs += getNumLeafs(secondDict[key])

# 如果不是字典,则叶子结点的数目就加1

else:

numLeafs += 1

# 返回叶子节点的数目

return numLeafs

def getTreeDepth(myTree):

# 初始化树的深度

maxDepth = 0

# 获取树的第一个键名

firstStr = list(myTree.keys())[0]

# 获取键名所对应的值

secondDict = myTree[firstStr]

# 遍历树

for key in secondDict.keys():

# 如果获取的键是字典,树的深度加1

if type(secondDict[key]).__name__ == 'dict':

thisDepth = 1 + getTreeDepth(secondDict[key])

else:

thisDepth = 1

# 去深度的最大值

if thisDepth > maxDepth: maxDepth = thisDepth

# 返回树的深度

return maxDepth

# 绘图相关参数的设置

def plotNode(nodeTxt, centerPt, parentPt, nodeType):

# annotate函数是为绘制图上指定的数据点xy添加一个nodeTxt注释

# nodeTxt是给数据点xy添加一个注释,xy为数据点的开始绘制的坐标,位于节点的中间位置

# xycoords设置指定点xy的坐标类型,xytext为注释的中间点坐标,textcoords设置注释点坐标样式

# bbox设置装注释盒子的样式,arrowprops设置箭头的样式

'''

figure points:表示坐标原点在图的左下角的数据点

figure pixels:表示坐标原点在图的左下角的像素点

figure fraction:此时取值是小数,范围是([0,1],[0,1]),在图的左下角时xy是(0,0),最右上角是(1,1)

其他位置是按相对图的宽高的比例取最小值

axes points : 表示坐标原点在图中坐标的左下角的数据点

axes pixels : 表示坐标原点在图中坐标的左下角的像素点

axes fraction : 与figure fraction类似,只不过相对于图的位置改成是相对于坐标轴的位置

'''

createPlot.ax1.annotate(nodeTxt, xy=parentPt, \

xycoords='axes fraction', xytext=centerPt, textcoords='axes fraction', \

va="center", ha="center", bbox=nodeType, arrowprops=arrow_args)

# 绘制线中间的文字(0和1)的绘制

def plotMidText(cntrPt, parentPt, txtString):

xMid = (parentPt[0] - cntrPt[0]) / 2.0 + cntrPt[0] # 计算文字的x坐标

yMid = (parentPt[1] - cntrPt[1]) / 2.0 + cntrPt[1] # 计算文字的y坐标

createPlot.ax1.text(xMid, yMid, txtString)

# 绘制树

def plotTree(myTree, parentPt, nodeTxt):

# 获取树的叶子节点

numLeafs = getNumLeafs(myTree)

# 获取树的深度

depth = getTreeDepth(myTree)

# firstStr = myTree.keys()[0]

# 获取第一个键名

firstStr = list(myTree.keys())[0]

# 计算子节点的坐标

cntrPt = (plotTree.xoff + (1.0 + float(numLeafs)) / 2.0 / plotTree.totalW, plotTree.yoff)

# 绘制线上的文字

plotMidText(cntrPt, parentPt, nodeTxt)

# 绘制节点

plotNode(firstStr, cntrPt, parentPt, decisionNode)

# 获取第一个键值

secondDict = myTree[firstStr]

# 计算节点y方向上的偏移量,根据树的深度

plotTree.yoff = plotTree.yoff - 1.0 / plotTree.totalD

for key in secondDict.keys():

if type(secondDict[key]).__name__ == 'dict':

# 递归绘制树

plotTree(secondDict[key], cntrPt, str(key))

else:

# 更新x的偏移量,每个叶子结点x轴方向上的距离为 1/plotTree.totalW

plotTree.xoff = plotTree.xoff + 1.0 / plotTree.totalW

# 绘制非叶子节点

plotNode(secondDict[key], (plotTree.xoff, plotTree.yoff), cntrPt, leafNode)

# 绘制箭头上的标志

plotMidText((plotTree.xoff, plotTree.yoff), cntrPt, str(key))

plotTree.yoff = plotTree.yoff + 1.0 / plotTree.totalD

# 绘制决策树,inTree的格式为{'no surfacing': {0: 'no', 1: {'flippers': {0: 'no', 1: 'yes'}}}}

def createPlot(inTree):

# 新建一个figure设置背景颜色为白色

fig = plt.figure(1, facecolor='white')

# 清除figure

fig.clf()

axprops = dict(xticks=[], yticks=[])

# 创建一个1行1列1个figure,并把网格里面的第一个figure的Axes实例返回给ax1作为函数createPlot()

# 的属性,这个属性ax1相当于一个全局变量,可以给plotNode函数使用

createPlot.ax1 = plt.subplot(111, frameon=False, **axprops)

# 获取树的叶子节点

plotTree.totalW = float(getNumLeafs(inTree))

# 获取树的深度

plotTree.totalD = float(getTreeDepth(inTree))

# 节点的x轴的偏移量为-1/plotTree.totlaW/2,1为x轴的长度,除以2保证每一个节点的x轴之间的距离为1/plotTree.totlaW*2

plotTree.xoff = -0.5 / plotTree.totalW

plotTree.yoff = 1.0

plotTree(inTree, (0.5, 1.0), '')

plt.show()

运行代码

# 设置画节点用的盒子的样式

decisionNode = dict(boxstyle="sawtooth", fc="0.8")

leafNode = dict(boxstyle="round4", fc="0.8")

# 设置画箭头的样式

arrow_args = dict(arrowstyle="

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

createPlot(tree_dict)

效果图

决策树构建示例

决策树实战——预测隐形眼睛类型

python中如何画出决策树_使用Python绘制决策树相关推荐

  1. python中turtle画简单表情_用Python画QQ表情中的滑稽脸

    用Python中的turtle库写的代码,写了很久终于写的比较满意了.先看一下效果图[手动滑稽] 话不多讲,直接干货吧 代码: import turtle as t def moveto(x, y): ...

  2. python中numpy数组的合并_基于Python中numpy数组的合并实例讲解

    基于Python中numpy数组的合并实例讲解 Python中numpy数组的合并有很多方法,如 - np.append() - np.concatenate() - np.stack() - np. ...

  3. python中for语句的使用_对Python中for复合语句的使用示例讲解

    当Python中用到双重for循环设计的时候我一般会使用循环的嵌套,但是在Python中其实还存在另一种技巧--for复合语句. 简单写一个小程序,用于延时循环嵌套功能如下: #!/usr/bin/p ...

  4. 用python的turtle画等边三角形讲解_通过Python turtle绘制等边三角形谈编程思维和逻辑...

    相信三角形对于绝大数人来说,是再熟悉不过的一个几何图形了,并且在现实生活和工作中也经常遇见,如果要画的话,相信很多人也会说,简单的很啊,画三条相等的线段,每两个线段的夹角为60度就可以了啊,也许我们借 ...

  5. python中mod是什么意思_【python中,mod_python到底做了些什么呢?】mod python 教程

    python 编程小白 ,不会用doctest 请大神指教怎么用!! >>> >>> def is_between(v, lower, higher): ...   ...

  6. python小海龟画房子编程_这个python海龟绘图为什么出错?

    你这连画布都没有创建呀 还是基础问题,小编来带大家了解一下海归这个模块吧,文末有福利~~ python里面的海龟理解起来有点像真实世界中的海龟.海归背着自己的房子,缓慢地四处爬.在python里面,海 ...

  7. python中二进制和文本不同_关于Python字符编码与二进制不得不说的一些事

    二进制 核心思想: 冯诺依曼 + 图灵机 电如何表示状态,才能稳定? 计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性, 简单始终是建立再稳定.可靠基础上 经过尝试10进制,但 ...

  8. python中turtle怎么确定坐标_关于Python turtle库使用时坐标的确定方法

    关于Python turtle库使用时坐标的确定方法 想画一个比较复杂的图像,而且还想用turtle画,最让人想退却的是无规律的笔势和繁多的坐标,但既然没有按奈住冲动的心,那我告诉你一个比较笨的方法吧 ...

  9. python中使用函数编程的意义_总结Python编程中函数的使用要点

    为何使用函数 最大化代码的重用和最小化代码冗余 流程的分解 编写函数 >>def语句 在Python中创建一个函数是通过def关键字进行的,def语句将创建一个函数对象并将其赋值给一个变量 ...

最新文章

  1. Codeforces 118 D. Caesar's Legions (dp)
  2. 【Jmeter】压力测试工具 Jmeter 使用
  3. 开源巨头 SUSE 收购 Rancher Labs,云原生时代来临
  4. rubymongo_mapper
  5. Jquery实现无限级树状结构并动态添加增删改等编辑功能
  6. 面试题:请介绍⼀下 JMM(Java 内存模型)
  7. 嵌入式linux加载引导内核和根文件系统的方法
  8. NLP任务增强:通过引入外部知识来提供额外信息
  9. solidity之call相关函数
  10. 多Resource文件的相互引用与合并问题及其解决方案
  11. 数据读取入门——xlsread
  12. Python数据处理Tips日期、时间数据处理方法汇总
  13. Windows主机操作系统安全加固规范
  14. 史上最全《计算机网络 自顶向下方法》答案合集
  15. 编译原理(1)词法分析程序(C++实现)
  16. Google浏览器中扩展插件方法
  17. 史上最全程序员视频+电子书资源分享
  18. Rust 中的指针:Box、Rc、Cell、RefCell
  19. Gartner:首席信息官能从IT支出中得到哪些收获?
  20. 老调重弹-access注入过主机卫

热门文章

  1. AcWing 103. 电影(离散化 + 排序)
  2. 迭代器遍历,增强for遍历
  3. 【深度学习】老师木讲架构:深度学习平台技术演进
  4. IDEA导出jar打包成exe应用程序
  5. Android判断一个点在不在多边形中
  6. java+Ssm在线信访管理系统springmvc
  7. 如何在 Mac 中运行 Office 办公软件?
  8. pxelinux.0:winboot:网络引导(启动)wim格式的windows PE系统:配置文件写法
  9. Python入门与各种系统安装部署应用
  10. Jensen不等式(琴生不等式)