Task01:赛题理解

Task01:赛题理解

本次新人赛是Datawhale与天池联合发起的金融风控之贷款违约预测挑战赛。 赛题以金融风控中的个人信贷为背景,要求选手根据贷款申请人的数据信息预测其是否有违约的可能,以此判断是否通过此项贷款,这是一个典型的分类问题。通过这道赛题来引导大家了解金融风控中的一些业务背景,解决实际问题,帮助竞赛新人进行自我练习、自我提高。

1.1 学习目标

理解赛题数据和目标,清楚评分体系。
完成相应报名,下载数据和结果提交打卡,熟悉比赛流程。

1.2 了解赛题

1.2.1赛题概况

比赛要求参赛选手根据给定的数据集,建立模型,预测金融风险。
赛题以预测金融风险为任务,数据集报名后可见并可下载,该数据来自某信贷平台的贷款记录,总数据量超过120w,包含47列变量信息,其中15列为匿名变量。为了保证比赛的公平性,将会从中抽取80万条作为训练集,20万条作为测试集A,20万条作为测试集B,同时会对employmentTitle、purpose、postCode和title等信息进行脱敏。

1.2.2数据概况

一般而言,对于数据在比赛界面都有对应的数据概况介绍(匿名特征除外),说明列的性质特征。了解列的性质会有助于我们对于数据的理解和后续分析。 Tip:匿名特征,就是未告知数据列所属的性质的特征列。
train.csv

  • 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,为一些贷款人行为计数特征的处理

1.2.3 预测指标

竞赛采用AUC作为评价指标。AUC(Area Under Curve)被定义为 ROC曲线 下与坐标轴围成的面积。

1、混淆矩阵(Confuse Matrix)
(1)若一个实例是正类,并且被预测为正类,即为真正类TP(True Positive )
(2)若一个实例是正类,但是被预测为负类,即为假负类FN(False Negative )
(3)若一个实例是负类,但是被预测为正类,即为假正类FP(False Positive )
(4)若一个实例是负类,并且被预测为负类,即为真负类TN(True Negative )
将这四个指标一起呈现在表格中,就能得到如下这样一个矩阵,我们称它为混淆矩阵(Confusion Matrix):在这里插入图片描述预测性分类模型,肯定是希望越准越好。那么,对应到混淆矩阵中,那肯定是希望TP与TN的数量大,而FP与FN的数量小。所以当我们得到了模型的混淆矩阵后,就需要去看有多少观测值在第二、四象限对应的位置,这里的数值越多越好;反之,在第一、三象限对应位置出现的观测值肯定是越少越好。

但是,混淆矩阵里面统计的是个数,有时候面对大量的数据,光凭算个数,很难衡量模型的优劣。因此混淆矩阵在基本的统计结果上又延伸了如下4个指标,我称他们是二级指标(通过最底层指标加减乘除得到的):
在这里插入图片描述
通过上面的四个二级指标,可以将混淆矩阵中数量的结果转化为0-1之间的比率,便于进行标准化的衡量,在这四个指标的基础上在进行拓展,会产令另外一个三级指标。

F1-Score:指标综合了Precision与Recall的产出的结果。F1-Score的取值范围从0到1的,1代表模型的输出最好,0代表模型的输出结果最差
F 1 − S c o r e = 2 1 P r e c i s i o n + 1 R e c a l l F1-Score = \frac{2}{\frac{1}{Precision} + \frac{1}{Recall}} F1Score=Precision1+Recall12
在这里插入图片描述

P-R曲线:(precision_recall_curve)是描述精确率和召回率变化的曲线,如何理解P-R(精确率-召回率)曲线呢?或者说这些曲线是根据什么变化呢?

以逻辑回归举例,其输出值是0-1之间的数字。因此,如果我们想要判断用户的好坏,那么就必须定一个阈值。比如大于0.5指定为好用户,小于0.5指定为坏用户,然后就可以得到相应的精确率和召回率。但问题是,这个阈值是我们随便定义的,并不知道这个阈值是否符合我们的要求。因此为了寻找一个合适的阈值,我们就需要遍历0-1之间所有的阈值,而每个阈值都对应一个精确率和召回率,从而就能够得到上述曲线。

