Python代碼來構建一顆決策樹(Decision Tree)的案例
用Python代碼來構建一顆決策樹(Decision)
工具
- Python+Jupyter
- Graphviz 2.38 (Graphviz是一個開源的圖形可視化軟件)
Graphviz的下載地址:
http://www.graphviz.org/download/
Graphviz是一個開源的圖形可視化軟件。圖形可視化是將結構信息表示爲抽象圖形和網絡圖的一種方法。它在網絡、生物信息學、軟件工程、數據庫和web設計、機器學習以及其他技術領域的可視化界面中有着重要的應用。
Graphviz佈局程序使用簡單的文本語言對圖形進行描述,並以有用的格式製作圖表,例如用於網頁的圖像和SVG;用於包含在其他文檔中的PDF或Postscript;或顯示在交互式圖形瀏覽器中。Graphviz對於具體的圖表有許多有用的特性,例如顏色、字體、表格節點佈局、線條樣式、超鏈接和自定義形狀的選項。
樣例數據來源
https://raw.githubusercontent.com/ffzs/dataset/master/glass.csv
在這裏可以看到數據集的樣子:https://github.com/ffzs/dataset/blob/master/glass.csv
這個樣例數據共有 215行。
在Jupyter 的交互模式中,源代碼如下
Input
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier, export_graphviz
# 導入評估指標模塊
from sklearn.metrics import accuracy_score, auc, confusion_matrix, f1_score, precision_score, recall_score, roc_curve
# 導入表格庫
import prettytable
# 導入dot插件庫
import pydotplus
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# 數據導入
df = pd.read_csv('https://raw.githubusercontent.com/ffzs/dataset/master/glass.csv', usecols=['Na','Ca','Type'])
# 爲了決策樹圖示簡潔我們儘量減少分類,和特徵值
dfs = df[df.Type < 3]
# 獲取特徵值
X = dfs[dfs.columns[:-1]].values
# 獲取標籤值
y = dfs['Type'].values - 1
# 將數據37分爲測試集合訓練集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=2018)
#### 模型訓練 ####
# 決策樹模型
dt_model = DecisionTreeClassifier(random_state=2018)
# 訓練模型
dt_model.fit(X_train, y_train)
# 對測試集做預測
pre_y = dt_model.predict(X_test)
####模型評估####
# 混淆矩陣
confusion_m = confusion_matrix(y_test, pre_y)
df_confusion_m = pd.DataFrame(confusion_m, columns=['0', '1'], index=['0', '1'])
df_confusion_m.index.name = 'Real'
df_confusion_m.columns.name = 'Predict'
df_confusion_m
Output:
# 獲取決策樹的預測概率
y_score = dt_model.predict_proba(X_test)
# ROC
fpr, tpr, thresholds = roc_curve(y_test, y_score[:, [1]])
# AUC
auc_s = auc(fpr, tpr)
# 準確率
accuracy_s = accuracy_score(y_test, pre_y)
# 精準度
precision_s = precision_score(y_test, pre_y)
# 召回率
recall_s = recall_score(y_test, pre_y)
# F1得分
f1_s = f1_score(y_test, pre_y)
# 評估數據製表
df_metrics = pd.DataFrame([[auc_s, accuracy_s, precision_s, recall_s, f1_s]], columns=['auc', 'accuracy', 'precision', 'recall', 'f1'], index=['結果'])
df_metrics
Output:
#### 可視化ROC#####
plt.figure(figsize=(8, 7))
plt.plot(fpr, tpr, label='ROC') # 畫出ROC曲線
plt.plot([0, 1], [0, 1], linestyle='--', color='k', label='random chance')
# 畫出隨機狀態下的準確率線
plt.title('ROC') # 子網格標題
plt.xlabel('false positive rate') # X軸標題
plt.ylabel('true positive rate') # y軸標題
plt.legend(loc=0)
plt.savefig('x.png')
Output:
import os
os.environ["PATH"] += os.pathsep + 'D:\\Program Files (x86)\\Graphviz2.38\\bin' #注意修改你的路徑
####保存決策樹桂枝圖爲pdf####
# 決策樹規則生成dot對象
dot_data = export_graphviz(dt_model, max_depth=5, feature_names=dfs.columns[:-1], filled=True, rounded=True)
# 通過pydotplus將決策樹規則解析爲圖形
graph = pydotplus.graph_from_dot_data(dot_data)
# 將決策樹規則保存爲PDF文件
graph.write_pdf('G:\\Data Scientist Learning\\tree.pdf')
# 保存爲jpg圖片
graph.write_jpg('G:\Data Scientist Learning\\DecisionTree_sample.jpg')
上面的源代碼中請注意這樣一行代碼:
import os
os.environ["PATH"] += os.pathsep + 'D:\\Program Files (x86)\\Graphviz2.38\\bin' #注意修改你的路徑
Output:
打開生成的PDF文件,或者JPG圖片,可以看下圖的Decision Tree:
解讀