百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

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

toyiye 2024-06-21 12:24 7 浏览 0 评论

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

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

作者 | 小F

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

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

01

决策树算法

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

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

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

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

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

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

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

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

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

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

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

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

02

Python实现

对一份汽车违约贷款数据集进行读取数据、数据清洗。(数据来源于《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,模型效果一般。

推荐阅读:



星标我,每天多一点智慧

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码