xy's blog

Connect the dots

0%

决策树可视化-Graphviz中文乱码问题

在使用Graphviz进行决策树可视化的过程中遇到一个问题:export_graphviz似乎不支持中文,当feature_name包含中文时,导出的决策树pdf中文都是乱码。查了一些资料,说是要把源文件保存为UTF-8的格式,但在export_graphviz时不知道该怎么改。

目前试了以下两种方法有效。

使用python进行决策树分析及可视化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
import pydotplus
from sklearn import tree
from sklearn.externals.six import StringIO
from sklearn.model_selection import train_test_split
#生成训练集
X_train,X_test,Y_train,Y_test = train_test_split(x,y,test_size=0.2)
# 训练模型
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X_train,Y_train)
#测试
Y_predict = clf.predict(X_test)
matchCount = 0
for i in range(len(Y_predict)):
if Y_predict[i] == Y_test[i]:
matchCount += 1
accuracy = float(matchCount/len(Y_predict))
#可视化
dot_data = StringIO()
tree.export_graphviz(clf,out_file = dot_data,feature_names=feature_name,
class_names=target_name,filled=True,rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_pdf("Tree.pdf")

解决办法

方法一

将决策树保存为.dot文件,

1
2
3
4
#可视化
tree.export_graphviz(clf,out_file = dot_data.dot,feature_names=feature_name,
class_names=target_name,filled=True,rounded=True,
special_characters=True)

并打开.dot文件编辑,将字体改为中文字体并保存(需输入中文字体的英文名,如”FangSong”或”Microsoft Yahei”)
1
node [shape=box, style="filled, rounded", color="black", fontname="FangSong"]

在命令行画图
1
dot -Tpdf dot_data.dot -o dot_data.pdf

方法二

比第一种方法简单,输出svg时中文显示正常

1
2
3
4
5
6
7
#可视化
dot_data = StringIO()
tree.export_graphviz(clf,out_file = dot_data,feature_names=feature_name,
class_names=target_name,filled=True,rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
graph.write_svg("Tree.svg")

网页打开svg文件可另存为其他格式。

我尝试了但没有成功的方法

找到安装路径在 Graphviz\etc\fonts\fonts.conf,找到以下这行:

1
<dir>#FONTDIR#</dir>

改成 Windows 字型路径:

1
<dir>C:\WINDOWS\Fonts</dir>

参考资料: