信贷评分模型的评估指标常见的有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正样本预测正确数正样本总数TPTPFNTPR \frac{正样本预测正确数}{正样本总数} \frac{TP}{TPFN}TPR正样本总数正样本预测正确数TPFNTP假负率(False Negative Rate , FNR) FNR正样本预测错误数正样本总数FNTPFNFNR \frac{正样本预测错误数}{正样本总数} \frac{FN}{TPFN}FNR正样本总数正样本预测错误数TPFNFN假正率(False Positive Rate , FPR) FPR负样本预测错误数负样本总数FPTNFPFPR \frac{负样本预测错误数}{负样本总数} \frac{FP}{TNFP}FPR负样本总数负样本预测错误数TNFPFP真负率(True Negative Rate , TNR)又称特异度TNR负样本预测正确数负样本总数TNTNFPTNR \frac{负样本预测正确数}{负样本总数} \frac{TN}{TNFP}TNR负样本总数负样本预测正确数TNFPTN其中假负率FNR1−TPR、假正率FPR1−TNRROCROCReceiver Operating Characteristic曲线又称接受者操作特征曲线。曲线对应的纵坐标是TPR横坐标是FPR。如下就是一个ROC曲线ROC曲线是通过遍历所有阈值来绘制整条曲线的。如果我们不断的遍历所有阈值预测的正样本和负样本是在不断变化的相应的在ROC曲线图中也会沿着曲线滑动。通过计算过程可以知道ROC 曲线中的坐标(0,0)表示以概率为 1 作为 cutoff 时模型的预测情况此时模型将所有的样本都预测为负样本即在混淆矩阵中TPFP0所TPRFPR0坐标(1,1)表示以概率为 0 作为 cutoff 时模型的预测情况此时模型将所有的样本都预测为正样本即在混淆矩阵中FNTN0所以TPRFPR1。那么如何判断一个模型的ROC曲线是好的呢这个还是要回归到我们的目的FPR表示模型对于负样本误判的程度而TPR表示模型对正样本召回的程度。我们所希望的当然是负样本误判的越少越好正样本召回的越多越好。所以总结一下就是TPR越高同时FPR越低即ROC曲线在左上部分且越靠近左上角越好那么模型的性能就越好。AUCROC需要看出才能判断出好坏因此为了量化这一指标就有了AUC。AUC(Area Under Curve)是处于ROC曲线下方的那部分面积的大小。AUC越大代表模型的性能越好。一般AUC大于0.75或者0.8时认为模型效果较好可用而大于0.95的话要警惕过拟合的风险。KSKS与AUC类似是机器学习中常用于二分类模型的模型效果评估指标.KS全称为Kolmogorov-Smirnov它的公式定义如下smax(TPR−FPR)smax(TPR−FPR)smax(TPR−FPR)其中TPR和FPR就是前面ROC曲线中介绍过的TPRTrue PositiveRate : 正样本被检查出来的概率 FPRFalse 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与labeldfpd.DataFrame(score_dict)# 将数据转为df# -------------计算ks-----------------------------fpr,tpr,thresholdsroc_curve(df.label,df.score)# 计算fpr, tprks_valuemax(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,labelfpr)# 标示fprplt.plot(thresholds,tpr,labeltpr)# 标示tprplt.plot(thresholds,abs(fpr-tpr),labelfpr-tpr)# 标示fpr-tprplt.xlabel(thresholds)# 标示x坐标轴# 标记ksidxnp.argwhere(abs(fpr-tpr)ks_value)[0,0]ks_thresholdsthresholds[idx]plt.plot((ks_thresholds,ks_thresholds),(fpr[idx],tpr[idx]),labelks - {:.2f}.format(ks_value),colorr,markero,markerfacecolorr,markersize5)plt.scatter((ks_thresholds,ks_thresholds),(fpr[idx],tpr[idx]),colorr)plt.legend()plt.show()print(阈值:,ks_thresholds)print(KS:,ks_value)参考文章https://geekdaxue.co/read/yingtaoxianghello/gutcdghttps://www.bbbdata.com/text/25