文章发布于公号【数智物语】 (ID:decision_engine),关注公号不错过每一篇干货。

转自 | 法纳斯特(公众号ID:walker398)

作者 | 小F

决策树呈树形结构,是一种基本的回归和分类方法。

决策树模型的优点在于可读性强、分类速度快。

下面通过从「译学馆」搬运的两个视频,来简单了解下决策树。

最后来实战一波,建立一个简单的决策树模型。

01决策树算法

本次主要涉及两类决策树,Quinlan系列决策树和CART决策树。

前者涉及的算法包括ID3算法、C4.5算法及C5.0算法,后者则是CART算法。

前者一系列算法的步骤总体可以概括为建树和剪树。

在建树步骤中,首先选择最有解释力度的变量,接着对每个变量选择最优的分割点进行剪树。

剪树,去掉决策树中噪音或异常数据,在损失一定预测精度的情况下,能够控制决策树的复杂度,提高其泛化能力。

在剪树步骤中,分为前剪枝和后剪枝。

前剪枝用于控制树的生成规模,常用方法有控制决策树最大深度、控制树中父结点和子结点的最少样本量或比例。

后剪枝用于删除没有意义的分组,常用方法有计算结点中目标变量预测精度或误差、综合考虑误差与复杂度进行剪树。

此外在ID3算法中,使用信息增益挑选最有解释力度的变量。

其中信息增益为信息熵减去条件熵得到,增益越大,则变量的影响越大。

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

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

02Python实现

对一份汽车违约贷款数据集进行读取数据、数据清洗。(数据来源于《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:忽略分隔符后的空白
accepts = pd.read_csv('accepts.csv', skipinitialspace=True)
# dropna:对缺失的数据进行删除
accepts = accepts.dropna(axis=0, how='any')

# 因变量,是否违约
target = accepts['bad_ind']
# 自变量
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将数据集划分为训练集和测试集。

# 使用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)

初始化一个决策树模型,使用训练集进行训练。

采用基尼系数作为树的生长依据,树的最大深度为3,每一类标签的权重一样。

# 初始化一个决策树模型
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_)))

输出如下。

可以看出对因变量标签进行权重设置后,模型对违约用户的f1-score(精确率和召回率的调和平均数)提高了,为0.46。

违约用户被识别的灵敏度也从0.24提高到了0.46。

此外决策树模型的变量重要性排序为「FICO打分」、「信用卡授权额度」、「贷款金额/建议售价*100」。

通过安装graphviz和相应的插件,便能实现决策树的可视化输出,具体安装过程不细说。

# 设置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')

可视化结果如下。

可以看见决策树根节点以fico_score <= 683.5为分割标准。

全体样本的基尼系数为0.483,在3284个样本中,被预测变量为0的有2671个,为1的有1839个。

使用scikit-learn提供的参数搜索进行调优(GridSearchCV)。

# 设置树的最大深度
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_)

输出结果。

计算模型在不同阈值下的灵敏度和特异度指标,绘制ROC曲线。

# 使用模型进行预测
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曲线(虚线)很接近,说明模型没有过拟合。

模型的ROC曲线下面积为0.7358,模型效果一般。

推荐阅读:

星标我,每天多一点智慧

转载于:https://www.cnblogs.com/shuzhiwuyu/p/10716968.html

