赛题数据
赛题数据来自某信贷平台的贷款记录,总数据量超过 120 万条,包含 47 列变量信息,其中 15 列为匿名变量。从中抽取 80 万条作为训练集,20 万条作为测试集A,20 万条作为测试集B,同时会对 employmentTitle、purpose、postCode 和 title 等信息进行脱敏。
字段表:
评价标准
提交结果为每个测试样本是 1 的概率,也就是 y = 1 y=1 y=1 的概率。评价方法为 AUC 评估模型效果(越大越好)。
AUC(Area Under Curve)的定义为 ROC曲线 下与坐标轴围成的面积。
提交格式
提交的格式如下所示:
id,isDefault800000,0.5800001,0.5800002,0.5800003,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+FNTPFPR:在所有实际为负类的样本中,被错误地判断为正类之比率
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 npfrom sklearn.metrics import confusion_matrixy_pred = [0, 1, 0, 1]y_true = [0, 1, 1, 0]print('混淆矩阵:\n',confusion_matrix(y_true, y_pred))
Accuracy
## Accuracyfrom sklearn.metrics import accuracy_scorey_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-scorefrom sklearn import metricsy_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 pltfrom sklearn.metrics import precision_recall_curvey_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_curvey_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
## AUCimport numpy as npfrom sklearn.metrics import roc_auc_scorey_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_curvey_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/goodrateB = PDO/np.log(2) A = P0 + B*np.log(2*theta0) score = A-B*np.log(prob/(1-prob))return score