再聊一聊AUC指标

       关于模型评估的指标,之前已经写过不少这方面的文章,最近在实践中又有了一点新的思考,本文对模型评估中的AUC指标再进行一些简单的探讨。

       情况一,以下图中的数据为例,1代表用户发生逾期,标记为坏样本,模型预测的是用户发生逾期的概率。模型的KS为0.32,AUC为0.712,bin越小坏样本率越低。

       情况二,如果将1和0的定义进行互换,即1代表用户未逾期,0代表用户逾期,模型预测的是用户未逾期的概率。此时得到模型的KS为0.32,AUC为0.288,正好是1-0.712。所以预测目标如果变反,会导致AUC的值变成1-原来的AUC。特意又去翻了一下葫芦书,在介绍AUC的时候是这么写的:AUC的取值一般在0.5-1之间,如果不是的话,只要把模型预测的概率反转成1-p就可以得到一个更好的分类器。

       情况三,还是同最上面的例子,1代表用户发生逾期,标记为坏样本,模型预测的是用户发生逾期的概率。

        模型的AUC值为0.491,小于0.5,正常来说一般是大于0.5的。情况一中,bin越大坏样本率越高;情况二中,bin越大坏样本率越低,AUC小于0.5。所以情况三出现的原因应该是,在理应是bin越大坏样本率越高的情形中,出现了bin越大坏样本率越低的情况,简单来说就是出现了风险倒挂或者反向预测。看上表中坏样本率这一列,也可以发现bin1-2这两个bin的坏样本率出现了明显的倒挂。

        下面将每两个bin合成一个bin,再看下整体的区分度情况。除了bin1-2的坏账率明显倒挂之外,其余bin仍有一定的区分度。所以即使AUC接近0.5甚至小于0.5的情况下,也不能一概而论说该模型完全没有区分度。至于倒挂的原因,这里胡乱提一个,比如从组成该模型的各变量维度上看,bin1-2确实是被该模型识别出来更好的人,但是由于对这些人提额过度超过了其真实还款能力,所以发生逾期。抛转引玉,本文不再过多展开。

       最后,本文想传达的一个观点,在实践中遇到指标异常的情况,不要简单地归类为该变量/模型效果不好,还是要回到指标的计算逻辑,多思考背后的原因,一个指标也只是反映了某一部分的情况,这样也有利于加深对这些指标的理解和运用,带着好奇心去思考。

如需要文中案例,可后台回复“AUC指标”。往期关于指标的介绍文章可通过以下链接直达:

1、模型评估指标之间的联系

2、风险区分度—IV、KS和分布

【作者】:Labryant  
【原创公众号】:风控猎人  
【简介】:做一个有规划的长期主义者。
【转载说明】:转载请说明出处,谢谢合作!~

### AUC指标的概念 AUC(Area Under Curve)是机器学习领域中的个重要评价指标,主要用于二分类任务。它表示的是随机抽取的个正样本被模型预测的概率高于随机抽取的个负样本的概率[^1]。 具体而言,AUC衡量了个分类器区分正类和负类的能力。如果个分类器的AUC值接近于1,则说明该分类器具有很强的区分能力;而当AUC值接近0.5时,则表明分类器的表现几乎等同于随机猜测[^2]。 --- ### AUC的计算方法 #### 方法:基于ROC曲线面积积分法 通过绘制ROC曲线并计算其下的面积可以得到AUC值。ROC曲线是以假阳性率(False Positive Rate, FPR)为横轴、真阳性率(True Positive Rate, TPR)为纵轴的条曲线。FPR和TPR分别定义如下: \[ FPR = \frac{FP}{FP + TN} \] \[ TPR = \frac{TP}{TP + FN} \] 其中: - \( TP \): True Positives (真正例数) - \( FP \): False Positives (假正例数) - \( TN \): True Negatives (真反例数) - \( FN \): False Negatives (假反例数) 通过对不同阈值下计算出的\( (FPR, TPR) \)点进行连线形成ROC曲线,并利用数值积分的方法求得曲线下方的面积即为AUC值。 #### 方法二:直接统计法 另种更直观的方式是从数据本身出发,在不显式构建ROC曲线的情况下直接估计AUC值。假设我们有N个正样本和M个负样本,对于每对由个正样本和个负样本组成的组合,判断模型对该正样本给出的预测分数是否大于对负样本的预测分数。设总共有C次这样的情况发生,则AUC可近似表示为: \[ AUC = \frac{C}{N \times M} \] 这种方法实际上是对上述概念的种实现形式。 以下是Python代码示例展示如何手动计算AUC: ```python import numpy as np def compute_auc(y_true, y_score): n_pos = sum(1 for y in y_true if y == 1) n_neg = len(y_true) - n_pos rank_order = sorted([(score, label) for score, label in zip(y_score, y_true)], key=lambda x: x[0], reverse=True) auc = 0 pos_count = 0 neg_count = 0 for _, label in rank_order: if label == 1: pos_count += 1 else: neg_count += 1 auc += pos_count return auc / (n_pos * n_neg) # Example usage y_true = [0, 0, 1, 1] y_scores = [0.1, 0.4, 0.35, 0.8] print(compute_auc(y_true, y_scores)) ``` 此函数实现了第二种计算方式的核心逻辑。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值