热线电话:13121318867

登录
2021-02-02 阅读量: 1191
画决策树的时候如何解决中文乱码问题
常规代码如下:
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.'''


图4.png



然后我们用常规方式继续画图

graph=graphviz.Source(dot_data)

graph #我们运行graph,可以在notebook中查看树形图的情况,可以看到中文也是正常显示的

图6.png

graph.view() #执行这个命令可以在当前ipynb文件路径下生成Source.gv.pdf文件

图7.png

然后打开那个pdf文件如下


图8.png

结果这个文件是乱码

如何解决这个问题呢,在网上找了很多方法,感觉不适合我,因为我安装的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字体设定的都不合适,因此中文显示为乱码

图5.png

我们将两个字体进行修改,修改成中文字体比如Fangsong

文件修改如下,然后保存,然后关闭:

图9.png

到这里还没有完,否则一会运行代码的问题会有错误提示。


图10.png

我们用notepad++打开那个修改好字体的tree.dot文件

tu2.jpg

tu3.jpg

然后如图所示将文件转为utf-8编码后,保存一下。

图11.png

这样我们的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

图12.png

没有错误提示说明保存成功了,我们打开保存的图片看一下

图13.png


可以看到图形已经正确了。


0.0000
0
关注作者
收藏
评论(0)

发表评论

暂无数据