金融风控之贷款违约预测挑战赛 Task1

许久没做过项目练习了,适逢DataWhale组织了这样一次专业对口的练习活动,赶紧加入进来。

1、铺垫

  • 数据来源:https://tianchi.aliyun.com/competition/entrance/531830/introduction
  • 数据说明:数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取80万条作为训练集,20万条作为测试集A,20万条作为测试集B,同时会对employmentTitle、purpose、postCode和title等信息进行脱敏。

2、认知梳理

  • 建模目的:根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款
  • 当前认知:
    ①金融风控预测欺诈或违约,是典型分类项目,可以理解为二分类,即不良样本和正常样本,也可以理解为多分类,即信用风险违约、欺诈风险违约(团伙欺诈、中介代办等),但是在没有原始数据的情况下,理解为二分类更容易建模。
    ②二分类中实际违约样本占比是极少的,即非均衡分类问题,如果直接使用经典算法,会导致大量误判,
    之前用过的方法是使用SMOTE进行过采样,然后套用经典算法,或者直接用XGBoost等算法。
    ①常规的精确率、召回率或F1 Score作为评价标准是无效的,实际工作中会采用AUC和KS值等评价。

3、理解数据

id 为贷款清单分配的唯一信用证标识
loanAmnt 贷款金额
term 贷款期限(year)
interestRate 贷款利率
installment 分期付款金额
grade 贷款等级
subGrade 贷款等级之子级
employmentTitle 就业职称
employmentLength 就业年限(年)
homeOwnership 借款人在登记时提供的房屋所有权状况
annualIncome 年收入
verificationStatus 验证状态
issueDate 贷款发放的月份
purpose 借款人在贷款申请时的贷款用途类别
postCode 借款人在贷款申请中提供的邮政编码的前3位数字
regionCode 地区编码
dti 债务收入比
delinquency_2years 借款人过去2年信用档案中逾期30天以上的违约事件数
ficoRangeLow 借款人在贷款发放时的fico所属的下限范围
ficoRangeHigh 借款人在贷款发放时的fico所属的上限范围
openAcc 借款人信用档案中未结信用额度的数量
pubRec 贬损公共记录的数量
pubRecBankruptcies 公开记录清除的数量
revolBal 信贷周转余额合计
revolUtil 循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额
totalAcc 借款人信用档案中当前的信用额度总数
initialListStatus 贷款的初始列表状态
applicationType 表明贷款是个人申请还是与两个共同借款人的联合申请
earliesCreditLine 借款人最早报告的信用额度开立的月份
title 借款人提供的贷款名称
policyCode 公开可用的策略代码=1新产品不公开可用的策略代码=2
n系列匿名特征 匿名特征n0-n14,为一些贷款人行为计数特征的处理

根据自己的理解,违约风险的首要影响因素是贷款人的还款能力,即dti 债务收入比、annualIncome 年收入、installment 分期付款金额、employmentTitle 就业职称、totalAcc 借款人信用档案中当前的信用额度总数、revolUtil 循环额度利用率,或借款人使用的相对于所有可用循环信贷的信贷金额、totalAcc 借款人信用档案中当前的信用额度总数,次要因素有还款意愿,可以参考delinquency_2years 借款人过去2年信用档案中逾期30天以上的违约事件数、pubRec 贬损公共记录的数量、openAcc 借款人信用档案中未结信用额度的数量。此外,FICO相当于美国的芝麻信用分,也能比较准确的反应用户的经济能力及履约能力。后续可以对各项指标的重要性进行排序。

4、导入数据

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import warnings
import os
%matplotlib inline
warnings.filterwarnings('ignore')
#设置最大显示列数
pd.set_option('display.max_columns', 100)
#查看目录下有多少文件,方便下面复制文件名和命名
PATH = '../python学习整理/exercise'
print(os.listdir(PATH))
#['testA.csv', 'train (1).csv', 'train.csv', 'Untitled.ipynb', '模型分析-总表.xlsx']
train_data = pd.read_csv(PATH+'/train (1).csv')
test_data = pd.read_csv(PATH+'/testA.csv')
train_data.head(10)
test_data.head()
print('train_data - rows:', train_data.shape[0], 
      'columns:', train_data.shape[1])
print('test_data - rows:', test_data.shape[0], 
      'columns:', test_data.shape[1])
#train_data - rows: 800000 columns: 47
#test_data - rows: 200000 columns: 48

5、评分卡

新学到的内容,之前确实没见过,等后续拓展学习。

def Score(prob,P0=600,PDO=20,badrate=None,goodrate=None):
    P0 = P0
    PDO = PDO
    theta0 = badrate/goodrate
    B = PDO/np.log(2)
    A = P0 + B*np.log(2*theta0)
    score = A-B*np.log(prob/(1-prob))
    return score

你可能感兴趣的:(金融风控之贷款违约预测挑战赛 Task1)