Python机器学习实践:决策树判别汽车金融违约用户相关推荐

  1. Python机器学习实践指南pdf (中文版带书签)、原书代码、数据集

    Python机器学习实践指南 目 录  第1章Python机器学习的生态系统 1  1.1 数据科学/机器学习的工作  流程 2  1.1.1 获取 2  1.1.2 检查和探索 2  1.1.3 清 ...

  2. 免费教材丨第55期:Python机器学习实践指南、Tensorflow 实战Google深度学习框架

    小编说  时间过的好快啊,小伙伴们是不是都快进入寒假啦?但是学习可不要落下哦!  本期教材  本期为大家发放的教材为:<Python机器学习实践指南>.<Tensorflow 实战G ...

  3. python tableau_Tableau集成Python机器学习实践(下)

    原标题:Tableau集成Python机器学习实践(下) 本系列分上.中.下三部分,本文为第三部分,关注微信公众号可获取完整内容. Tableau报表创建 数据准备 我们还是引用iris数据集的csv ...

  4. python机器学习实践和kaggle实践

    https://mlnote.wordpress.com/2015/12/16/python%E6%9C%BA%E5%99%A8%E5%AD%A6%E4%B9%A0%E5%AE%9E%E8%B7%B5 ...

  5. 读 python 机器学习实践指南

    本书分8个章节 第1 章,Python 机器学习的生态系统,深入Python,它有一个深度活跃的开发者社区,而且许多开发者来自科学社区.这为Python 提供了丰富的科学计算库.在本章中,我们将讨论这 ...

  6. 【Python机器学习】决策树、逻辑回归、神经网络等模型对电信用户流失分类实战(附源码和数据集)

    需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 电信用户流失分类 该实例数据来自kaggle,它的每一条数据为一个用户的信息,共有21个有效字段,其中最后一个字段Churn标志该用户是否流失 1 ...

  7. python学习书籍推荐-推荐python机器学习实践的书籍?

    直接实战的话,其实看 Scikit Learn 的官网就可以了.不仅有算法的说明,还有相关的参数文档,还有对应的案例分析,也有一些简单数据供参考.从开源的角度上讲,Scikit Learn 已经做得非 ...

  8. python教程书籍-推荐python机器学习实践的书籍?

    直接实战的话,其实看 Scikit Learn 的官网就可以了.不仅有算法的说明,还有相关的参数文档,还有对应的案例分析,也有一些简单数据供参考.从开源的角度上讲,Scikit Learn 已经做得非 ...

  9. python机器学习:决策树详解

    文章目录 一.决策树工作原理 1.1 定义 1.2 决策树结构 1.3 核心问题 二.sklearn库中的决策树 2.1 模块sklearn.tree 2.2 sklearn建模基本流程 2.3 决策 ...

最新文章

  1. python 面试题 博客园_python面试题
  2. java 多线程 共享数据_JAVA多线程提高四:多个线程之间共享数据的方式
  3. C语言 | 函数执行成功时,return 1 还是return 0?
  4. c#中接口的使用方法图解_c# 接口方法中使用new有什么用?
  5. 论文编写时,如何添加参考文献索引
  6. linux sed 笔记
  7. linux 挂载硬件设备
  8. 常用ajax调用方法,web前端之4种常用的Ajax请求方式
  9. 线性代数笔记26——傅立叶级数
  10. 自己总结出三种进入加密QQ空间的方法
  11. python编程期末试题_大学moocPython编程基础期末考试答案
  12. 前后端分离的文件上传,上传zip或者rar压缩包(vue+springboot)。
  13. 基于JAVA校内图书馆智能管理系统计算机毕业设计源码+数据库+lw文档+系统+部署
  14. 设置Latex页眉页脚边距——fancyhdr的使用
  15. 洗牌前夜:中国云主机市场全景观察
  16. 传苹果或推出安卓版iTunes音乐商店
  17. python列表or字符串切片步长为负数的情况分析
  18. 子桓说:学几招商业套路,以后用的上!
  19. 模拟实现msn登陆过程(MSNP15)
  20. stm32入门学什么板子_“蓝桥杯”嵌入式stm32开发入门(1)概述

热门文章

  1. PAT_B_1065_Java(17分)_C++(25分)
  2. linux刚重启就报资源不可用,linux系统重启网络配置
  3. Windows Terminal 完全配置教程(主题以及启动设置)
  4. 混合精度训练-Pytorch
  5. 钽电容极性 钽电容极性判断图解
  6. Linux 嵌入式启动以及优化(Z)
  7. __FUNCTION__, __FILE__, __LINE__ (原)
  8. Eigen入门之密集矩阵 10 - 矩阵的行优先及列优先存储
  9. 有关西电的课程学分相关问题:必修课、选修课、补考、重修、学分
  10. java知识点_java知识点