很久没有更新博客了,一直以为自己默默无闻,埋头苦干。实际上是一种懒惰! 2020年的春天,是一段难忘的记忆!在这段特殊的时光里,让我静心思考,潜心研究。每每遇到技术困惑,总能在CSDN找到解决办法,由衷的感谢!也感谢热爱技术的分享者!文笔超赞,逻辑通顺,思路清晰!
于是,我觉得也有必要再次开启博客,记录人生奋斗的足迹!
今天就分享一下,我在研究学习 机器学习-决策树 这一部分知识时,遇到导出决策树,有时不支持中文。今天总算研究完整,实现了导出PDF文件、PNG图片都支持中文的方案。
最关键的部分是在代码中,加入本地支持字体
dot_data=dot_data.replace('helvetica','"Microsoft Yahei"') # 这句话很关键,把支持中文的字体
以 Sklearn 自带的Wine数据集为例。
1、加载数据集
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
wine = load_wine()
2. JupterNoteBook 直接出图
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) #返回预测的准确度
print(score)
feature_name = ['酒精',
'苹果酸',
'灰',
'灰的碱性',
'镁','总酚','类黄酮','非黄烷类酚类','花青素',
'颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
#安装graphviz并配置电脑的环境变量,否则显示不了图片
import graphviz
dot_data = tree.export_graphviz(clf,
feature_names= feature_name,
class_names=["琴酒","雪莉","贝尔摩德"]
,filled=True
,rounded=True
)
# 出图
graph = graphviz.Source(dot_data)
graph
3、可视化效果
4、导出PDF文件
# 画出一棵树
feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data = tree.export_graphviz(clf
,out_file = None
,feature_names= feature_name # 这个参数是将特征变量名“可视化”,否则会返回“数据集中key="feature_names"对应值列表的索引”
,class_names=["琴酒","雪莉","贝尔摩德"] # 这个参数可以定义的个数,取决于数据集中key=“target_names”的个数,红酒数据集的标签有三个
,filled=True # 生成的树展示出来是否填充颜色
,rounded=True # 展示出来的树的“框框”是都有棱角~
)
dot_data=dot_data.replace('helvetica','"Microsoft Yahei"') # 修改字体,支持中文
graph = graphviz.Source(dot_data)
graph.render(r'wine')#将可视化结果输出至指定位置
print("导出完毕")
5、导出PNG图片
feature_name = ['酒精',
'苹果酸',
'灰',
'灰的碱性',
'镁','总酚','类黄酮','非黄烷类酚类','花青素',
'颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸']
dot_data =tree.export_graphviz(decision_tree=clf,
out_file=None,
feature_names=feature_name,
class_names=["琴酒","雪莉","贝尔摩德"],
filled=True,
rounded=True,
special_characters=True)
dot_data=dot_data.replace('helvetica','"Microsoft Yahei"') # 这句话很关键,把支持中文的字体,写入dot文件,
with open("./dot_data.dot", 'w', encoding="utf-8") as f: # 注意编码方式
f.writelines(dot_data)
#参考 唐宇迪 ,这样实现了导出图片, 完美!! by zsc
import pydotplus as pydot
graph= pydot.graph_from_dot_file('dot_data.dot')
graph.write_png('wine-tree2.png');