Chapter3 绘制决策树

Posted gao79138

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Chapter3 绘制决策树相关的知识,希望对你有一定的参考价值。

绘制决策树


1. 概述

    我们在上个博客已经学会使用代码来构造决策树了。但是,为了让构造出来的决策树具有可读性,我们还需要绘制决策树。

2. 设定样式

# 该代码的作用是设定节点和箭头的样式
# 该代码位于treePlotter.py文件中

import matplotlib.pyplot as plt

\'\'\'
    在matplotlib中,dict函数用于定义文本框和箭头样式
    其中:boxstyle参数就代表文本框样式 fc代表颜色深度,fc越小,颜色越深
         arrowstyle参数代表箭头样式
\'\'\'
decisionNode = dict(boxstyle=\'sawtooth\',fc=\'0.8\')   # 决策节点的样式
leafNode = dict(boxstyle=\'round4\',fc=\'0.8\')     # 叶节点的样式
arrow_args = dict(arrowstyle=\'<-\')              # 边的样式(箭头)

3. 使用annotations来绘制树节点

# 该函数的作用就是绘制树节点
# 该函数位于treePlotter.py文件中
def plotNode(nodeTxt,centerPt,parentPt,nodeType):
    # 这里的内容可以参见我的matplotlib博客:Chapter5 注解
sub_plot.annotate(nodeTxt,xy=parentPt,xycoords=\'axes fraction\',xytext=centerPt,textcoords=\'axes fraction\',
                 va=\'center\',ha=\'center\',bbox=nodeType,arrowprops=arrow_args)

4. 绘制子图并进行初步的显示

# 当frameon=True的时候, 图示会被绘制在一个patch实体上;
# 否则, 如果frameon=False, 则图示会被直接绘制在图片上.
# 这里, 讨论是否将图示绘制在一个patch实体上的意义在于,
# 当把它绘制在一个patch实体上时, 我们才可以使用facecolor, edgecolor, framealpha, fancybox等参数来设置图示的背景(不是图片的背景)的颜色, 边框颜色, 透明度, 以及形状,
# 而当frameon=False的时候这些参数就会失效.
# 以上内容来源于:https://blog.csdn.net/nankai0912678/article/details/109520614
def createPlot():
    fig = plt.figure(1,facecolor=\'white\')
    fig.clf()
    global sub_plot
    sub_plot = plt.subplot(111,frame_on=False)    # 创建子图
    plotNode(\'decision Node\',(0.5,0.1),(0.1,0.5),decisionNode)    # 绘制树节点
    plotNode(\'leaf Node\',(0.8,0.1),(0.3,0.8),leafNode)            # 同上
    plt.show()

    我们学会了如何绘制节点后,接下来我们就来绘制整棵树。

Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像

Step 1: 下载Graphviz安装包与Graphviz的安装

戳一戳👉进入Graphviz下载官网

(1)进入网站之后根据自身计算机的系统下载相应的安装包

(2)下载之后将会得到一个如下图所示的文件

(3)双击此文件进行安装




此处注意选择第2项或第3项,这样会自动添加系统的环境变量
当然,如果一不小心选错了,可以选择回退进行更改,也可以找到Graphviz的安装的位置,手动添加系统环境变量(随后将会讲述手动添加环境变量的具体步骤)

文件并不是很大,简单起见,我就直接使用其提供的默认地址进行安装了。

在这一步中,我使用的开发平台是Visual Studio Code,所以我就选择了这个文件夹,不过好像没啥影响,就是创建一个快捷方式而已,不影响使用。也可以选择不创建快捷方式。点击安装等待几秒就安装成功了。

补充:手动添加系统变量的步骤

(1)复制graphviz的安装地址(请结合下图安装时所选择的地址找安装位置):


(2)使用快捷键Win+Q,并键入环境变量关键字并打开

(3)添加系统环境变量




接着一路点击确定知道窗口关闭即可。

Step 2: 下载在python中的Graphviz这个包

打开vscode,在终端中使用命令:pip install graphviz

Step 3: 套入模板进行测试

模板来源csdn用户num270710
稍微改动之后,解决了中文乱码的问题

改动部分是将每一个node和edge中加入参数fontname来展示中文。

(1)我的用字典表示的树

(2)测试结果展示

(3)测试模板源代码

from graphviz import Digraph

# 获取所有节点中最多子节点的叶节点


def getMaxLeafs(myTree):
    numLeaf = len(myTree.keys())
    for key, value in myTree.items():
        if isinstance(value, dict):
            sum_numLeaf = getMaxLeafs(value)
            if sum_numLeaf > numLeaf:
                numLeaf = sum_numLeaf
    return numLeaf


def plot_model(tree, name):
    g = Digraph("G", filename=name, format='png',
                strict=False, encoding='utf-8')
    first_label = list(tree.keys())[0]
    g.node("0", first_label, fontname='Fangsong')
    _sub_plot(g, tree, "0")
    leafs = str(getMaxLeafs(tree) // 10)
    g.attr(rankdir='LR', ranksep=leafs)
    g.view()


root = "0"


def _sub_plot(g, tree, inc):
    global root
    first_label = list(tree.keys())[0]
    ts = tree[first_label]
    for i in ts.keys():
        if isinstance(tree[first_label][i], dict):
            root = str(int(root) + 1)
            g.node(root, list(tree[first_label][i].keys())[
                   0], fontname='Fangsong')
            # 设置fontname来解决中文乱码问题
            g.edge(inc, root, str(i), fontname='Fangsong')
            _sub_plot(g, tree[first_label][i], root)
        else:
            root = str(int(root) + 1)
            g.node(root, tree[first_label][i], fontname='Fangsong')
            g.edge(inc, root, str(i), fontname='Fangsong')


my_tree = '天气': '雨': '风': '有风': 'N', '无风': 'P',
                  '晴': '湿度': '高': 'N', '正常': 'P', '多云': 'P'
print('my_tree: ', my_tree)
plot_model(my_tree, "tree.gv")
创作打卡挑战赛 赢取流量/现金/CSDN周边激励大奖

以上是关于Chapter3 绘制决策树的主要内容,如果未能解决你的问题,请参考以下文章

用python绘制决策树

Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像

Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像

Graphviz绘制决策树基于Graphviz绘制由字典形式表示的决策树图像

用 pydot 绘制决策树

绘制决策树,graphvizm pydotplus