# Python数据科学：决策树

/ 01 / 决策树算法

C4.5算法则是使用信息增益率作为变量筛选的指标。

CART算法可用于分类或数值预测，使用基尼系数(gini)作为选择最优分割变量的指标。

/ 02/ Python实现

```import os
import pydotplus
import numpy as np
import pandas as pd
import sklearn.tree as tree
import matplotlib.pyplot as plt
from IPython.display import Image
import sklearn.metrics as metrics
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split, ParameterGrid, GridSearchCV

# 消除pandas输出省略号情况
pd.set_option('display.max_columns', None)
# 设置显示宽度为1000,这样就不会在IDE中换行了
pd.set_option('display.width', 1000)
# 读取数据,skipinitialspace:忽略分隔符后的空白
# dropna:对缺失的数据进行删除
accepts = accepts.dropna(axis=0, how='any')

# 因变量,是否违约
# 自变量
data = accepts.ix[:, 'bankruptcy_ind':'used_ind']
# 业务处理,loan_amt:贷款金额,tot_income:月均收入
data['lti_temp'] = data['loan_amt'] / data['tot_income']
data['lti_temp'] = data['lti_temp'].map(lambda x: 10 if x >= 10 else x)
# 删除贷款金额列
del data['loan_amt']
# 替换曾经破产标识列
data['bankruptcy_ind'] = data['bankruptcy_ind'].replace({'N': 0, 'Y': 1})```

```# 使用scikit-learn将数据集划分为训练集和测试集
train_data, test_data, train_target, test_target = train_test_split(data, target, test_size=0.2, train_size=0.8, random_state=1234)```

```# 初始化一个决策树模型
clf = DecisionTreeClassifier(criterion='gini', max_depth=3, class_weight=None, random_state=1234)
# 输出决策树模型信息
print(clf.fit(train_data, train_target))```

```# 输出决策树模型的决策类评估指标
print(metrics.classification_report(test_target, clf.predict(test_data)))

# 对不同的因变量进行权重设置
clf.set_params(**{'class_weight': {0: 1, 1: 3}})
clf.fit(train_data, train_target)
# 输出决策树模型的决策类评估指标
print(metrics.classification_report(test_target, clf.predict(test_data)))

# 输出决策树模型的变量重要性排序
print(list(zip(data.columns, clf.feature_importances_)))```

```# 设置graphviz路径
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'
# 决策树的可视化
dot_data = tree.export_graphviz(clf, out_file=None, feature_names=data.columns, class_names=['0', '1'], filled=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
# 将决策树模型输出为图片
graph.write_png(r'pang.png')
# 将决策树模型输出为PDF
graph.write_pdf('tree.pdf')```

```# 设置树的最大深度
max_depth = [None, ]
# 设置树的最大叶节点数
max_leaf_nodes = np.arange(5, 10, 1)
# 设置树的类标签权重
class_weight = [{0: 1, 1: 2}, {0: 1, 1: 3}]
# 设置参数网格
param_grid = {'max_depth': max_depth,
'max_leaf_nodes': max_leaf_nodes,
'class_weight': class_weight}
# 对参数组合进行建模和效果验证
clf_cv = GridSearchCV(estimator=clf,
param_grid=param_grid,
cv=5,
scoring='roc_auc')
# 输出网格搜索的决策树模型信息
print(clf_cv.fit(train_data, train_target))```

```# 输出优化后的决策树模型的决策类评估指标
print(metrics.classification_report(test_target, clf_cv.predict(test_data)))
# 输出优化后的决策树模型的参数组合
print(clf_cv.best_params_)```

```# 使用模型进行预测
train_est = clf_cv.predict(train_data)
train_est_p = clf_cv.predict_proba(train_data)[:, 1]
test_est = clf_cv.predict(test_data)
test_est_p = clf_cv.predict_proba(test_data)[:, 1]

# 绘制ROC曲线
fpr_test, tpr_test, th_test = metrics.roc_curve(test_target, test_est_p)
fpr_train, tpr_train, th_train = metrics.roc_curve(train_target, train_est_p)
plt.figure(figsize=[3, 3])
plt.plot(fpr_test, tpr_test, 'b--')
plt.plot(fpr_train, tpr_train, 'r-')
plt.title('ROC curve')
plt.show()

# 计算AUC值
print(metrics.roc_auc_score(test_target, test_est_p))```

ROC曲线图如下，其中训练集的ROC曲线(实线)与测试集的ROC曲线(虚线)很接近，说明模型没有过拟合。

0 条评论

• ### PyTorch专栏（五）：迁移学习

实际中，基本没有人会从零开始（随机初始化）训练一个完整的卷积网络，因为相对于网络，很难得到一个足够大的数据集[网络很深, 需要足够大数据集]。通常的做法是在一个...

• ### 谷歌NIPS论文Transformer模型解读：只要Attention就够了

导读：在 NIPS 2017 上，谷歌的 Vaswani 等人提出了 Transformer 模型。它利用自我注意（self-attention）来计算其输入和...

• ### 【每周CV论文推荐】 初学GAN必须要读的文章

欢迎来到《每周CV论文推荐》。在这个专栏里，还是本着有三AI一贯的原则，专注于让大家能够系统性完成学习，所以我们推荐的文章也必定是同一主题的。

• ### 人脸照片秒变艺术肖像画：清华大学提出APDrawingGAN CVPR 2019 oral paper

该项工作被CVPR 2019录取为oral paper。CVPR是计算机视觉和人工智能领域内的国际顶级会议，2019共收到投稿5160篇，录取1300篇，其中o...

• ### 统计学 常用的数据分析方法大总结，推荐收藏

描述统计是通过图表或数学方法，对数据资料进行整理、分析，并对数据的分布状态、数字特征和随机变量之间关系进行估计和描述的方法。描述统计分为集中趋势分析和离中趋势分...

• ### 做目标检测，这一篇就够了！2019最全目标检测指南

计算机视觉是一门研究如何对数字图像或视频进行高层语义理解的交叉学科，它赋予机器“看”的智能，需要实现人的大脑中（主要是视觉皮层区）的视觉能力。

• ### 计算机视觉中的注意力机制（Visual Attention）

本文将会介绍计算机视觉中的注意力（visual attention）机制，本文为了扩大受众群体以及增加文章的可读性，采用递进式的写作方式。第1部分的全部以及第2...

• ### 机器学习相关的python库介绍

顾名思义，机器学习是计算机编程的科学，通过它可以从不同类型的数据中学习。Arthur Samuel给出的更一般的定义是 - “机器学习是一个研究领域，它使计算机...

• ### 【ML小白】10 个机器学习 Q&A，面试必知！

本文整理了一些最常见的机器学习面试问题及其相应的回答。机器学习有志者以及经验丰富的ML专业人员可以在面试前以此巩固其基础知识。

• ### 李航《统计学习方法》决策树ID3算法实现

机器学习算法其实很古老，作为一个码农经常会不停的敲if, else if, else,其实就已经在用到决策树的思想了。只是你有没有想过，有这么多条件，用哪个条件...