KS和AUC解释

遇到以下问题,在https://www.sohu.com/a/132667664_278472中找到答案,在此记录,谢谢原文博主。
1.遇到KS=0.32,AUC=0.54问题:KS值只能反映出哪个分段是区分度最大的,不能反映出所有分段的效果。
2.输出预测值在[0.002,0.04]之间,KS阈值切分问题和KS横坐标表示含义。

● AUC的理解
参考回答:
Auc体现出容忍样本倾斜的能力,只反应模型对正负样本排序能力的强弱,而其直观含以上是任意取一个正样本和负样本,正样本的得分大于负样本的概率。
● AUC的计算公式
参考回答:
在这里插入图片描述

M为正样本数,N为负样本数。Rank的值代表能够产生前大后小这样的组合数,但是其中包含了(正,正)的情况,所以要减去正例的个数所以可得上述公式。
其中最常用的是TPR和FPR。最理想的模型,当然是TPR尽量高而FPR尽量低啦,然而任何模型在提高正确预测概率的同时,也会难以避免地增加误判率。听起来有点抽象,好在有ROC曲线非常形象地表达了二者之间的关系。

对于一个二分类模型,输出的最初结果是连续的;假设已经确定一个阀值,那么最初结果大于阀值时,则输出最终结果为1,小于阀值则输出为0。假如阀值取值为0.6,那么FPR和TPR就可以计算出此时的取值,标志为一个点,记为(FPR1,TPR1);如果阀值取值为0.5,同理就可以计算出另一个点,记为(FPR2,TPR2)。设定不同的阀值,就可以计算不同的点(FPR,TPR),

我们以FPR为横坐标,TPR为纵坐标,把不同的点连成曲线,就得到了ROC曲线。理论上ROC就是这么画出来的,那么问题来了,阀值如何确定?

以Logistic模型为例,模型输出的结果其实是概率,然后我们通过设定阀值,把概率转化为最终的输出结果0和1。首先出现在我们脑中的直观想法,就是把(0,1)区间进行等分,比如,等分为十个区间(其实分成多少份都可以,大家可以自由发挥),那么就可以分别以0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9为阈值,首先计算出根据阀值判定出的0和1有多少,以及判定为1真实为1和判断为1真实为0的有多少;然后计算出不同的(FPR,TPR)值;最后把点之间进行连线,画出的曲线即是ROC曲线。

下面,我们以某商业银行某时间段内某支行客户的逾期相关数据为例详细说明:P代表此支行的某客户的逾期率(暂且定义为在此时间段内某客户的逾期可能性),Y代表是否为高逾期客户,X是与逾期有关的相关指标,比如行业、企业规模、客户的五级分类等等。

然而,当把这个直观的想法对案例数据付诸实施的时候,我们发现计算出的概率值都落在[0.0092,0.578]区间范围内。这种情况下,如果还用上面的“直观想法”(即仍然假定P小于阈值时,判定为0),那么设定阈值为0.1到0.5时,能够计算出不同的(FPR,TPR)值;而将阈值取到0.6到0.9时,模型的判定结果为所有的样本就都是0了……so sad!计算出的(FPR,TPR)值都是(0,0),ROC曲线的点由11个变成了6个…….

看来实践是检验真理的唯一标准!面对这个特殊案例,我们的直观想法肯定需要改进。最终,我们的实现方法是:

  1. 把(0,1)区间升级为(min§,max§);

  2. 取值(min§,max§)/10,设定阀值为(min§,max§)*k/10,其中k=1,2,3,…,9;

  3. 根据不同的阀值,计算出不同的(FPR,TPR)值。

这时候再画出ROC曲线,就避免了上面的问题。

我给小伙伴讲了一下以上思路,然而小伙伴又发问了:这样在写代码实现的过程中,每次都要和阀值进行做比较,计算量比较大,不如先对样本计算出的P值从小到大排序(当然从大到小也可以),取前百分之几(比如10%)处的值为阀值,那么排序之后前百分之几(比如前10%)的判定为0,其他则判定为1。这样计算量就少了很多啦!

于是,我们继续改进阀值的设置,首先把Logistic模型输出的概率从小到大排序,然后取10%的值(也就是概率值)作为阀值,同理把10%*k(k=1,2,3,…,9)处的值作为阀值,计算出不同的(FPR,TPR)值,就可以画出ROC曲线啦。

可是,从小到大排序之后,每次取前百分之几处的值为阀值呢?总共分成10份还是100还是1000份呢?有选择困难症的小伙伴又纠结了,告诉你个办法,别纠结,有多少个模型输出的概率值就分成多少份,不再考虑百分之几!比如Logistic模型输出的概率有214个,那么我们把214个目标变量从小到大进行排序,然后分别以这214个的概率值为阀值,可以计算出214个不同的(FPR,TPR)值,也可以画出ROC曲线。

ROC曲线画好后,就要发挥用处!对于一个模型一组参数可以画出一条ROC曲线,此时最优的阀值是什么呢?TPR和FPR是正相关的,也就是说,正确判定出1的数量增加时,必然要伴随着代价:误判为1的FP也增加。

从ROC曲线上也可以反映出这种变化,从ΔTPR>ΔFPR到ΔTPR<ΔFPR,最理想的阀值是ΔTPR=ΔFPR时。但是在实际应用中,我们很少能够给出ROC曲线的函数表达式,这时的解决方法包括:

(1)给出ROC曲线的拟合函数表达式,然后计算出最优的阀值,这个目前通过软件实现难度不大:如何给出最优拟合函数,计算数学上有很多方法;

(2)计算出ΔTPR≈ΔFPR的点即为最优的阀值;

(3)从业务上给出最优的阀值。

对于一个模型多个参数的情况,就可以画出多条ROC曲线,此时哪组参数是最优的呢?我们可以结合AUC指标,哪组参数的AUC值越高,说明此组参数下的模型效果越好。另外,在SAS的评分模型输出中,常用来判断收入分配公平程度的gini系数也用来评价模型,此时gini=2*AUC-1.

对了,解释一下AUC指标:ROC曲线下方的面积Area Under the ROC Curve,简称为AUC。这是评价模型的另一个方法,AUC值越大,说明模型的分辨效果越好。

常用的模型评价还有K-S曲线,它和ROC曲线的画法异曲同工。以Logistic模型为例,首先把Logistic模型输出的概率从大到小排序,然后取10%的值(也就是概率值)作为阀值,同理把10%*k(k=1,2,3,…,9)处的值作为阀值,计算出不同的FPR和TPR值,以10%*k(k=1,2,3,…,9)为横坐标,分别以TPR和FPR的值为纵坐标,就可以画出两个曲线,这就是K-S曲线。

从K-S曲线就能衍生出KS值,KS=max(TPR-FPR),即是两条曲线之间的最大间隔距离。当(TPR-FPR)最大时,也就是ΔTPR-ΔFPR=0,这和ROC曲线上找最优阀值的条件ΔTPR=ΔFPR是一样的。从这点也可以看出,ROC曲线、K-S曲线、KS值的本质是相同的。

以某模型的评价为例,在K-S曲线的横坐标0.4时取KS=0.53,可以认为最优的阀值是从小到大排序的40%处的值:

在这里插入图片描述

在这里插入图片描述

K-S曲线能直观地找出模型中差异最大的一个分段,比如评分模型就比较适合用KS值进行评估;但同时,KS值只能反映出哪个分段是区分度最大的,不能反映出所有分段的效果。所以,在实际应用中,模型评价一般需要将ROC曲线、K-S曲线、KS值、AUC指标结合起来使用。

### Python 实现 LIFT、KS AUC 指标的代码 #### 计算 Lift 值 Lift 是衡量模型预测能力的一个重要指标,它表示模型相对于随机猜测的提升程度。 ```python def calculate_lift(y_true, y_pred_proba): df = pd.DataFrame({ 'true': y_true, 'proba': y_pred_proba }) # 将数据按概率降序排列并分组 df_sorted = df.sort_values('proba', ascending=False).reset_index(drop=True) total_positive = df['true'].sum() n_bins = 10 bins = [] for i in range(1, n_bins + 1): bin_df = df_sorted.iloc[(i-1)*len(df)//n_bins : i*len(df)//n_bins] positive_rate_in_bin = bin_df['true'].mean() / (total_positive/len(df)) bins.append(positive_rate_in_bin) return bins ``` 此函数返回的是各个区间内的 Lift 值列表[^2]。 #### 计算 KS 统计量 Kolmogorov-Smirnov (KS) 统计量用于度量两个分布之间的最大差异,在信用评分卡构建过程中经常被用来评估模型区分好坏客户的能力。 ```python from scipy.stats import ks_2samp def calculate_ks_statistic(y_true, y_pred_proba): fpr, tpr, thresholds = roc_curve(y_true, y_pred_proba) ks_value = max(abs(tpr - fpr)) return ks_value ``` 这段代码通过 `scipy` 库中的 `ks_2samp()` 函数来计算 KS 值。这里采用更常见的基于 ROC 曲线的方法获取 TPR FPR 后求差的最大绝对值作为 KS 值[^3]。 #### 计算 AUC 值 Area Under the Curve (AUC),即曲线下面积,通常指代 ROC 曲线下的面积,反映了分类器整体性能的好坏。 ```python def calculate_auc(y_true, y_pred_proba): auc_score = roc_auc_score(y_true, y_pred_proba) return auc_score ``` 上述代码利用了 scikit-learn 提供的功能直接计算给定真实标签预测概率下对应的 AUC 得分[^1]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值