根据上述的P-R曲线,怎么判断最好的阈值点呢?首先我们先明确目标,我们希望精确率和召回率都很高,但实际上是矛盾的,上述两个指标是矛盾体,无法做到双高。因此,选择合适的阈值点,就需要根据实际问题需求,比如我们想要很高的精确率,就要牺牲掉一些召回率。想要得到很高的召回率,就要牺牲掉一些精准率。但通常情况下,我们可以根据他们之间的平衡点,定义一个新的上述指标:F1分数(F1-Score)。F1分数同时考虑精确率和召回率,让两者同时达到最高,取得平衡。
在这里插入图片描述

ROC:ROC空间将假正例率(FPR)定义为 X 轴,真正例率(TPR)定义为 Y 轴。

在这里插入图片描述
在这里插入图片描述
理所当然的,我们希望虚报的越少越好,覆盖的越多越好。所以TPR越高,同时FPR越低,也就是ROC曲线越陡,那么模型的性能也就越好。
TPR和FPR分别是基于实际表现1、0出发的,也就是说在实际的正样本和负样本中来观察相关概率问题。因此,无论样本是否均衡,都不会被影响。
例子:总样本中有90%的正样本,10%的负样本。TPR能够得到90%正样本中有多少是被真正覆盖的,而与那10%无关。同理FPR能够得到10%负样本中有多少是被覆盖的,而与那90%无关。ROC曲线无视样本间的不平衡问题,这就是为什么用TPR和FPR作为ROC、AUC指标的原因

AUC:被定义为 ROC曲线 下与坐标轴围成的面积。
显然这个面积的数值不会大于1,又由于ROC曲线一般都处于y=x这条直线的上方,所以AUC的取值范围在0.5和1之间。AUC越接近1.0,检测方法真实性越高;等于0.5时,则真实性最低,无应用价值。

AUC效果
0.5-0.7效果较低
0.7-0.85效果一般
0.85-0.95效果很好
0.95-1效果非常好

对于金融风控预测类常见的评估指标如下:
1、KS(Kolmogorov-Smirnov) KS统计量由两位苏联数学家A.N. Kolmogorov和N.V. Smirnov提出。在风控中,KS常用于评估模型区分度。区分度越大,说明模型的风险排序能力(ranking ability)越强。 K-S曲线与ROC曲线类似,不同在于

  • ROC曲线将真正例率和假正例率作为横纵轴
  • K-S曲线将真正例率和假正例率都作为纵轴,横轴则由选定的阈值来充当。
  • K S = m a x ( T P R − F P R ) KS=max(TPR-FPR) KS=max(TPRFPR) KS不同代表的不同情况,一般情况KS值越大,模型的区分能力越强,但是也不是越大模型效果就越好,如果KS过大,模型可能存在异常,所以当KS值过高可能需要检查模型是否过拟合。以下为KS值对应的模型情况,但此对应不是唯一的,只代表大致趋势。
KS(%)好坏区分能力
20以下不建议采用
20-40较好
41-50良好
51-60很强
61-75非常强
75以上过于高,疑似存在问题

2、ROC

3、AUC

1.2.4赛题流程

在这里插入图片描述

1.3 代码示例

1.3.1 数据读取pandas

import pandas as pd
train=pd.read_csv('train.csv')
testA=pd.read_csv('testA.csv')
print('train data shape:',train.shape)
print('testA data shape:',testA.shape)

train data shape: (800000, 47)
testA data shape: (200000, 46)

