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:
解读