风控评分卡模型原理与应用(六):模型评价指标KS和ROC

信贷评分模型的评估指标常见的有P-R曲线、AUC、KS、混淆矩阵、AR、洛伦茨曲线等,这篇文章主要介绍评分卡模型常用的判断指标AUC和KS。

AUC

对于分类问题,我们一般关注的是分类的准确率。信贷评分模型中常用的评估指标为AUC

混淆矩阵(Confuse Matrix)

针对一个二分类问题,即将实例分成正类(positive)或负类(negative),在实际分类中会出现以下四种情况:
(1)若一个实例是正类,并且被预测为正类,即为真正类TP(True Positive )
(2)若一个实例是正类,但是被预测为负类,即为假负类FN(False Negative )
(3)若一个实例是负类,但是被预测为正类,即为假正类FP(False Positive )
(4)若一个实例是负类,并且被预测为负类,即为真负类TN(True Negative )

将上面说的几种情况列出来,就是一个混淆矩阵:

通过混淆矩阵可以大致看出预测正确的数量和预测错误的数量。

ROC曲线和AUC

在正式介绍ROC之前,我们还要再介绍两个指标,这两个指标的选择使得ROC可以无视样本的不平衡。这两个指标分别是:灵敏度(sensitivity)和特异度(specificity),也叫做真正率(TPR)和 真负率(TNR),具体公式如下。

  • 真正率(True Positive Rate , TPR),又称灵敏度:
    TPR=正样本预测正确数正样本总数=TPTP+FNTPR = \frac{正样本预测正确数}{正样本总数} = \frac{TP}{TP+FN}TPR=正样本总数正样本预测正确数=TP+FNTP

  • 假负率(False Negative Rate , FNR) :
    FNR=正样本预测错误数正样本总数=FNTP+FNFNR = \frac{正样本预测错误数}{正样本总数} = \frac{FN}{TP+FN}FNR=正样本总数正样本预测错误数=TP+FNFN

  • 假正率(False Positive Rate , FPR) :
    FPR=负样本预测错误数负样本总数=FPTN+FPFPR = \frac{负样本预测错误数}{负样本总数} = \frac{FP}{TN+FP}FPR=负样本总数负样本预测错误数=TN+FPFP

  • 真负率(True Negative Rate , TNR),又称特异度:
    TNR=负样本预测正确数负样本总数=TNTN+FPTNR = \frac{负样本预测正确数}{负样本总数} = \frac{TN}{TN+FP}TNR=负样本总数负样本预测正确数=TN+FPTN

其中假负率FNR=1−TPR、假正率FPR=1−TNR

ROC

ROC(Receiver Operating Characteristic)曲线,又称接受者操作特征曲线。曲线对应的纵坐标是TPR,横坐标是FPR。如下就是一个ROC曲线:

ROC曲线是通过遍历所有阈值来绘制整条曲线的。如果我们不断的遍历所有阈值,预测的正样本和负样本是在不断变化的,相应的在ROC曲线图中也会沿着曲线滑动。

通过计算过程可以知道,ROC 曲线中的坐标(0,0)表示以概率为 1 作为 cutoff 时模型的预测情况,此时模型将所有的样本都预测为负样本,即在混淆矩阵中TP=FP=0,所TPR=FPR=0;坐标(1,1)表示以概率为 0 作为 cutoff 时模型的预测情况,此时模型将所有的样本都预测为正样本即在混淆矩阵中FN=TN=0,所以TPR=FPR=1。

那么如何判断一个模型的ROC曲线是好的呢?这个还是要回归到我们的目的:FPR表示模型对于负样本误判的程度,而TPR表示模型对正样本召回的程度。我们所希望的当然是:负样本误判的越少越好,正样本召回的越多越好。所以总结一下就是TPR越高,同时FPR越低(即ROC曲线在左上部分且越靠近左上角越好),那么模型的性能就越好。

AUC

ROC需要看出才能判断出好坏,因此为了量化这一指标就有了AUC。AUC(Area Under Curve)是处于ROC曲线下方的那部分面积的大小。AUC越大,代表模型的性能越好。

一般AUC大于0.75或者0.8时认为模型效果较好可用,而大于0.95的话要警惕过拟合的风险。

KS

KS与AUC类似,是机器学习中常用于二分类模型的模型效果评估指标.KS全称为Kolmogorov-Smirnov,它的公式定义如下:
s=max(TPR−FPR)s=max(TPR−FPR)s=max(TPRFPR)
其中TPR和FPR就是前面ROC曲线中介绍过的,TPR(True PositiveRate) : 正样本被检查出来的概率 , FPR(False PositiveRate): 负样本被模型错误归为正样本的概率。

按照概率分组(或者以最后的评分卡数值)为x轴,TPR、FPR、(TPR-FPR)为y轴所组成的三条变化曲线,然后标出KS值的所在位置(即TPR与FPR的最大间隔点)

KS 值反应了模型对好坏样本的区分能力,KS 值越大表示对好坏样本的区分能力越强。

python调用sklearn的roc_curve函数计算KS和绘制KS曲线的代码如下:

fromsklearn.metricsimportroc_curveimportpandasaspdimportmatplotlib.pyplotaspltimportnumpyasnp# -----------数据生成----------------------------score_dict={'score':[0.71,0.612,0.127,0.330,0.428,0.889,0.188,0.229,0.889,0.022,0.43,0.952,0.622,0.11,0.22,0.33,0.44,0.55,0.66,0.77,0.88,0.99],'label':[1,0,0,0,0,1,0,0,0,0,0,1,1,0,0,0,0,1,1,1,1,1]}# score与labeldf=pd.DataFrame(score_dict)# 将数据转为df# -------------计算ks-----------------------------fpr,tpr,thresholds=roc_curve(df.label,df.score)# 计算fpr, tprks_value=max(abs(fpr-tpr))# 计算KS: abs(fpr-tpr)最大者就是KS# ----------画KS曲线-------------------------------thresholds[0]=max(df['score'])+0.01# 修正thresholds的最大值plt.figure(figsize=(10,5))# 设置图片的大小plt.plot(thresholds,fpr,label='fpr')# 标示fprplt.plot(thresholds,tpr,label='tpr')# 标示tprplt.plot(thresholds,abs(fpr-tpr),label='fpr-tpr')# 标示fpr-tprplt.xlabel('thresholds')# 标示x坐标轴# 标记ksidx=np.argwhere(abs(fpr-tpr)==ks_value)[0,0]ks_thresholds=thresholds[idx]plt.plot((ks_thresholds,ks_thresholds),(fpr[idx],tpr[idx]),label='ks - {:.2f}'.format(ks_value),color='r',marker='o',markerfacecolor='r',markersize=5)plt.scatter((ks_thresholds,ks_thresholds),(fpr[idx],tpr[idx]),color='r')plt.legend()plt.show()print('阈值:',ks_thresholds)print('KS:',ks_value)


参考文章:
https://geekdaxue.co/read/yingtaoxiang@hello/gutcdg
https://www.bbbdata.com/text/25