決策樹可視化【含Python源碼】

決策樹是一種流行的有監督學習方法。決策樹的優勢在於其既可以用於 迴歸,也可以用於分類,不需要特徵縮放,而且具有比較好的可解釋性, 容易將決策樹可視化。可視化的決策樹不僅是理解你的模型的好辦法, 也是向其他人介紹你的模型的運作機制的有利工具。因此掌握決策樹 可視化的方法對於數據分析工作者來說非常重要。

在這個教程裡,我們將學習以下內容:

  • 如何使用scikit-learn訓練一個決策樹模型
  • 如何使用Matplotlib將決策樹可視化
  • 如何使用Graphviz將決策樹可視化
  • 如何將隨機森林或決策樹包中的單個決策樹可視化

教程的代碼可以從這裡下載。 現在讓我們開始吧。

1、用scikit-learn訓練決策樹模型

為了可視化決策樹,我們首先需要用scikit-learn訓練出一個決策樹模型。

首先導入必要的Python庫:

<code>import matplotlib.pyplot as plt
from sklearn.datasets import load_iris
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
import pandas as pd
import numpy as np
from sklearn import tree/<code>

然後載入iris數據集。scikit-learn內置了Iris數據集,因此我們不需要 從其他網站下載了。下面的Python代碼載入Iris數據集:

<code>import pandas as pd
from sklearn.datasets import load_irisdata = load_iris()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target/<code>

Iris數據集看起來是這樣:

決策樹可視化【含Python源碼】

接下來我們將Iris數據集拆分為訓練集和測試集:

<code>X_train, X_test, Y_train, Y_test = train_test_split(df[data.feature_names], df['target'], random_state=0)/<code>

分割後的Iris數據集看起來是這樣:

決策樹可視化【含Python源碼】

最後,我們採用scikit-learn經典的4步模式訓練決策樹模型:

<code># Step 1: Import the model you want to use
# This was already imported earlier in the notebook so commenting out
#from sklearn.tree import DecisionTreeClassifier
# Step 2: Make an instance of the Model
clf = DecisionTreeClassifier(max_depth = 2,
random_state = 0)
# Step 3: Train the model on the data
clf.fit(X_train, Y_train)
# Step 4: Predict labels of unseen (test) data
# Not doing this step in the tutorial
# clf.predict(X_test)/<code>

2、使用Matplotlib將決策樹可視化

從scikit-learn 版本21.0開始,可以使用scikit-learn的tree.plot_tree 方法來利用matplotlib將決策樹可視化,而不再需要依賴於難以安裝的dot庫。 下面的Python代碼展示瞭如何使用scikit-learn將決策樹可視化:

<code>tree.plot_tree(clf);/<code>

決策樹可視化結果如下:

決策樹可視化【含Python源碼】

還可以添加一些額外的Python代碼以便讓繪製出的決策樹具有更好的 可解讀性,例如添加特徵和分類名稱:

<code>fn=['sepal length (cm)','sepal width (cm)','petal length (cm)','petal width (cm)']
cn=['setosa', 'versicolor', 'virginica']
fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=300)
tree.plot_tree(clf,
feature_names = fn,
class_names=cn,
filled = True);
fig.savefig('imagename.png')/<code>

增加了更多信息的決策樹可視化結果如下:

決策樹可視化【含Python源碼】

3、使用Graphviz將決策樹可視化

下圖是使用Graphviz得到的決策樹可視化結果:

決策樹可視化【含Python源碼】

Graphviz是一個開源的圖(Graph)可視化軟件,採用抽象的圖和網絡 來表示結構化的信息。在數據科學領域,Graphviz的一個用途就是實現 決策樹可視化。我將graphviz方法放在matplotlib方法之後,是因為 這個軟件用起來有點複雜。

為了將決策樹可視化,首先需要創建一個dot文件來描述決策樹,這個倒 不難。問題在於使用Graphviz將dot文件轉換為圖形文件,例如png、jpg等等 可能會有點難度。

有一些辦法來降低graphviz的使用門檻,例如通過Anaconda安裝python-graphviz、 利用mac的homebrew安裝grahpviz、利用官方提供的windows安裝文件、或者使用 在線轉換器將決策樹的dot文件轉換為圖形:

決策樹可視化【含Python源碼】

首先我們將決策樹模型導出為dot文件:

<code>tree.export_graphviz(clf,
out_file="tree.dot",
feature_names = fn,
class_names=cn,
filled = True)/<code>

然後我們用conda安裝graphviz:

<code>conda install python-graphviz/<code>

現在就可以將決策樹模型導出的dot文件轉換為圖形文件了:

<code>dot -Tpng tree.dot -o tree.png/<code>

4、將決策樹包或隨機森林裡的單個決策樹可視化

決策樹的一個缺點是通常其預測精度不夠好。這部分原因在於其 變化幅度比較大,對訓練數據的不同拆分方式可能會生成截然不同 的決策樹模型。

決策樹可視化【含Python源碼】

上圖可以表示決策樹包或者隨機森林模型之類的組合學習方法, 通過將多個機器學習算法組合起來以期獲得更好的預測性能。 在這一部分,我們學習如何將這些組合模型中的單個決策樹可視化。

首先還是使用scikit-learn來訓練得到一個隨機森林模型:

<code># Load the Breast Cancer (Diagnostic) Dataset
data = load_breast_cancer()
df = pd.DataFrame(data.data, columns=data.feature_names)
df['target'] = data.target
# Arrange Data into Features Matrix and Target Vector
X = df.loc[:, df.columns != 'target']
y = df.loc[:, 'target'].values
# Split the data into training and testing sets
X_train, X_test, Y_train, Y_test = train_test_split(X, y, random_state=0)
# Random Forests in `scikit-learn` (with N = 100)
rf = RandomForestClassifier(n_estimators=100,
random_state=0)
rf.fit(X_train, Y_train)/<code>

現在我們可以將模型中的單個決策樹可視化。首先還是使用matplotlib。 下面的python代碼將第1個決策樹可視化:

<code>fn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 1,figsize = (4,4), dpi=800)
tree.plot_tree(rf.estimators_[0],
feature_names = fn,
class_names=cn,
filled = True);
fig.savefig('rf_individualtree.png')/<code>

得到的這個決策樹可視化結果如下:

決策樹可視化【含Python源碼】

你可以試著使用matplotlib的subplot來將你期望的多個決策樹可視化。 例如下面的Python代碼將組合模型中的前5個決策樹可視化:

<code># This may not the best way to view each estimator as it is smallfn=data.feature_names
cn=data.target_names
fig, axes = plt.subplots(nrows = 1,ncols = 5,figsize = (10,2), dpi=3000)for index in range(0, 5):
tree.plot_tree(rf.estimators_[index],
feature_names = fn,
class_names=cn,
filled = True,
ax = axes[index]);

axes[index].set_title('Estimator: ' + str(index), fontsize = 11)fig.savefig('rf_5trees.png')/<code>

不過我個人不喜歡這麼做,因為這看起來太費眼睛了:

決策樹可視化【含Python源碼】

5、教程小結

在這個教程裡,我們學習瞭如何使用matplotlib和graphviz將scikit-learn 訓練得到的決策樹可視化,也學習瞭如何將組合模型中的一個或多個決策樹 可視化,希望這有助於你的數據分析工作。


原文鏈接:http://blog.hubwiz.com/2020/04/04/decision-tree-visualization-python/


分享到:


相關文章: