一、业务背景

在金融风控领域,常常使用KS指标来衡量评估模型的区分度(discrimination),这也是风控模型最为追求的指标之一。下面将从区分度概念、KS计算方法、业务指导意义、几何解析、数学思想等角度,对KS进行深入剖析。

二、直观理解区分度的概念

在数据探索中,若想大致判断自变量x对因变量y有没有区分度,常会将样本分为正负来观察变量的分布差异。那么,如何判断自变量是有用的?直观理解,如果两个分布的重叠部分越小,代表正负样本的差异性越大,自变量就能更好的将正负样本区分开来。具体如图1所示。

打个比方,想象这个变量就是一双手,把这个分布往两边拉开。这双手的力量越大,两个概率分布间隔就越远,说明变量区分性就越强。

图1 - 正负样本分布差异对比

import matplotlib
import numpy as np
import matplotlib.pyplot as pltmu = 100  # mean of distribution
sigma = 15  # standard deviation of distribution
x = mu + sigma * np.random.randn(20000)num_bins = 80fig, ax = plt.subplots()# the histogram of the data
n, bins, patches = ax.hist(x, num_bins, density=1)
n1, bins1, patches1 = ax.hist(x - 20, num_bins, density=1)# add a 'best fit' line
y = ((1 / (np.sqrt(2 * np.pi) * sigma)) * np.exp(-0.5 * (1 / sigma * (bins - mu))**2))
y1 = ((1 / (np.sqrt(2 * np.pi) * sigma)) * np.exp(-0.5 * (1 / sigma * (bins - mu))**2))ax.plot(bins, y, '--', label = 'bads')
ax.plot(bins1, y, '--', label = 'goods')
ax.set_xlabel('Varible')
ax.set_ylabel('Probability density')
ax.set_title('Distribution of bads and goods')fig.tight_layout()
plt.grid(True,linestyle = ':', color = 'r', alpha = 0.7)
plt.legend()
plt.show()

三、KS统计量的定义

KS(Kolmogorov-Smirnov)统计量由两位苏联科学家A.N.Kolmogorov和N.V.Smirnov提出。在风控中KS通常用于评估模型区分度,区分度越大,说明模型风险排序能力越强。

KS是基于经验累积分布函数(Emporical Cumulative Distribution Function,ecdf)建立的,一般定义为:

四、KS计算过程及业务分析

KS常用的计算方法:

step1:对变量进行分箱(binning),可以选择等频、等距或者自定义距离。

step2:计算每个分箱区间的好样本数(goods)与坏样本数(bads)。

step3:计算每个分箱区间内累计好客户占总好客户比值(cum_good_rate)和累计坏客户占总坏客户比值(cum_bad_rate)。

step4:计算每个分箱区间累计坏客户占比与累计好客户占比的绝对值,得到KS曲线,也就是:

step5:在这些绝对值中取最大值,得到此变量的最终KS值。

为了便于理解,以具体的数据展示上述过程:

表1 - KS计算过程表

上标指标计算逻辑:

从上表中可以得到以下信息:

1.模型分数越高,逾期率越低,因此低分段bad_rate相对于高分段更高,cum_bad_rate曲线增长速率会比cum_good_rate更快。cum_bad_rate曲线在cum_good_rate曲线上方。

2.每个分箱样本数量基本相同,说明是等频分箱。

3.如将cutoff限定为0.65,则其cum_bad_rate为82.75%,表示有82.75%的坏客户会被拒绝,但同时cum_good_rate为29.69%,表示同时会有29.69%的好客户会被拒绝。

4.根据bad_rate的变化趋势,模型的排序性很好。如果是A卡,对排序性的要求会更高,因为需要根据风险等级对用户风险定价。

5.模型的KS达到53.1%,区分度较强,这是最理想的状态,实际业务应用中需要根据预设条件权衡通过率与坏账率的关系,一般cutoff不会选在理想值处,因此可知,KS是区分度的上限。

6.对于A卡来说,通常KS很难达到52%,因此,若上表数据为A卡结果,需要进一步确认模型是否发生过拟合。

需要进一步指出的是,KS是在放贷样本上评估的,放贷样本对于全量样本永远是有偏的。对于裸奔风控系统,偏差会很小;反之如果风控系统做的越好,偏差就会越大。因此KS不仅仅只是一个数字,其背后蕴藏的很多原因,需要结合业务进行具体分析。

当KS不佳时,为了达到预期目的,可进行以下校验:

1.检验入模变量是否已被策略使用,使用重复变量会导致模型无法命中本应被命中的坏客户,导致模型效果下降。

2.检验训练样本与验证样本之间的客群差异是否明显,其中包括时间分布,某些特征分布、特殊特征命中情况等。

3.开发对目标场景更具针对性的新特征,比如税务场景,在进行特征衍生时,更加关注税务指标;如识别长期风险,就使用强金融属性变量,对于欺诈风险,就使用一些短期的负面变量。

4.分群建模,但须考虑稳定性与差异性,防止过拟合。

5.坏客户分析,试图通过个性推共性。

对表1数据进行可视化,便得到KS曲线,主要使用到最后三列数据,即cum_good_rate、cum_bad_rate和KS,具体代码和图像如下:

import matplotlib as mpl
import matplotlib.pyplot as plt
import numpy as npcum_good_rate = np.array([0.00,0.05,0.12,0.20,0.30,0.41,0.53,0.71,0.86,1.00])
cum_bad_rate = np.array([0.26,0.45,0.59,0.72,0.83,0.90,0.97,0.99,1.00,1.00])x = np.linspace(0, 1, 10)plt.plot(x, cum_good_rate, label = 'cum_good_rate')
plt.plot(x, cum_bad_rate, label = 'cum_bad_rate')
plt.plot(x, cum_bad_rate - cum_good_rate, label = 'KS')
plt.title('KS Curve', fontsize = 16)
plt.grid(True,linestyle = ':', color = 'r', alpha = 0.7)
plt.axhline(y = 0.53, c = 'r', ls = '--', lw = 3)     #绘制平行于x轴的水平参考线
plt.axvline(x = 0.43, c = 'r', ls = '--', lw = 3)     #绘制平行于y轴的垂直参考线
plt.legend()
plt.show()

图2 - KS曲线

至此,我们已经了解了KS的计算的基本流程、评价标准、业务指导意义和优化思路,接下来有几个问题:

1.为什么风控中常用KS来评价模型效果,而不是使用准确率、召回率等?

2.最大KS只是一个宏观的结果,那么在不同的cutoff下取到max,模型效果有何差异?

3.一般情况下,KS越大越好,但为什么通常认为高于75%的KS就不可靠了?

五、风控中选择KS的原因

风控建模过程中,常把样本标签分为GBIX四类,其中:G=Good(好人,标记为0),B=Bad(坏人,标记为1),I=Indeterminate(不定,未进入表现期),X=Exclusion(排斥,异常样本)。

需要指出的是,Good与Bad之间的定义往往是模糊的、连续的,依赖于实际业务需求。这里举两个例子帮助理解:

例1:模糊性

对于12期信贷产品,如果设定表现期为前6期,S6D15(前6期中,任意一期逾期超15天)就是1,否则为0;但后来如果把表现期调整为3期,那么对于**“前3期都正常还款,但4~6期才发生逾期并超过15天”**的这部分样本,原本所定义的label就从1变成了0.因此业务需求不同,导致标签的定义不是绝对的。所以说,好坏样本定义一定要根据实际业务需求来,要在对业务进行充分理解与分析的基础上进行确定,而不是拍脑袋而为之。

例2:连续性

定义首期逾期超30天为1,否则为0。但是,逾期29天与逾期31天的用户之间其实并没有不可跨越的硬间隔,逾期29天的用户可能会进一步恶化为逾期31天。

由于逾期严重程度定义本身就带有一定的主观色彩,我们很难说逾期天数差几天有多少本质差异,所以哪怕我们为了转化为分类问题做了硬性的1和0的界限定义,但业务上理解还是一个连续问题。

因此,在风控中,y的定义并不是非黑即白(离散型),而用概率分布(连续型)衡量或许更合理。

那么,为什么选择KS指标呢?KS倾向于从概率角度衡量正负样本之间的差异,正是因为正负样本之间的模糊性与连续性,所以KS也是一条连续曲线。但最终为什么取一个最大值,主要原因是提取KS曲线中的的一个显著特征,从而便于相互比较。


技术交流

欢迎转载、收藏、有所收获点赞支持一下!

目前开通了技术交流群,群友已超过2000人,添加时最好的备注方式为:来源+兴趣方向,方便找到志同道合的朋友

  • 方式①、发送如下图片至微信,长按识别,后台回复:加群;
  • 方式②、添加微信号:dkl88191,备注:来自CSDN
  • 方式③、微信搜索公众号:Python学习与数据挖掘,后台回复:加群

深入理解风控中的 KS 原理相关推荐

  1. 前端面试 vue生命周期钩子是如何实现的?理解vue中模板编译原理?

    生命周期钩子在内部会被vue维护成一个数组(vue 内部有一个方法mergeOption)和全局的生命周期合并最终转换成数组,当执行到具体流程时会执行钩子(发布订阅模式),callHook来实现调用. ...

  2. 【SpringBoot】 理解Spirng中的IOC原理

    前言 前文已经介绍了Spring Bean的生命周期,在这个周期内有一个重要的概念就是: IOC容器 大家也知道IOC是Sping 的重要核心之一,那么如何理解它呢,它又是产生什么作用呢?本文就IOC ...

  3. 深入理解spring中的AOP原理——实现MethodInterceptor接口,自已动手写一个AOP

    1.前言 AOP是面向切面编程,即"Aspect Oriented Programming"的缩写.面对切面,就是面向我们的关注面,不能让非关注面影响到我们的关注面.而现实中非关切 ...

  4. 深入理解JDK中的Reference原理和源码实现

    Reference的简介和分类# 在JDK1.2之前,Java中的引用的定义是十分传统的:如果reference类型的数据中存储的数值代表的是另一块内存的起始地址,就称这块内存代表着一个引用.在这种定 ...

  5. git 忽略__pycache___图解git,用手绘图带你理解git中分支的原理和应用

    大家好,今天我们来聊git当中一个非常非常重要的特性,就是branch. git branch可以说是git当中最重要的概念了,甚至没有之一.因为git最重要的使用场景就是协同开发,大家一起在一个项目 ...

  6. 深入理解NLP中LayerNorm的原理以及LN的代码详解

    想来大厂字节跳动的同学不要错过这次2024届的暑期实习招聘,「2023年4月30日」就截止了: ❤️ 粉丝专属内推码:JYT8RH3 ❤️

  7. 一文带你理解Java中Lock的实现原理

    转载自   一文带你理解Java中Lock的实现原理 当多个线程需要访问某个公共资源的时候,我们知道需要通过加锁来保证资源的访问不会出问题.java提供了两种方式来加锁,一种是关键字:synchron ...

  8. [vue] 你知道vue中key的原理吗?说说你对它的理解

    [vue] 你知道vue中key的原理吗?说说你对它的理解 key的作用主要是为了高效的更新虚拟DOM; 如果没有唯一的key, 数据更新时, 相同节点更新前后无法准确一一对应起来,会导致更新效率降低 ...

  9. syslog 向内存中缓存_动画:深入浅出从根上理解 HTTP 缓存机制及原理!

    HTTP 缓存,对于前端的性能优化方面来讲,是非常关键的,从缓存中读取数据和直接向服务器请求数据,完全就是一个在天上,一个在地下. 我们最熟悉的是 HTTP 服务器响应返回状态码 304,304 代表 ...

最新文章

  1. gcc/g++添加头文件目录和库文件目录
  2. Linux程序内存跟踪,分享一款Linux进程和内存活动监视神器
  3. 美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题
  4. CF452F Permutations/Luogu2757 等差子序列 树状数组、Hash
  5. Windows下关于Git的行结束符
  6. 720环物全景制作_什么是全景?关于360°全景和720°全景的区别你知道吗?
  7. Android 系统文件夹功能(转)
  8. ffmpeg的编译(for x86,for arm)安装及使用(网络资料整理)
  9. 大学生影视主题网页制作 银翼杀手2049电影网页设计模板 学生静态网页作业成品 dreamweaver电影HTML网站制作
  10. MyBatis框架 动态SQL
  11. 服务器安全设置篇(珍藏补充版中)
  12. EOVA_JFINAL实现分布式架构
  13. singleTask
  14. [游戏技术]VampireSurvivors PC版修改
  15. phpredis使用zadd批量添加到集合
  16. vue使用echarts-liquidfill水球图不生效
  17. 变分推断 python_变分推断(Variational Inference)
  18. [JAVA]递归实现客户端与服务端之间的文件与文件夹传输
  19. linux查找表空间使用情况,表空间的使用情况查询及管理
  20. java与JSON语法及解析

热门文章

  1. java程序购买_JAVA(二) ——购买商品简单程序
  2. 卡特兰数 Catalan数
  3. CIO40: 学习.遇见更优秀的自己
  4. npm 安装node后,node-v和npm -v提示不是内部或外部命令,也不是可运行的程序 或批处理文件
  5. ILP的基本编译器技术
  6. 赶集网否认倒闭:是不是好公司,两三年后见分晓
  7. 2021年中国亚马逊耳环市场趋势报告、技术动态创新及2027年市场预测
  8. xdm俺来了、详解超市订单管理系统SSM版本
  9. 独立开发者+开源项目,超级个体的价值模式
  10. Java——一些适合新手练手的Java项目