终于把风控中的 KS 搞懂了!!

大家好,我是东哥。

本篇来介绍风控模型中KS评估指标,包括KS的定义、计算步骤、应用标准、上线后效果评估、以及Python代码实操,内容节选自👉《100天风控专家》评分卡模型篇。

1. 什么是KS?

KS(Kolmogorov-Smirnov)统计量由两位苏联数学家A.N.Kolmogorov和N.V.Smirnov提出。
在风控中,KS常用于评估模型或者变量的区分度,业内通用的定义为:好坏客户累积分布差异的最大值。
图片

2. KS计算步骤

具体计算步骤如下:

①变量分箱,可以选择等频、等距、决策树或者自定义均可

②计算每个分箱区间的好客户数(good_count)和坏客户数(bad_count)

③计算每个分箱区间的好/坏客户占比(goodpct/badpct)、累计好/坏客户数占比(cum_goodpct/cum_badpct)

④计算每个分箱区间累计好/坏客户数占比差的绝对值,得到KS

⑤在所有分箱的KS中取最大值,得到该变量最终的KS值

图片
在这里插入图片描述

3. KS应用和评估标准

1)应用对象

KS指标可以应用在模型或规则上,一般用于模型上较多,规则上通常看Lift提升度。

当应用于模型时,KS可以辅助设定cutoff阈值。理论上可以将分箱的KS最大值对应的取值作为cutoff,但实际还需要考虑对通过率的影响,二者之间做个平衡,所以一般不一定会设置在理想值。

2)评估标准

KS的取值范围是[0,1],可以用小数或者以%形式的表示,比如KS=0.3或者30%。通常来说,KS越大代表好坏客户的区分度越高。具体多少算高要看使用场景,就贷前/中/后的模型来说,KS也有不同的衡量标准。

贷前A卡模型通常KS大于0.3就视为有较强的区分度了,但一般至少要求0.2以上,0.2以下不建议使用;贷中B卡模型的KS一般要求大于0.4以上;贷后C卡模型的KS一般要求大于0.5以上。如果是子模型或者单一维度模型,可以适当下降标准。

另外如果KS值高的离谱,比如贷前A卡模型高于50以上,需要怀疑模型是否存在过拟合,或者数据泄露。

4. 模型上线后KS评估

模型上线后KS一定下降,这属于正常现象。

① 为什么KS会下降?

由于模型上线后只能观测到“通过的样本”来计算KS,相对于离线分析的整体样本而言(通过和拒绝样本)是缺少了拒绝样本的,也就是上线前后统计的样本分布是发生了变化的,这就导致了KS值的不同。

那具体下降的原因是什么?原因在于,拒绝样本的坏客户浓度高于通过样本的坏客户浓度。离线分析时,因为拒绝样本坏客户浓度高时,好坏的区分相对更简单,也就导致KS会更高。而一旦拒绝样本不在了(在线上被拒掉了),好坏的区分能力也就下降了。

图片
在这里插入图片描述

5. KS计算的Python代码

图片
在这里插入图片描述

感兴趣可VX搜:100天风控专家
或者👉《100天风控专家

### 金融风控中的KS值计算 KS值(Kolmogorov-Smirnov Statistic)是一种用于衡量模型区分能力的重要指标,在金融风控领域常被用来评估信用评分模型效果。它通过比较正负样本分布之间的最大差异来反映模型的区分度。 #### KS值的定义与公式 KS值的核心在于计算累积分布函数(CDF)的最大差值。假设我们有一个预测概率列表 `prob` 和对应的标签列表 `label`,其中 `label=1` 表示正类(如违约),`label=0` 表示负类(如未违约)。那么: - 正类的概率累积分布记为 \( F_+(p) \),表示分数小于等于某个阈值的比例; - 负类的概率累积分布记为 \( F_-(p) \),同样表示分数小于等于某个阈值的比例; KS值可以定义为这两个分布之间绝对差值的最大值: \[ KS = \max |F_+(p) - F_-(p)| \] --- #### Python实现KS值计算 以下是基于Python实现KS值的具体代码示例,利用了Toad库的功能[^1]: ```python import numpy as np from sklearn.model_selection import train_test_split from toad.metrics import KS_bucket # 假设 prob_off 是模型输出的概率,offy 是真实标签 np.random.seed(42) prob_off = np.random.rand(1000) # 示例:生成随机概率 offy = np.where(prob_off > 0.5, 1, 0) # 示例:生成二分类标签 # 使用 Toad 的 KS_bucket 函数计算分箱后的 KSks_result = KS_bucket(prob_off, offy, bucket=15, method='quantile') print("KS Value:", ks_result['KS'].max()) # 输出最大的 KS 值 ``` 上述代码中,`bucket=15` 参数指定了将数据分为15个区间进行分析,而 `method='quantile'` 则采用百分位数法进行分组。 --- #### 数据划分与训练测试集准备 为了确保KS值能够有效评估模型性能,通常需要先对数据进行合理的划分。以下是一个简单的例子,展示如何使用随机抽样的方式分割数据[^3]: ```python from sklearn.model_selection import train_test_split # dt_s 是原始数据框,“creditability”为目标变量 train, test = train_test_split(dt_s, test_size=0.3, random_state=42) # 进一步分离特征和目标列 X_train, y_train = train.drop(columns=["creditability"]), train["creditability"] X_test, y_test = test.drop(columns=["creditability"]), test["creditability"] # 可以在此基础上构建并评估模型 ``` --- #### 模型评估方法概述 在金融风控建模过程中,除了KS值之外,还有其他常用的评估指标,例如AUC、Gini系数等。这些指标共同构成了全面评价模型效果的基础框架[^2]。具体来说: - **AUC (Area Under Curve)**: ROC曲线下的面积,反映了模型的整体表现。 - **Gini Coefficient**: AUC的一种变形形式,强调模型对于不同群体的区分能力。 - **PSI (Population Stability Index)**: 测量实际数据分布相对于预期的变化程度。 以上各项均需结合业务场景综合考量,从而得出最优解。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值