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

 

文章发布于公号【数智物语】 (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,模型效果一般。

 

推荐阅读:

链接图片1.png

 

 

数智物语征稿启事.png

 

星标我,每天多一点智慧

星标备选20190408.gif

 

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/248128.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jQuery—tab栏切换

<div class"tab"><div class"tab_list"><ul><li class"current">商品介绍</li><li>规格与包装</li><li>售后保障</li><li>商品评价&#xff08;50000&#xff09;</li><l…

操作系统原理之I/O设备管理(第六章上半部分)

一、I/O系统的组成 I/O系统不仅包括各种I/O设备&#xff0c;还包括与设备相连的设备控制器&#xff0c;有些系统还配备了专⻔⽤ 于输⼊/输出控制的专⽤计算机&#xff0c;即通道。此外&#xff0c;I/O系统要通过总线与CPU、内存相连。 I/O系统的结构&#xff1a; I/O设备的分类…

操作系统原理之I/O设备管理(第六章下半部分)

五、I/O软件原理 输入输出软件的总体目标是将软件组织成一种层次结构 低层软件用来屏蔽硬件的具体细节高层软件则主要是为用户提供一个简洁、规范的界面设备管理的4个层次&#xff1a; 用户层软件 -》向系统发出I/O请求&#xff0c;显示I/O操作的结果&#xff0c;提供⽤户与设备…

切换Debug/Release编译模式和Archive的作用

&#xfeff;在学这个之前&#xff0c;以为很难&#xff0c;也起不到什么作用&#xff0c;但是等真正运用到工程里面&#xff0c;才发现&#xff0c;这个能帮你省下很多工作量。 1&#xff0c;Debug和Release版本区别&#xff1f; 进行iOS开发&#xff0c;在Xcode调试程序时&am…

AFNetworking 对数据进行https ssl加密

参考来源&#xff1a;http://www.cnblogs.com/jys509/p/5001566.html 现在在工作中的工作需求&#xff1a;https请求验证证书一般来讲如果app用了web service , 我们需要防止数据嗅探来保证数据安全.通常的做法是用ssl来连接以防止数据抓包和嗅探其实这么做的话还是不够的 。…

数据库系统原理(第一章概述)

一、数据库基本概念 什么是数据&#xff1a;数据&#xff08;Data&#xff09;是描述事物的符号记录&#xff0c;是指利用物理符号记录下来的、 可以鉴别的信息。 数据是信息存在的一种形式&#xff0c;只有通过解释或处理的数据才能成为有用的信息。 什么是数据库&#xff1a;…

实验二:Linux下Xen环境的安装

实验名称&#xff1a; Linux下Xen环境的安装&#xff08;centOS7&#xff09; 实验环境&#xff1a; 本次实验基本是在centOS7的环境下完成&#xff0c;系统内核和系统版本如下&#xff1a; 实验要求&#xff1a; 为centOS7的环境下安装Xen的平台&#xff0c;能够正常使用Xen下…

IDEA写vue项目出现红色波浪线警告如何解决??

1.看图 2.希望对大家有帮助&#xff0c;只要修改了这个就可以&#xff0c;如有任何问题都可以留言&#xff0c;谢谢大家 2019-09-1923:54:11 作者&#xff1a;何秀好 转载于:https://www.cnblogs.com/itboxue/p/11553395.html

数据可视化(BI报表的开发)第一天

课程回顾&#xff1a; ​ jQuery事件注册&#xff1a; ​ $(元素).click(function () {}); ​ $(元素).on(‘click’, [后代元素], function () {}); ​ $(元素).one(‘click’, function () {}); ​ 解绑事件&#xff1a;off ​ 自动触发&#xff1a; ​ $(元素).click…

在Block中使用weakSelf与strongSelf的意义

在Block中使用weakSelf与strongSelf的意义 我们都会声明一个弱引用在block中使用, 目的就是防止循环引用, 那么weakSelf与strongSelf一起使用目的是什么呢? 首先先定义2个宏: #define YXWeakSelf(type) __weak typeof(type) weak##type type; #define StrongSelf(type) __…

操作系统原理之操作系统简介(第一章)

一、 什么是操作系统 操作系统&#xff1a;是一种复杂的系统软件&#xff0c;是不同程序代码、数据结构、数据初始化文件的集合&#xff0c;可执行。 操作系统是用户与硬件之间的接口&#xff1a;操作系统与硬件部分相互作用&#xff0c;并且为运行在计算机上的应用程序提供执行…

数据可视化(BI报表的开发)第二天

9、公用面板样式 所有的面板的基础样式是一致的&#xff0c;提前布局好。 面板 .panel &#xff1a;box-sizing&#xff0c;边框图&#xff0c;大小&#xff0c;定位【51 38 20 132】容器 .inner&#xff1a;padding&#xff1a;24&#xff0c;36&#xff0c;定位外部拉宽标…

关于Xcode 7.3 7.3.1 断点 卡死 无限菊花

关于Xcode 7.3 7.3.1 断点 卡死 无限菊花 只要一打断点,就无限卡死,变量区一直菊花在转,只有强制退出Xcode才能重新编译,找了Google和Stack OvewFlowe依然没有解决办法. 删除项目,重新安装Xcode,重新运行程序一切办法都解决不到,百度上说的"build setting中将Enable Clang…

html5+hbuilder+夜神模拟器+webview

HTML5 Plus应用概述 首先新建一个移动App项目&#xff0c;文件-->新建-->移动APP HTML5 Plus移动App&#xff0c;简称5App&#xff0c;是一种基于HTML、JS、CSS编写的运行于手机端的App&#xff0c;这种App可以通过扩展的JS API任意调用手机的原生能力&#xff0c;实现与…

科学计算库学习报告

numpy与matplotlib的学习随笔 我爱代码 import numpy as npimport matplotlib.pyplot as pltimport matplotlibmatplotlib.rcParams[font.family]SimHeimatplotlib.rcParams[font.sans-serif][SimHei]labelsnp.array([第一次,第二次,第三次,第四次,第五次,第六次])nAttr6datanp…

数据库系统原理(第二章关系数据库 )

一、关系数据库概述 20世纪80年代后&#xff0c;在商用数据库管理系统中&#xff0c;&#xff08; 关系模型 &#xff09;逐渐取代早 期的网状模型和层次模型&#xff0c;成为主流数据模型 SQL3&#xff08;SQL-99&#xff09;:1999年 SQL2&#xff08;SQL-92&#xff09;&…

iOS NSMutableAttributedString常用方法总结

NSAttributedString 叫做富文本&#xff0c;是一种带有属性的字符串&#xff0c;通过它可以轻松的在一个字符串中表现出多种字体、字号、字体大小等各不相同的风格&#xff0c;还可以对段落进行格式化&#xff0c;一般都是对可变富文本&#xff08;NSMutableAttributedString&a…

软件开发工具(第1章:绪论)

一、 软件开发工具的由来 计算机语言和软件开发工具的发展和历史 机器语言&#xff08;第一代语言&#xff09;&#xff1a;难以记忆的、无意义的、二进 制的字符串 汇编语言&#xff08;第二代语言&#xff09;针对难以记忆的、无意义的、二进 制的字符串、人们试图用英语中具…

Saiku Table展示数据合并bug修复(二十五)

Saiku Table展示数据合并bug修复 Saiku以table的形式展示数据&#xff0c;如果点击了 非空的字段 按钮&#xff0c;则会自动进行数据合并&#xff0c;为空的数据行以及数据列都会自动隐藏掉。 首先我们应该定位问题&#xff1a; 1.查看接口返回值&#xff0c;会发现接口返回都正…

软件开发工具(第2章:软件开发过程及其组织)

一、软件开发的困难 程序员做好软件工作的关键是什么&#xff1f; 关键是两个转换&#xff1a; 第一个转换是用户对软件功能的理解与程序员对软件功能的理解之间的转换。 &#xff08;不同⾏业的⼈员对于事物的认识⽅法与描述⽅法是不同的。&#xff09; 第二个转换要解决的是人…