转自:https://zhuanlan.zhihu.com/p/79934510

风控业务背景

在风控中,我们常用KS指标来评估模型的区分度(discrimination)。这也是风控模型同学最为追求的指标之一。那么,有多少人真正理解KS背后的内涵?本文将从区分度的概念、KS的计算方法、业务指导意义、几何解释、数学思想等多个维度展开分析,以期对KS指标有更为深入的理解认知。

目录
Part 1. 直观理解区分度的概念
Part 2. KS统计量的定义
Part 3. KS的计算过程及业务分析
Part 4. 风控中选用KS指标的原因分析
Part 5. ROC曲线的几何绘制及理解
Part 6. 从几何角度解释KS与ROC的关系
Part 7. KS检验的理解应用
Part 8. KS的计算代码(Python)
版权声明️
参考资料

Part 1. 直观理解区分度的概念

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

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

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

Part 2. KS统计量的定义

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

KS统计量是基于经验累积分布函数(Empirical Cumulative Distribution Function,ECDF)
建立的,一般定义为:

Part 3. KS的计算过程及业务分析

很多博客文章告诉我们,计算KS的常见方法是这样的:

  • step 1. 对变量进行分箱(binning),可以选择等频、等距,或者自定义距离。
  • step 2. 计算每个分箱区间的好账户数(goods)和坏账户数(bads)。
  • step 3. 计算每个分箱区间的累计好账户数占总好账户数比率(cum_good_rate)和累计坏账户数占总坏账户数比率(cum_bad_rate)。
  • step 4. 计算每个分箱区间累计坏账户占比与累计好账户占比差的绝对值,得到KS曲线。也就是: 
  • step 5. 在这些绝对值中取最大值,得到此变量最终的KS值。

为帮助大家理解,现以具体数据(非业务数据)展示这一过程,如图2所示。其中,total是每个分数区间里的样本量,total_rate为样本量占比;bad代表逾期,bad_rate为每个分数区间里的坏样本占比。

图 2 - KS计算过程表

那么,分析这张表我们可以得到哪些信息呢?

  1. 模型分数越高,逾期率越低,代表是信用评分。因此,低分段bad rate相对于高分段更高, cum_bad_rate曲线增长速率会比cum_good_rate更快,cum_bad_rate曲线在cum_good_rate上方。
  2. 每个分箱里的样本数基本相同,说明是等频分箱。分箱时需要考虑样本量是否满足统计意义。
  3. 若我们设定策略cutoff为0.65(低于这个值的用户预测为bad,将会被拒绝),查表可知低于cutoff的cum_bad_rate为82.75%,那么将拒绝约82.75%的坏账户。
  4. 根据bad_rate变化趋势,模型的排序性很好。如果是A卡(信用评分),那么对排序性要求就比较高,因为需要根据风险等级对用户风险定价。
  5. 模型的KS达到53.1%,区分度很强。这是设定cutoff为0.65时达到的最理想状态。实际中由于需权衡通过率与坏账率之间的关系,一般不会设置在理想值。因此,KS统计量是好坏距离或区分度的上限。
  6. 通常情况下,模型KS很少能达到52%,因此需要检验模型是否发生过拟合,或者数据信息泄漏 。

KS值的取值范围是[0,1],一般习惯乘以100%。通常来说,KS越大,表明正负样本区分程度越好。KS的业务评价标准如图3所示。由于理解因人而异,不一定完全合理,仅供参考。

图 3 - KS的评价标准(供参考)

需要指出的是,KS是在放贷样本上评估的,放贷样本相对于全量申贷样本永远是有偏的。如果风控系统处于裸奔状态(相当于不生效,随机拒绝),那么这个偏差就会很小;反之,如果风控系统做得越好,偏差就会越大。因此,KS不仅仅只是一个数值指标,其背后蕴藏着很多原因,值得我们结合业务去认真分析。

当KS不佳时,为了达到KS的预期目标,我们可以从哪些方面着手去优化呢?一般建议如下:

  1. 检验入模变量是否已经被策略使用,使用重复变量会导致区分度不高。
  2. 检验训练样本与验证样本之间的客群差异是否变化明显?样本永远是统计学习中的重要部分。
  3. 开发对目标场景更具针对性的新特征。比如,识别长期信用风险,就使用一些强金融属性变量;识别欺诈风险,就使用一些短期负面变量。
  4. 分群建模或分群测算。分群需要考虑稳定性和差异性。
  5. bad case分析,提取特征。

若将表2数据可视化,就可以得到我们平时常见的KS曲线图(也叫鱼眼图 ),其中横坐标为模型概率分数(0~1),纵坐标为百分比(0~100%)。红色曲线代表累计坏账户占比,绿色曲线代表累计好账户占比,蓝色曲线代表KS曲线。

图 4 - KS曲线

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

  1. 为什么风控中常用KS指标来评价模型效果,而不用准确率、召回率等?
  2. 最大KS值只是一个宏观结果,那么在不同cutoff内取到max时,模型性能有什么差异?
  3. 一般情况下,KS越大越好,但为什么通常认为高于75%时就不可靠?

Part 4. 风控中选用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的定义并不是非黑即白(离散型),而用概率分布(连续型)来衡量或许更合理。

我们通常用概率分布来描述这种模糊的软间隔概念,也倾向于使用LR这种概率模型,而不是SVM这种以边界距离作为优化目标的模型。

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

Part 5. ROC曲线的几何绘制及理解

在风控场景中,样本不均衡问题非常普遍,一般正负样本比都能达到1:100甚至更低。此时,评估模型的准确率是不可靠的。因为只要全部预测为负样本,就能达到很高的准确率。例如,如果数据集中有95个猫和5个狗,分类器会简单的将其都分为猫,此时准确率是95%。

因此,我们更倾向于用混淆矩阵来评估模型分类效果。

图 5 - 混淆矩阵

真阳率:
假阳率:

为简化考虑,我们的风控系统只有一个信用评分模型,那么高于分数阈值就预测为good,反之为bad,予以拒绝。我们一般追求更高的TPR,也就是"抓对了";以及更低的FPR,也就是"抓错了"。抓对了和抓错了——是在模型决策的一念之间(不同的分数阈值),因此我们会设置不同的阈值来观察这种变化规律。

在建立混淆矩阵的概念后,接下来介绍ROC曲线的绘制方法(后面将会以ROC曲线来辅助我们理解KS曲线)。

  • step 1. 先按分数升序排列,计算某个阈值T下的TPR和FPR。

由于低于T,预测为bad(红色区域),反之预测为good(绿色区域)。红色区域内有样本的真实bad和good标签,我们统计以下2个指标:

1)TPR = 红色区域(预测为bad & 真实为bad) / 整体区域真实为bad
2)FPR = 红色区域(预测为bad & 真实为good)/ 整体区域真实为good

因此,可以把TPR理解为累积正样本率(cum_bad_rate),FPR理解为累积负样本率(cum_good_rate)。

图 6 - TPR曲线绘制过程

  • step 2. 重复step1多次,在不同阈值T下计算得到多个TPR和FPR。
  • step 3. 以FPR为横轴,TPR为纵轴,画出ROC曲线(如图7)。曲线下方的面积即为AUC值。

图 7 - ROC曲线

我们该如何理解ROC曲线?

  1. 如果模型没有任何排序性,那么正样本在每个分数区间上均匀分布。此时,无论如何设置阈值,[0,阈值]这个分数区间内TPR将与区间长度成正比关系,所以就是对角线。
  2. 如果希望TPR尽可能高,FPR尽可能低,我们可以设计一个目标函数,这与KS的定义完全相同。

Part 6. 从几何角度解释KS与ROC的关系

为了更加直观展示KS和ROC曲线的关系,我们将添加以下辅助线,从而得到图8,其中包含4张子图。

  • 辅助曲线:TPR(图8左上)、FPR(图8右下)。
  • 辅助直线:红线为取得max_ks时的cum_bad_rate,绿线为取得max_ks时的cum_good_rate,蓝线为max_ks。灰线BR为ROC曲线在R点的切线,且与对角线OD平行。

图 8 - 左上—TPR,右上—ROC,左下—KS,右下—FPR

在添加辅助线后,可以得到以下关键数据点的坐标信息:

