解决Graphviz无法显示决策树中文问题

本文介绍如何通过Graphviz生成并转换决策树的可视化格式,包括安装配置Graphviz、修改配置支持中文显示及使用Python生成决策树等内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  1. 第一步:先下载安装Graphviz,并将其安装路径中的bin文件夹所在路径添加进系统变量里面去;
    具体步骤链接如下:
    https://blog.youkuaiyun.com/HNUCSEE_LJK/article/details/86772806
  2. 完成第一步后,需要修改graphviz配置文件,网上怎么修改众说纷纭,这么亲测有效:
    找到graphviz安装目录,进入该文件夹: G:\Program Files (x86)\Graphviz2.38\etc\fonts
    如图,打开点中文件如图,打开点中文件

将<! --Font directory list -->以下的一行修改成如下样式

修改成这个样子,如果担心出错,记得备份 哦修改成这个样子
3. 完成前两步后,可以开始生成和保存决策树了,这个可视化过程和方法很多,这里介绍一种常用的
参考链接如下:
https://blog.youkuaiyun.com/qq_22194911/article/details/80882853
https://blog.youkuaiyun.com/weixin_41713230/article/details/87860133

from sklearn.tree import export_graphviz
def save_dot_data(model,feature_names,class_names):
'''
输入:模型名称 特征名称 类别名称
输出:None
生成一个决策树,注意这里生成的树默认字体 fontname=helvetica,不支持中文
'''
    dot_data = tree.export_graphviz(model, out_file=None, 
                                feature_names=feature_names,     ###特征名称
                                class_names=class_names,           ###类别名称
                                filled=True, rounded=True)  
    with open('dot_data.txt', 'w',encoding='utf-8') as f:     ##将生成树写入,因为含有中文,所以encoding='utf-8'
        f.writelines(dot_data)                                              ##另外,需要注意,这里的生成格式可以有很多种,常见的有    .dot  .txt
    return None
  1. 将dot_data文件格式进行转换
    如我的个例中生成的决策树内容如下(可用记事本打开),注意这里的字体为helvetica,以下我们需要做的就是进行格式转换,换成支持中文的字体"Microsoft YaHei" .注意,
    注意:这里不可强行在记事本上将字体进行替换,这样改动后在转换成pdf或者png格式时候会出错(因为我曾经这么试过)

digraph Tree {
node [shape=box, style=“filled, rounded”, color=“black”, fontname=helvetica] ;
edge [fontname=helvetica] ;
0 [label=“湿侧CAPE <= 943.0\ngini = 0.48\nsamples = 30\nvalue = [12, 18]\nclass = CI”, fillcolor="#399de555"] ;
1 [label=“gini = 0.0\nsamples = 9\nvalue = [9, 0]\nclass = NO_CI”, fillcolor="#e58139ff"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel=“True”] ;
2 [label=“露点梯度 <= 17.0\ngini = 0.245\nsamples = 21\nvalue = [3, 18]\nclass = CI”, fillcolor="#399de5d4"] ;
0 -> 2 [labeldistance=2.5, labelangle=-45, headlabel=“False”] ;
3 [label=“gini = 0.0\nsamples = 15\nvalue = [0, 15]\nclass = CI”, fillcolor="#399de5ff"] ;
2 -> 3 ;
4 [label=“干区相当位温 <= 313.846\ngini = 0.5\nsamples = 6\nvalue = [3, 3]\nclass = NO_CI”, fillcolor="#e5813900"] ;
2 -> 4 ;
5 [label=“gini = 0.0\nsamples = 3\nvalue = [0, 3]\nclass = CI”, fillcolor="#399de5ff"] ;
4 -> 5 ;
6 [label=“gini = 0.0\nsamples = 3\nvalue = [3, 0]\nclass = NO_CI”, fillcolor="#e58139ff"] ;
4 -> 6 ;
}

import codecs
txt_dir = 'dot_data.txt'   
txt_dir_utf8 = 'dot_data_utf8.txt'  

with codecs.open(txt_dir, 'r',encoding='utf-8') as f, codecs.open(txt_dir_utf8, 'w', encoding='utf-8') as wf:
    for line in f:
        lines = line.strip().split('\t')
        print(lines)
        if 'label' in lines[0]:
            newline = lines[0].replace('\n', '').replace(' ', '')
        else:
            newline = lines[0].replace('\n','').replace('helvetica', ' "Microsoft YaHei" ')
        wf.write(newline + '\t')

  1. 之后在命令窗口用graphviz进行格式转换
    5.1 进入cmd
    5.2 cd 文件所在目录
    5.3 dot -Tpng dot_data_utf8.txt -o tree.png ##这是转换成png图片,也可以转换成pdf格式,命令如下:
    dot -Tpdf dot_data_utf8.txt -o tree.pdf

  2. 补充
    像步骤5这样的先生成树,再在终端进行转换成可视化模式,如png pdf等,比较麻烦。
    因为在实践操作中,经常需要实时查看我们的决策树长什么样,最好能在console窗口即时展示。
    因此可以加入如下代码:

import graphviz
import pydotplus
from IPython.display import Image
import IPython

with open('dot_data_utf8.txt',encoding='utf-8') as f:
	dot_graph=f.read()
graph = pydotplus.graph_from_dot_data(dot_graph) 
filename=tree+'.png'
graph.write_png(filename)	 # 生成png文件
a=Image(graph.create_png())         
print(IPython.display.display(a))  ##直接在console上显示决策树

需要额外注意的是,使用pydotplus之前,一定要确保之前安装的graphviz的bin文件夹路径添加进了系统路径中,
如果没有设置成功,可以通过如下代码进行添加,

import os
os.environ["PATH"] += os.pathsep + 'G:/Program Files (x86)/Graphviz2.38/bin/'

之后,便可以正常显示了

大功告成!!!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值