机器学习初学者 02月13日
终于把风控中的 ROC/AUC 搞懂了!!
index_new5.html
../../../zaker_core/zaker_tpl_static/wap/tpl_guoji1.html

 

文章介绍了信贷风控中ROC/AUC的概念、使用标准及Python代码实操,包括混淆矩阵、准确率、精准率、召回率等指标,还讲解了P-R曲线、F1分数、ROC曲线、AUC等内容。

🎯混淆矩阵:用符号代替数字,便于理解预测与实际表现的交叉情况

📊准确率:判断总样本的正确率,但在样本不平衡时可能失效

🔍精准率:针对预测结果,衡量正样本预测的准确程度

🔎召回率:针对原样本,衡量实际正样本被预测出的概率

📈AUC:ROC曲线下的面积,用于评估模型性能

东哥起飞 2025-02-13 12:03 浙江


信贷风控领域中,模型应用和规则的制定,常需要一个指标,就是AUC。本次来给大家详细ROC/AUC的概念、使用标准、以及Python代码实操,内容节选自?100天风控专家评估指标

1、混淆矩阵

信贷业务中,风控模型大多是二分类模型,如果将预测表现与实际表现(目标变量Y[0,1])进行两两交叉,就会出现以下4种情况,这就是混淆矩阵(confusionmatrix)。

由于1和0数字混合在一起,阅读性不好,所以我们用换了符号(P/N)和(T/F)代替。这种表示方法可以这么简单的理解:先看①预测结果(P/N),再根据②实际表现对比预测结果,给出判断结果(T/F)。按这个顺序理解,这四种情况就很好记住了。

2、准确率

既然是个分类指标,我们可以很自然的想到准确率,准确率的定义是预测正确的结果占总样本的百分比,公式:

准确率=(TP+TN)/(TP+TN+FP+FN)

虽然准确率可以判断总的正确率,但是在样本不平衡的情况下,并不能作为很好的指标来衡量结果。举个简单的例子,比如在一个总样本中,正样本占90%,负样本占10%,样本是严重不平衡的。对于这种情况,我们只需要将全部样本预测为正样本即可得到90%的高准确率,但实际上我们并没有很用心的分类,只是随便无脑一分而已。这就说明了:由于样本不平衡的问题,导致了得到的高准确率结果含有很大的水分。即如果样本不平衡,准确率就会失效。

3、精准率

精准率(Precision)又叫查准率,它是针对预测结果而言的,它的含义是在所有被预测为正的样本中实际为正的样本的概率,意思就是在预测为正样本的结果中,我们有多少把握可以预测正确,其公式如下:

精准率=TP/(TP+FP)

精准率和准确率看上去有些类似,但是完全不同的两个概念。精准率代表对正样本结果中的预测准确程度,而准确率则代表整体的预测准确程度,既包括正样本,也包括负样本。

4、召回率

召回率(Recall)又叫查全率,它是针对原样本而言的,它的含义是在实际为正的样本中被预测为正样本的概率,其公式如下:

召回率=TP/(TP+FN)

在信贷风控中,相对好用户,我们更关心坏用户,不能错放过任何一个坏用户。因为如果我们过多的将坏用户当成好用户,这样后续可能发生的违约金额会远超过好用户偿还的借贷利息金额,造成严重偿失。召回率表示总共100个坏客户中能识别出多少个,值越高代表实际坏用户被预测出来的概率越高,它的含义类似:宁可错杀一千,绝不放过一个。

5、P-R曲线

通过公式我们发现:精准率和召回率的分子是相同,都是TP,但分母是不同的,一个是(TP+FP),一个是(TP+FN)。

两者的关系可以用一个P-R(precision-recall)图来展示:

如何理解P-R 曲线?

P-R曲线遍历了从0到1之间的所有值作为阈值,而每个阈值都对应着一对精准率和召回率,从而就得到了这条曲线。逻辑回归模型输出结果为0到1,是一个排序结果,比如,我们定义阈值为0.5,即概率小于0.5的我们都认为是好用户,而大于0.5都认为是坏用户。因此,对于阈值为0.5的情况下,我们可以得到相应的一对精准率和召回率,对应P-R曲线上一个点。

6、F1分数

我们希望精准率和召回率同时都高,但实际上这两个指标是此消彼长的。P-R曲线图中明显看到,如果其中一个非常高,另一个肯定会非常低。选取合适的阈值点要根据实际需求,比如我们想要高的召回率,那就会牺牲一些精准率,要在保证召回率高的情况下,精准率也不那么低。

如果想要找到这样一个平衡点,需要一个新指标:F1分数。F1分数同时考虑了精准率和召回率,可以让二者同时达到最高,取一个平衡。其公式如下:

F1分数 = 2*精准率*召回率 / (精准率 + 召回率)

我们在图中看到的平衡点就是F1分数得来的结果

F1分数计算:

A点 =2*0.8*0.8/(0.8+0.8)=0.8

B点 = 2*0.9*0.7/(0.9+0.7)=0.7875

C点 = 2*0.4*0.95/(0.4+0.95)=0.5630

7、ROC曲线

1)真正率(TPR)、假正率(FPR)

ROC曲线是基于混淆矩阵的另外两个指标绘制而成,这两个指标是:真正率(TPR)、假正率(FPR)

