贷款审批预测

本文介绍了如何利用历史贷款数据建立预测模型,以判断贷款申请人能否如期还款。通过对数据预处理,包括特征选择、缺失值处理和重复值处理,然后进行数据转换与特征工程,最后评估模型性能,如混淆矩阵、评估指标、ROC曲线和P-R曲线,以实现贷款审批的自动化和优化。
摘要由CSDN通过智能技术生成

1. 项目背景

1.1 背景说明

A公司是一家贷款公司,承接个人贷款业务。然而,贷款人员鱼龙混杂,能力不一。
* 如果贷款人能够正常还款,则A公司就可以从贷款人身上赚取利息。
*如果贷款人还款逾期,则A公司就会承受一定程度的损失。
随着A公司的发展壮大,每年贷款的人数也越来越多,由于贷款人逾期还款的原因很多(个人人品,还款能力有限等),贷款业务对审核人
员的要求也会较高。这既需要审核人员具有很强的行业背景知识,也需要一定的经验辅助。因此,大量的贷款审批要求A公司雇佣大量审批
员工。这给A公司带来了一定的困扰:
廉价的审批人员专业能力不强,可能不能正确的发现逾期还款的贷款人员。
有经验的员工,成本又非常高。
人工审核需要一定的时间,可能无法做到及时性。

1.2 任务说明

我们的任务,是要根据历史贷款人的信息与还款结果,来建立有效的模型,这包括:
对贷款人员进行分类,预测其是否能够如期还款。
在分类的同时,还需要考虑其还款概率:
如果贷款人能够如期还款的概率很高,则可以向贷款人提供贷款。
如果贷款人存在一定的违约可能,则需要考虑是否向贷款人提供贷款。
如果贷款人存在违约的可能性很高,则拒绝向贷款人提供贷款。
在分类的同时,根据其还款概率设立合适的阈值,从而权衡风险与利润,实现贷款利润最大化。

1.3 数据集描述

当贷款人申请贷款服务时,需要登记一些个人信息。A公司收集了大量的历史贷款人数据,主要的数据如下所示。关于更加详细的数据说明,请查看数据字典文件。

id:贷款编号。
member_id:会员编号。
loan_amnt:借款人申请的贷款金额。
funded_amnt:承诺给该贷款的总金额。
funded_amnt_inv:投资者为该贷款承诺的总金额。
term:贷款的偿还时间。
int_rate:贷款的利率。
installment:分期付款,每期还款的额度。
grade:贷款等级。贷款利率越高,则等级越高。
sub_grade:贷款子等级。
emp_title:工作名称。
emp_length:工作时间。
home_ownership:房屋所有权状态。取值为:
RENT:出租
OWN:自由
MORTGAGE:按揭
OTHER:其他
annual_inc:贷款人自报的年收入。
verification_status:贷款人收入是否核实。
issue_d:贷款月份。
loan_status:贷款的当前状态。
pymnt_plan:是否已经为贷款实施还款计划。
url:贷款的url地址。
desc:贷款人的贷款描述。
purpose:贷款人贷款的用途。
title:贷款人提供的标题。
zip_code:邮政编码
addr_state:贷款人所在的国家。
dti:贷款人的总债务偿还总额与贷款人的月收入比值。
delinq_2yrs:过去两年贷款人信用档案中逾期30天以上的拖欠事件。
earliest_cr_line:贷款人最早报告的信贷额度开始的月份。
inq_last_6mths:过去六个月的查询数目。
open_acc:贷款人信用档案中的未结信用额度。
pub_rec:贬损公共记录的数量。
revol_bal:总信贷周转余额。

1.4 加载数据

通过pandas读取csv数据集文件。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
sns.set(style="darkgrid", font_scale=1.2)
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
# skiprows:读取数据时跳过的行数。
# 数据的第一行是描述信息,因此使用skiprows跳过。第二行才是标题数据。
# id(贷款人编号)与next_pymnt_d(下一个预定的还款日期)列存在混合类型,显式指定列的类型,这样效率更高。
# Pandas默认以块的形式处理(解析)数据,从而降低内存消耗,但是可能会解析出混合类型。可以使用两种方式来处理:
# 1 显式通过dtype来设置列的类型。
# 2 将low_memory参数的值设置为False(默认为True)。
data = pd.read_csv("Loan.csv", skiprows=1, dtype={
   "id": np.str, "next_pymnt_d": np.str})
# 默认情况下,只显示20列数据。
print(pd.get_option("max_columns"))
# 查看数据集的形状。
print(data.shape)
# 显式指定最大列数。如果为None,指不限制最大显示列数。
pd.set_option("max_columns", 120)
data.head()

在这里插入图片描述

2.数据预处理

2.1 删除直观特征

通过观看数据集,可以直观上删除一些特征:
与贷款没有关联的特征,如id,memeber_id。
特征之间相关度极高,只保留一个即可。例如grade(贷款等级), sub_grade(贷款子等级)与int_rate(贷款利率),只保留
int_rate。

# 删除与贷款无关特征。
irrelevant_coumns = ["id", "member_id", "funded_amnt", "funded_amnt_inv", "emp_title", "issue_d",
"url", "desc", "zip_code", "addr_state", "last_credit_pull_d", "earliest_cr_line", "addr_state",
"title", "last_pymnt_d"]
data.drop(irrelevant_coumns, axis=1, inplace=True)
# 删除相关性高的特征。
high_relevant = ["grade", "sub_grade"]
data.drop(high_relevant, axis=1, inplace=True)

2.2 缺失值处理

查看缺失值

data.info()

在这里插入图片描述
在这里插入图片描述

缺失数据可视化

# 默认情况下,最多只显示60行数据。
print(pd.get_option("max_rows"))
# 如果需要显示完整,可以设置最多显示的行数。
# pd.set_option("max_rows", 200)
miss = data.isnull().sum(axis=0)
miss = pd.concat([miss, miss * 100 / data.shape[0]], axis=1)
miss.columns = ["miss_num", "miss_rate"]
miss.sort_values("miss_num", inplace=True, ascending=False)
display(miss)

60
在这里插入图片描述

ax = sns.barplot(y=miss.index, x=miss["miss_num"])
figsize=(15, miss.shape[0] // 2)
ax.get_figure().set_size_inches(figsize)
for i in range(miss.shape[0]):
num = miss["miss_num"].iloc[i]
rate = miss["miss_rate"].iloc[i]
ax.text(num / 2, i, f"{num}({rate:.2f}%)")

在这里插入图片描述

删除全部缺失数据
数据集中有大量特征全部缺失,这样的特征没有任何意义,直接删除处理。

all_missing = miss[miss["miss_rate"] == 100].index
print
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值