train.head()
idloanAmntterminterestRateinstallmentgradesubGradeemploymentTitleemploymentLengthhomeOwnership...n5n6n7n8n9n10n11n12n13n14
0035000.0519.52917.97EE2320.02 years2...9.08.04.012.02.07.00.00.00.02.0
1118000.0518.49461.90DD2219843.05 years0...NaNNaNNaNNaNNaN13.0NaNNaNNaNNaN
2212000.0516.99298.17DD331698.08 years0...0.021.04.05.03.011.00.00.00.04.0
3311000.037.26340.96AA446854.010+ years1...16.04.07.021.06.09.00.00.00.01.0
443000.0312.99101.07CC254.0NaN1...4.09.010.015.07.012.00.00.00.04.0

5 rows × 47 columns

1.3.2 分类指标评价计算示例

#混淆矩阵
import numpy as np
from sklearn.metrics import confusion_matrix
y_pred=[0,1,0,1]
y_true=[0,1,1,0]
print('混淆矩阵:\n',confusion_matrix(y_true,y_pred))
混淆矩阵:
 [[1 1]
 [1 1]]
## Accuracy,Precision,Recall,F1-score
from sklearn import metrics
y_pred=[0,1,0,1]
y_true=[0,1,1,0]
print('ACC:',metrics.accuracy_score(y_true,y_pred))
print('Precision:',metrics.precision_score(y_true,y_pred))
print('Recall:',metrics.recall_score(y_true,y_pred))
print('F1-score:',metrics.f1_score(y_true,y_pred))
ACC: 0.5
Precision: 0.5
Recall: 0.5
F1-score: 0.5
##P-R曲线
import matplotlib.pyplot as plt
from sklearn.metrics import precision_recall_curve
y_pred=[0,1,1,0,1,1,0,1,1,1]
y_true=[0,1,1,0,1,0,1,1,0,1]
precision,recall,threshoulds=precision_recall_curve(y_true,y_pred)
plt.plot(precision,recall)
[<matplotlib.lines.Line2D at 0x214544f7280>]

在这里插入图片描述

##ROC曲线
from sklearn.metrics import roc_curve
y_pred=[0,1,1,0,1,1,0,1,1,1]
y_true=[0,1,1,0,1,0,1,1,0,1]
FPR,TPR,thresholds=roc_curve(y_true,y_pred)
plt.plot(FPR,TPR,'b')
plt.plot([0,1],[0,1],'r--')
plt.title('ROC')
plt.xlabel('FPR')
plt.ylabel('TPR')
Text(0, 0.5, 'TPR')

在这里插入图片描述

##AUC
import numpy as np
from sklearn.metrics import roc_auc_score
y_true=np.array([0,0,1,1])
y_scores=np.array([0.1,0.4,0.35,0.8])
print('AUC score:',roc_auc_score(y_true,y_scores))
AUC score: 0.75
##KS值 在实际操作中往往使用ROC曲线配合求出KS值
from sklearn.metrics import roc_curve
y_pred=[0,1,1,0,1,1,0,1,1,1]
y_true=[0,1,1,0,1,0,1,1,1,1]
FPR,TPR,thresholds=roc_curve(y_true,y_pred)
KS=abs(FPR-TPR).max()
print('KS值:',KS)
KS值: 0.5238095238095237

1.4 经验总结

赛题理解是开始比赛的第一步,赛题的理解有助于对竞赛全局的把握。通过赛题理解有助于对赛题的业务逻辑把
握,对于后期的特征工程构建和模型选择都尤为重要。

  1. 在开始比赛之前要对赛题进行充分的了解。
  2. 比赛什么时候开始,什么时候结束,什么时候换B榜数据。
  3. 和该比赛有没有类似的比赛可以参考借鉴。
  4. 线上提交结果的次数往往是有限的,提前了解每日可以提交的次数。
  5. 比赛使用的是什么评价指标,可以选择相同的评价指标作为线下验证的方式。

1.5 拓展知识——评分卡

评分卡是一张拥有分数刻度会让相应阈值的表。信用评分卡是用于用户信用的一张刻度表,评分卡是金融风控中常用的一种对于用户信用进行刻画的手段哦!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值