真正率(TPR)= TP/(TP+FN) = 召回率

假正率(FPR)= FP/(FP+TN)

真正率(TPR)表示在总的坏客户中有多少被识别出来,越高越好,而假正率(FPR)表示有多少的负样本被错误地预测为正样本,越少越好。下面示意图,我们发现TPR和FPR分别是基于实际表现1和0出发的,分别从实际的正样本和负样本中来观察相关概率问题。正因如此,所以无论样本是否平衡,都不会被影响。所以可以看出:如果我们从实际表现的各个结果角度出发,就可以避免样本不平衡的问题了,这也是为什么选用TPR和FPR作为ROC曲线坐标的原因了。

2)认识ROC曲线图

与前面的P-R曲线类似,ROC曲线也是通过遍历所有阈值来绘制整条曲线的。横坐标是FPR,纵坐标是TPR。在这个曲线图中,随着TPR不断变大,FPR也不断变大。

遍历所有的阈值,则TPR和FPR不断变化,相应的,在ROC曲线图中也会沿着曲线滑动。

3)如何判断ROC曲线的好坏?

改变阈值只是不断地改变TPR和FPR,但是曲线本身是不会变的。那么如何判断一个模型的ROC曲线是好的呢?这个还是要回归到我们的本质:FPR表示模型“误杀”的程度,而TPR表示模型“抓坏”的程度。我们希望的是:误杀的越少越好,抓坏的越多越好。所以总结一下就是TPR越高,同时FPR越低(即ROC曲线越陡),那么模型的性能就越好。参考如下动态图进行理解。

4)ROC曲线的好处

前面已经对ROC曲线为什么可以无视样本不平衡做了解释,下面我们用动态图的形式再次展示一下它是如何工作的。我们发现:无论红蓝色样本比例如何改变,ROC曲线都没有影响。

8、AUC

AUC(AreaUnder Curve)就是ROC曲线下的面积。如果我们连接对角线,它的面积正好是0.5。对角线的实际含义是:随机判断(相当于盲猜),正负样本覆盖率应该都是50%,表示随机效果。正常来说,ROC曲线越陡越好,所以理想值就是1,一个正方形,而最差的随机判断都有0.5,所以一般AUC的值是介于0.5到1之间的。

AUC的一般判断标准:

信贷业务中,根据具体场景AUC能达到的水平各不相同,比如贷中贷后一般至少在0.7以上。贷前模型如果能到0.7算是比较不错的效果了。

Python代码

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_true, df['xgb_pred'])  # 计算真实标签和预测标签之间的混淆矩阵  
mask = np.zeros_like(cm)
mask[np.triu_indices_from(mask,1)] = True
plt.style.use('classic')
plt.figure(facecolor='white',dpi=80)
sns.heatmap(cm, mask=mask, annot=True, fmt='.2f', linewidths=0.2)
plt.xlabel('y_true',fontsize=12)
plt.ylabel('y_pred',fontsize=12)
plt.title('Confusion Matrix', fontsize=14)
plt.show()

from sklearn.metrics import precision_recall_curve
from sklearn.metrics import average_precision_score
average_precision = average_precision_score(y_true, preds)
precision, recall, thres = precision_recall_curve(y_true, preds)
plt.style.use('classic')
plt.figure(facecolor='white',dpi=100)
plt.plot(recall, precision, color='#F59B00', alpha=1, label='PR curve (area = {:.2f})'.format(average_precision))
plt.fill_between(recall, precision, alpha=0.2, color='#F59B00')
plt.xlabel('Recall',fontsize=12)
plt.ylabel('Precision',fontsize=12)
plt.ylim([0.01.01])
plt.xlim([0.01.05])
plt.title('Precision-Recall curve', fontsize=14)
plt.legend(loc="best",fontsize=12)

fpr, tpr, _ = roc_curve(y, y_preds)
auc = round(roc_auc_score(y, y_preds), 4)
    
plt.style.use('classic')
plt.figure(facecolor='white',dpi=80)
plt.plot(fpr, tpr, label='{}_auc: '.format(datatype)+str(auc), color='red', linestyle='-', linewidth=1.5)
plt.fill_between(fpr, tpr, alpha=0.2, color='#F08080')
plt.plot([0,1], [0,1], 'k--')
plt.xlabel("FPR")
plt.ylabel("TPR")
plt.xlim(-0.01,1)
plt.ylim(0,1.01)
plt.title("ROC curve of %s (AUC = %.4f)" % (datatype, auc), fontsize=14)
plt.legend(fontsize=12, loc='best')

以上内容完整讲解和数据代码(真实业务数据+代码实操)参考?100天风控专家更新150期,涵盖业务、产品、策略、模、数据等6大核心模块、10大专栏、共计60h以上

--end--

以上内容节选自?100天风控专家

阅读原文

跳转微信打开

Fish AI Reader

Fish AI Reader

AI辅助创作,多种专业模板,深度分析,高质量内容生成。从观点提取到深度思考,FishAI为您提供全方位的创作支持。新版本引入自定义参数,让您的创作更加个性化和精准。

FishAI

FishAI

鱼阅,AI 时代的下一个智能信息助手,助你摆脱信息焦虑

联系邮箱 441953276@qq.com

相关标签

信贷风控 混淆矩阵 AUC Python代码
相关文章