赛题数据
赛题数据来自某信贷平台的贷款记录,总数据量超过 120 万条,包含 47 列变量信息,其中 15 列为匿名变量。从中抽取 80 万条作为训练集,20 万条作为测试集A,20 万条作为测试集B,同时会对 employmentTitle、purpose、postCode 和 title 等信息进行脱敏。
字段表:
字段名 | 描述 |
---|---|
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 的概率,也就是 y = 1 y=1 y=1 的概率。评价方法为 AUC 评估模型效果(越大越好)。
AUC(Area Under Curve)的定义为 ROC曲线 下与坐标轴围成的面积。
提交格式
提交的格式如下所示:
id,isDefault
800000,0.5
800001,0.5
800002,0.5
800003,0.5
主要流程
分类算法常见的评估指标
- 若一个实例是正类,并且被预测为正类,即为真正类 TP (True Positive )
- 若一个实例是正类,但是被预测为负类,即为假负类 FN (False Negative )
- 若一个实例是负类,但是被预测为正类,即为假正类 FP (False Positive )
- 若一个实例是负类,并且被预测为负类,即为真负类 TN (True Negative )
混淆矩阵(Confuse Matrix)
混淆矩阵的对角线表示分类正确的样本的数量,对角线以外的元素表示被误分的样本的数量。
[
T
P
F
N
F
P
T
N
]
\begin{bmatrix} TP & FN \\ FP & TN \end{bmatrix}
[TPFPFNTN]
准确率(Accuracy)
准确率是常用的一个评价指标,但是不适合样本不均衡的情况(比如10000 个样本中,9999 个为负类,1 个为正类。此时全将样本划分为负类则该算法的准确率可高达 99.9% 以上,但是这样的分类算法是没有意义的)。
A c c u r a c y = T P + T N T P + T N + F P + F N = 分 类 正 确 的 样 本 数 样 本 总 数 Accuracy = \frac{TP+TN}{TP+TN+FP+FN} = \frac{分类正确的样本数}{样本总数} Accuracy=TP+TN+FP+FNTP+TN=样本总数分类正确的样本数
精确率(Precision)
又称查准率,正确预测为正样本(TP)占预测为正样本(TP+FP)的百分比,即预测为正类的样本中,有多少是预测正确的。
P r e c i s i o n = T P T P + F P = 预 测 正 确 的 正 类 预 测 为 正 类 的 样 本 数 量 Precision = \frac{TP}{TP+FP} = \frac{预测正确的正类}{预测为正类的样本数量} Precision=TP+FPTP=预测为正类的样本数量预测正确的正类
召回率(Recall)
又称为查全率,正确预测为正样本(TP)占正样本(TP+FN)的百分比,即分类算法能找到所有正类样本中的多少样本。
R e c a l l = T P T P + F N = 预 测 正 确 的 正 类 正 类 的 样 本 数 量 Recall = \frac{TP}{TP+FN} = \frac{预测正确的正类}{正类的样本数量} Recall=TP+FNTP=正类的样本数量预测正确的正类
F1 Score
精确率和召回率是相互影响的,精确率升高则召回率下降,召回率升高则精确率下降,如果需要兼顾二者,就需要精确率、召回率的结合 F1 Score.
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}} F1−Score=Precision1+Recall12
P-R曲线(Precision-Recall Curve)
P-R 曲线是描述精确率和召回率变化的曲线。
ROC(Receiver Operating Characteristic)
ROC曲线是描述假正例率(FPR)和真正例率(TPR)的曲线。
- TPR:在所有实际为正类的样本中,被正确地判断为正类之比率
T P R = T P T P + F N TPR = \frac{TP}{TP+FN} TPR=TP+FNTP - FPR:在所有实际为负类的样本中,被错误地判断为正类之比率
F P R = F P F P + T N FPR = \frac{FP}{FP+TN} FPR=FP+TNFP
AUC(Area Under Curve)
AUC(Area Under Curve)被定义为 ROC 曲线与 x 轴围成的面积,显然这个面积的数值不会大于1. 又由于 ROC 曲线一般都位于 y = x y=x y=x 直线的上方,所以 AUC 的取值范围在 0.5 和 1 之间。AUC 越接近 1,检测方法真实性越高,AUC 等于 0.5 时,真实性最低,无应用价值。
金融风控预测类常见的评估指标
KS(Kolmogorov-Smirnov)
- KS 曲线与 ROC 曲线类似,不同在于ROC 曲线将真正例率和假正例率作为横纵轴,KS 曲线将真正例率和假正例率都作为纵轴,横轴则由选定的阈值(区分正类和负类的阈值)来充当。
- K S = m a x ( T P R − F P R ) KS = max(TPR-FPR) KS=max(TPR−FPR),即两条曲线间的最大间隔。
- KS 曲线的值越大,表示模型能够将正、负类别区分开的程度越大,KS值的取值范围是
[
0
,
1
]
[0,1]
[0,1]. 但是也不是 KS 的值越大模型效果就越好,如果 KS 过大,模型可能存在异常,所以当 KS 值过高可能需要检查模型是否过拟合。
- K S < 0.2 KS < 0.2 KS<0.2,一般认为模型没有区分能力
- K S ∈ [ 0.2 , 0.3 ] KS \in [0.2,0.3] KS∈[0.2,0.3],模型具有一定区分能力,勉强可以接受
- K S ∈ [ 0.3 , 0.5 ] KS \in [0.3,0.5] KS∈[0.3,0.5],模型具有较强的区分能力
- K S > 0.75 KS > 0.75 KS>0.75,往往表示模型有异常
评估指标的代码实现
混淆矩阵
## 混淆矩阵
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))
Accuracy
## Accuracy
from sklearn.metrics import accuracy_score
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
print('ACC:',accuracy_score(y_true, y_pred))
Precision,Recall,F1-score
## Precision,Recall,F1-score
from sklearn import metrics
y_pred = [0, 1, 0, 1]
y_true = [0, 1, 1, 0]
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))
P-R 曲线
## 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, thresholds = precision_recall_curve(y_true, y_pred)
plt.plot(precision, recall)
ROC 曲线
## 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.title('ROC')
plt.plot(FPR, TPR,'b')
plt.plot([0,1],[0,1],'r--') # y = x 直线
plt.ylabel('TPR')
plt.xlabel('FPR')
AUC
## 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 socre:',roc_auc_score(y_true, y_scores))
KS 值
## 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)
评分卡
- 评分卡是以分数的形式来衡量风险几率的一种手段
- 评分卡对未来一段时间内违约行为的概率进行预测,通常评分越高越安全
- 根据使用场景可分为反欺诈评分卡、申请评分卡、行为评分卡、催收评分卡等
#评分卡
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