很久沒有更新博客了,一直以爲自己默默無聞,埋頭苦幹。實際上是一種懶惰! 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');