常规代码如下: from sklearn import tree from sklearn.datasets import load_wine from sklearn.model_selection import train_test_split import pandas as pd import os wine = load_wine() Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3) clf = tree.DecisionTreeClassifier(criterion="entropy") clf = clf.fit(Xtrain, Ytrain) score = clf.score(Xtest, Ytest) #返回预测的准确度accuracy feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸'] import graphviz dot_data = tree.export_graphviz(clf ,feature_names = feature_name ,class_names=["琴酒","雪莉","贝尔摩德"] ,filled=True ,rounded=True ) #dot_data是一个字符串对象,是对树的描述 '''.. versionchanged:: 0.20 Default of out_file changed from "tree.dot" to None.'''
然后我们用常规方式继续画图
graph=graphviz.Source(dot_data)
graph #我们运行graph,可以在notebook中查看树形图的情况,可以看到中文也是正常显示的
graph.view() #执行这个命令可以在当前ipynb文件路径下生成Source.gv.pdf文件
然后打开那个pdf文件如下
结果这个文件是乱码
如何解决这个问题呢,在网上找了很多方法,感觉不适合我,因为我安装的graphviz库比较新,一些老的代码失效了。经过多次尝试终于克服了这个问题。
之所以出现上面的问题就是因为字体设定不正确导致的,没有设定成中文字体,导致中文错误,那我们根据这个原因进行纠正。
具体解决步骤如下
生成一个dot文件而不是一个字符串,代码如下:
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
import os
wine = load_wine()
Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data,wine.target,test_size=0.3)
clf = tree.DecisionTreeClassifier(criterion="entropy")
clf = clf.fit(Xtrain, Ytrain)
score = clf.score(Xtest, Ytest) #返回预测的准确度accuracy
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
import graphviz
tree.export_graphviz(clf,out_file="tree.dot"
,feature_names = feature_name
,class_names=["琴酒","雪莉","贝尔摩德"]
,filled=True
,rounded=True
)
#生成tree.dot文件是为了以后方便调用这个文件里的内容,但是一旦我们设定了out_file这个参数,那tree_export_graphviz函数就不会返回一个字符串了,而是什么都不返回
'''.. versionchanged:: 0.20
Default of out_file changed from "tree.dot" to None.'''
我们打开那个dot文件看下里面的内容,可以看到无论是node(节点)字体还是edge字体设定的都不合适,因此中文显示为乱码
我们将两个字体进行修改,修改成中文字体比如Fangsong
文件修改如下,然后保存,然后关闭:
到这里还没有完,否则一会运行代码的问题会有错误提示。
我们用notepad++打开那个修改好字体的tree.dot文件
然后如图所示将文件转为utf-8编码后,保存一下。
这样我们的tree.dot文件就百分百是正确的编码和中文字体了。当然你有更好的方法你可以自己去尝试,我觉得目前我这个方法更加方便。
然后在tree.dot文件所在路径下启动cmd窗口,否则电脑无法定位到tree.dot文件
如何在某个路径下启动cmd窗口?请看我这个链接
如何在某个路径下启动cmd窗口?_CDA答疑社区 https://www.cda.cn/discuss/post/details/60196228306b085c526951bb
然后在这个cmd窗口中输入命令dot -Tpng tree.dot -o test.png
没有错误提示说明保存成功了,我们打开保存的图片看一下
可以看到图形已经正确了。








暂无数据