为什么要在R点加上一条切线? 这是因为KS = |TPR - FPR|,如果添加辅助线TPR = FPR + KS,那么这条直线的截距就是KS值。当与ROC曲线相切时,截距最大,也就对应max_ks。

从几何意义上,KS曲线和ROC曲线的映射关系如下:

另外可以从图中得出这些信息:

  1. 若希望KS尽可能大,那么R需要尽可能接近(0,1),此时AUC一般也会增大。
  2. 对于相同的KS值,在KS曲线上有两个选择,但TPR和FPR同时大或同时小。虽然我们的目的通常是抓对更多的坏人(TPR),尽可能减少错抓的好人(FPR),但两者需要trade-off。到底选择哪个阈值,取决于业务目标:是希望对bad有更高的召回,还是对good有更低的误伤?
  3. 由于KS只是在一个最大分隔点时的值,并不够全面。通常我们也会同时参考KS和AUC(或Gini)

在理解KS和ROC曲线的关系后,我们也就更容易理解——为什么通常认为KS在高于75%时就不可靠?我们可以想象,如果KS达到80%以上,此时ROC曲线就会变得很畸形,如图9所示。

另一个更重要的可能原因是,为了便于制定策略,模型评分在放贷样本上一般要求服从正态分布。现实中不太可能出现如此完美的分类器,如果出现这种明显的双峰分布,反而就不合常理,我们就有理由怀疑其可靠性。( 值得一起探讨)

图 9 - 不同分布下的ROC曲线

Part 7. KS检验的理解应用

KS检验(Kolmogorov-Smirnov Test)是一种根据样本来推断总体是否服从某种分布的方法,因此也可以用来检验两个经验分布是否服从同一总体分布。

我们可以定义以下假设检验命题:

  • 原假设H0 :好人、坏人的分数分布服从同一总体分布
  • 备择假设H1:好人、坏人的分数分布不服从同一总体分布

如果得到的p-value比指定的显著水平(假设为5%)小,那么我们就可以拒绝原假设,认为两个分布不服从同一总体分布。

Part 8. KS的计算代码(Python)

def ks_compute(proba_arr, target_arr):
'''
----------------------------------------------------------------------
功能:利用scipy库函数计算ks指标
----------------------------------------------------------------------
:param proba_arr: numpy array of shape (1,), 预测为1的概率.
:param target_arr: numpy array of shape (1,), 取值为0或1.
----------------------------------------------------------------------
:return ks_value: float, ks score estimation
----------------------------------------------------------------------
示例:
>>> ks_compute(proba_arr=df['score'], target_arr=df[target])
>>> 0.5262199213881699
----------------------------------------------------------------------
'''
from scipy.stats import ks_2samp
get_ks = lambda proba_arr, target_arr: ks_2samp(proba_arr[target_arr == 1], \
proba_arr[target_arr == 0]).statistic
ks_value = get_ks(proba_arr, target_arr)
return ks_value

【转】风控中的特征评价指标(三)——KS值的更多相关文章

  1. 【转】风控中的特征评价指标(二)——PSI

    转自:https://zhuanlan.zhihu.com/p/79682292 风控业务背景 在风控中,稳定性压倒一切.原因在于,一套风控模型正式上线运行后往往需要很久(通常一年以上)才会被替换下线 ...

  2. 【转】风控中的特征评价指标(一)——IV和WOE

    转自:https://zhuanlan.zhihu.com/p/78809853 1.IV值的用途 IV,即信息价值(Information Value),也称信息量. 目前还只是在对LR建模时用到过 ...

  3. ASP.NET Core 中文文档 第三章 原理(11)在多个环境中工作

    原文: Working with Multiple Environments 作者: Steve Smith 翻译: 刘浩杨 校对: 孟帅洋(书缘) ASP.NET Core 介绍了支持在多个环境中管 ...

  4. SLAM算法中提取特征总结

    我们要知道三维空间中的点在图像中的位置,就需要提取特征与特征匹配了. 1.检测特征点 2.计算描述子 3.特征匹配 1.检测特征点 我们用到的检测特征点的方法是FAST算法,最大的特点就是快! 算法原 ...

  5. 视觉SLAM中的数学基础 第三篇 李群与李代数

    视觉SLAM中的数学基础 第三篇 李群与李代数 前言 在SLAM中,除了表达3D旋转与位移之外,我们还要对它们进行估计,因为SLAM整个过程就是在不断地估计机器人的位姿与地图.为了做这件事,需要对变换 ...

  6. C/C++中static,const,inline三种关键字详细总结

    一.关于staticstatic 是C++中很常用的修饰符,它被用来控制变量的存储方式和可见性,下面我将从 static 修饰符的产生原因.作用谈起,全面分析static 修饰符的实质. static ...

  7. 在 CSS 中使用特征查询

    原文地址:Using Feature Queries in CSS 原文作者:Jen Simmons 译文出自:掘金翻译计划 本文永久链接:github.com/xitu/gold-m… 译者:Che ...

  8. 深度CTR预估模型中的特征自动组合机制演化简史 zz

    众所周知,深度学习在计算机视觉.语音识别.自然语言处理等领域最先取得突破并成为主流方法.但是,深度学习为什么是在这些领域而不是其他领域最先成功呢?我想一个原因就是图像.语音.文本数据在空间和时间上具有 ...

  9. C++不同类中的特征标相同的同名函数

    转载请注明出处,版权归作者所有 lyzaily@126.com yanzhong.lee        作者按:                   从这篇文章中,我们主要会认识到一下几点:      ...

随机推荐

  1. Codeforces Round #574 (Div. 2) D2. Submarine in the Rybinsk Sea (hard edition) 【计算贡献】

    一.题目 D2. Submarine in the Rybinsk Sea (hard edition) 二.分析 相比于简单版本,它的复杂地方在于对于不同长度,可能对每个点的贡献可能是有差异的. 但 ...

  2. python常用数据处理库

    Python之所以能够成为数据分析与挖掘领域的最佳语言,是有其独特的优势的.因为他有很多这个领域相关的库可以用,而且很好用,比如Numpy.SciPy.Matploglib.Pandas.Scikit ...

  3. “/”应用程序中的服务器错误。||分析器错误消息: 未能加载类型“WebApplication1._Default”

    环境VS2008 无法运行WEB项目,Winfrom程序OK. 新创建的WEB项目直接运行报下图错误. 尝试多种方法: 1,重新生成项目,运行.(失败) 2,重装VS2008(默认.完全.自定义)安装 ...

  4. java例题_08 输入特定数字求和(n个a位数递增求和问题)

    1 /*8 [程序 8 输入数字求和] 2 题目:求 s=a+aa+aaa+aaaa+aa...a 的值,其中 a 是一个数字.例如 2+22+222+2222+22222(此时共有 5 个数相加), ...

  5. Java类集框架详细汇总-底层分析

    前言: Java的类集框架比较多,也十分重要,在这里给出图解,可以理解为相应的继承关系,也可以当作重要知识点回顾: Collection集合接口 继承自:Iterable public interfa ...

  6. Typora标题自动编号+设定快捷键技巧

    Typora标题自动编号 提示:要了解将这些CSS片段放在哪里,请参阅添加自定义CSS. 打开Typora偏好设置,打开主题文件夹,在主题文件夹中创建base.user.css文件,放置以下内容,则T ...

  7. 微信小程序getUserProfile适配方案

    清明节放假前一天 群里突然炸锅,说小程序所有用的昵称全部变成了微信昵称 当时我就 特么不是说好13号吗??? 吓得我赶紧爬起来翻文档(需要代码直接往后翻) wx.getUserProfile(Obje ...

  8. JS基础学习第二天

    类型转换 类型转换就是指将其他的数据类型,转换为String Number 或 Boolean 转换为String 方式一(强制类型转换): 调用被转换数据的toString()方法例子:var a ...

  9. Day01_03_Java名词

    java名词 SDK 软件开发工具包 JDK Java的软件开发工具包,其中包括Java虚拟机(JVM),Java运行环境(即jre),Java工具(编译器,运行工具等)和Java基础类库等. JRE ...

  10. Jenkins 项目类型及配置项

    0. 简介 1. Freestyle project 1)General 2)源码管理 3)构建触发器 4)构建环境 5)构建 6)构建后操作 2. Maven 项目 1)所有配置项 2)Build ...