区分度评估指标-KS

news2024/11/23 6:31:06

1.背景

KS指标来评估模型的区分度(discrimination),风控场景常用指标之一。本文将从区分度的概念、KS的计算方法、业务指导意义、几何解释、数学思想等多个维度展开分析,以期对KS指标有更为深入的理解认知。

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曲线。也就是: ks=|cum_goodrate−cum_badrate|
  • 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曲线。

至此,我们已经基本了解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%。

【此处注意,平时都说样本比例不影响auc,这个说法有问题,在样本比例不极端的情况下,不影响auc。但是如果样本比例极端的情况下,TPR个FPR曲线很极端,这样的auc意义不大,所以样本比例还是影响auc的】

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

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

 

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

 

参考:

1.风控模型—区分度评估指标(KS)深入理解应用 - 知乎

2.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/64914.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

javaee之黑马旅游网2

下面我们来做邮件激活功能 提示邮箱需要登录才能进行账号激活 保证用户填写的邮箱是正确的,可以推广宣传信息到邮箱中 下面分成两部分来做: 第一部分:发送邮件 这个功能就是通过工具类来进行实现的,直接从网上copy的代码 Mai…

痞子衡嵌入式:浅谈i.MXRT1xxx系列MCU时钟相关功能引脚的作用

大家好,我是痞子衡,是正经搞技术的痞子。今天痞子衡给大家介绍的是i.MXRT1xxx系列MCU时钟相关功能引脚作用。 如果我们从一颗 MCU 芯片的引脚分类来看芯片功能,大概可以分为三大类:电源、时钟、外设功能。作为嵌入式开发者&#…

service 详解

8.3.3 HeadLiness类型的Service 在某些场景中,开发人员可能不想使用Service提供的负载均衡功能,而希望自己来控制负载均衡策略,针对这种情况,kubernetes提供了HeadLiness Service,这类Service不会分配Cluster IP&…

在线表单设计器都有哪些优秀的功能?

当前,在大数据时代的发展背景下,自定义的在线表单设计器是提升办公效率和协作效率的工具。可视化表单工具丰富的组件、简单的操作等优势特点得到了很多客户的喜爱和支持。那么,您知道在线表单设计器的功能都有哪些吗?通过这篇文章…

前端_Vue_1.初识Vue

文章目录一、前言二、开始1. 简介1.1. 什么是Vue?1.2. 渐进式框架1.3. 单文件组件1.4. API风格1.4.1. 选项式API(Options API)1.4.2. 组合式API(Composition API)1.4.3. 该选哪个?2. 快速上手(学…

导出微信通讯录

不知道什么时候,微信好友已经增加到了几百人,熟悉的、不熟悉的人都淹没在一溜的名字里,今天来整理一下微信通讯录,该删的、该分组的都搞一搞。 首先,导出微信的通讯录 单击微信左下角“菜单”,选择“设置…

为什么我们不支持手工上传镜像

自从我们提供公共镜像库以来,不少同学询问是否支持手工上传镜像到镜像库。答案是:不支持。 今天给大家聊一聊为什么公共镜像库不应该支持手工上传,主要基于以下几个方面的考量: Code First 建木作为一个完整实现GitOps理念的工…

matlab⾼级绘图时间距离图像

这限制了可能在legend上⼯作以实现⽬标的可能性。 可能的解决⽅案是按照以下步骤创建⾃⼰的基于轴的图例: 使⽤以下语法[lgd,icons,plots,txt] legend(___)创建调⽤legend函数的图例(注意,不建议使⽤此语法,我们将在后续步骤中删除图例&…

2022年HNUCM信息科学与工程学院第五届新生赛——正式赛

2022年HNUCM信息科学与工程学院第五届新生赛——正式赛 A 打卡题&#xff0c;向下取整即可 #include<iostream> using namespace std; int main() {int n;cin >> n;cout << n / 7 << endl;return 0; }B 统计数量&#xff0c;注意要是不能整除需要向…

《痞子衡嵌入式半月刊》 第 62 期

痞子衡嵌入式半月刊&#xff1a; 第 62 期 这里分享嵌入式领域有用有趣的项目/工具以及一些热点新闻&#xff0c;农历年分二十四节气&#xff0c;希望在每个交节之日准时发布一期。 本期刊是开源项目&#xff08;GitHub: JayHeng/pzh-mcu-bi-weekly&#xff09;&#xff0c;欢…

JAVA班主任管理系统(源代码+论文)

毕业综合实训报告 班主任管理系统设计与实践 目 录 摘要 ………………………………………………………………………Ⅰ &#xff08;空2行&#xff0c;本页行间距为最小值14磅&#xff09; 目录………………………………………………………………………………… 1 第1章 绪…

【QT开发笔记-基础篇】| 第五章 绘图QPainter | 5.1 效果演示、技术点

Qt 中绘图用到的类是 QPainter&#xff0c;可以实现点、线、矩形、圆形、多边形、圆弧、饼图、图片等的绘制 什么时候会用到绘图&#xff1f; 需要简单绘制时 比如&#xff0c;绘制温度的曲线时&#xff0c;如下&#xff1a; 自定义控件 绘图最大的一个应用场景就是自定义控…

三 TypeScript变量

流程控制 计算机执行程序的时候是按照从上到下从左到右逐行进行 我们常见的流程&#xff1a; 顺序 分支循环 分支结构 分支结构 单分支 语法结构 if(表达式){代码块}执行逻辑:当程序遇到if结构,首先判断表达式的值,如果表达式的值为真,则执行大括号里面的代码块,如果表达…

Spring - FactoryBean扩展接口

文章目录Preorg.springframework.beans.factory.FactoryBeanFactoryBean中的设计模式----工厂方法模式FactoryBean VS BeanFactory源码解析扩展示例Pre Spring Boot - 扩展接口一览 org.springframework.beans.factory.FactoryBean package org.springframework.beans.factory…

IDEA新建一个spark项目

第一步&#xff1a;新建一个maven工程 第二部&#xff1a;命名工程名 第三步&#xff1a;新建一个文件夹&#xff0c;并设置为sources root 第四步&#xff1a;pom编写 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http:/…

表格数据方法、分页方法及组件的封装和分页组件的复用

请假列表 1、数据获取与显示的通用方法封装 <template><div> <el-table:data"tableData"height"450"borderstyle"width: 100%":default-sort"{ prop: number, order: Ascending }"><!-- <el-table-column pr…

亚像素级精确度的角点

有时我们需要最大精度的角点检测。OpenCV为我们提供了函cv2.cornerSubPix()&#xff0c; 它可以提供亚像素级别的角点检测。下面是一个例子。首先我们要找到 Harris 角点&#xff0c;然后将角点的重心传给这个函数进行修正。Harris 角点用红色像素标出&#xff0c;绿色像素是修…

[附源码]计算机毕业设计社区疫情防控信息管理系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

jdk11新特性——新加的一些更实用的API

目录一、集合 增强1.1、List集合 of()方法1.2、Set集合 of()方法1.3、Map集合 of()方法1.4、List集合copyOf()方法1.5、of()和copyOf()方法创建集合的注意事项二、Stream 增强2.1、Stream 新增of()方法2.2、Stream 新增ofNullable()方法2.3、Stream 新增takeWhile() 和 dropWhi…

[附源码]Python计算机毕业设计Django网文论坛管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…