笔者在工作中计算单变量的ks值时,发现几个分布不同的变量好y计算的ks值相同,凭借统计直觉,发现一定存在问题,笔者从数据和计算ks代码两个方向进行排除。最后定位到计算使用stats.ks_2samp()函数计算ks值时,如果变量存在缺失值,计算得到ks值有误,下面笔者就来好好梳理一下ks值的前世今生。

ks检验介绍

笔者刚入门机器学习开始做的例子就是金融场景下风控模型。

那时评价模型的好坏就用传统的机器学习评价标准,比如说准确率、精确率和AUC,对风控模型的ks指标还一无所知,倒是作为统计科班出身的童鞋,第一次见到ks想到的就是数理统计中的Kolmogorov-Smirnov检验(柯尔莫哥洛夫-斯米尔洛夫)。后来实习过程中,发现老板们在看风控模型结果最关注的结果就是ks指标,才开始对ks指标逐渐重视起来。在衡量模型效果时,对评分卡或者机器学习模型给出的违约概率和y值计算ks值,给出模型效果来确定模型的好坏(一般0.3左右可以使用,0.4以上模型效果较高,超过0.7,可能模型有问题,这时候需要去debug一下是不是出现了特征信息泄露以及一些其他的问题)。笔者在实际应用中,发现市面上关于ks系统介绍的文章比较少,本文就系统的介绍一下ks的前世今生,以及在在风控模型下的多种实现。

KS检验-统计角度

首先,我们了解下统计上KS检验的概念。

这里维基百科Kolmogorov–Smirnov test已经解释的很详细了。如果让我一句话解释KS检验的话:我会说KS检验是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法。提到检验,我们第一步就是明确我们检验的原假设和备择假设。其原假设$H0$: 两个数据分布一致或者数据符合理论分布,定义$D=max| f(x)- g(x)|$,当实际观测值$D>D(n,α)$则拒绝$H0$,否则则接受$H0$假设。$D(n,α)$可以查表得到Critical Values for the Two-sample Kolmogorov-Smirnov test (2-sided)。KS检验与t-检验之类的其他方法不同是KS检验不需要知道数据的分布情况,算是一种非参数检验方法。代价就是数据分布指定的情况下KS效果不如指定的检验好。在样本量比较小的时候,KS检验一般在分析两组数据之间是否不同时相当常用。具体的ks检验的Case可以看文章KS-检验(Kolmogorov-Smirnov test) -- 检验数据是否符合某种分布

KS检验-风控角度

从统计角度,我们知道KS是分析两组数据分布是否相同的检验指标。在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布。好的信用风控模型一般从准确性、稳定性和可解释性来评估模型。

一般来说。好人样本的分布同坏人样本的分布应该是有很大不同的,KS正好是有效性指标中的区分能力指标:KS用于模型风险区分能力进行评估,KS指标衡量的是好坏样本累计分布之间的差值。好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。

KS的计算步骤如下:计算每个评分区间的好坏账户数(计算的是特征的KS的话,是每个特征对应的好坏账户数)。

计算每个评分区间的累计好账户数占总好账户数比率(good%)和累计坏账户数占总坏账户数比率(bad%)。

计算每个评分区间累计坏账户占比与累计好账户占比差的绝对值(累计good%-累计bad%),然后对这些绝对值取最大值即得此评分卡的KS值。

KS检验-python实现

上面介绍了KS的统计原理以及实现方法,下面我们从三个不同的角度去实现KS的计算

ks_2samp实现

我们直接调用stats.ks_2samp()函数来计算。链接scipy.stats.ks_2samp¶为ks_2samp()实现源码,笔者按照源码实现了下,方便查看其中的cdf计算结果。

crosstab实现

我们知道计算ks的核心就是好坏人的累积概率分布,我们采用pandas.crosstab函数来计算累积概率分布。

roc_curve实现

我们同时发现在sklearn库中的roc_curve函数计算roc和auc时,计算过程中已经得到好坏人的累积概率分布,同时我们利用sklearn.metrics.roc_curve来计算ks值

案例测试

模拟数据data_test_1(数据中不含有NAN)

计算结果:

三种方法计算得到的ks值均相同,且ks_calc_cross和ks_calc_2samp计算得到的cdf相同

模拟数据data_test_2(数据中含有NAN)

计算结果:

三种方法计算得到的ks值均不相同。其中ks_calc_2samp计算得到的ks因为searchsorted()函数(有兴趣的同学可以自己模拟数据看下这个函数),会将Nan值默认排序为最大值,从而改变了数据的原始累积分布概率,导致计算得到的ks和真实的ks有误差。

其中ks_calc_cross计算时忽略了NAN,计算得到了数据正确的概率分布,计算的ks与我们手算的ks相同

ks_calc_auc函数由于内置函数无法处理NAN值,直接报错了,所以如果需要ks_calc_auc计算ks值时,需要提前去除NAN值。

总结

在实际情况下,我们一般计算违约概率的ks值,这时是不存在NAN值的。所以以上三种方法计算ks值均可。但是当我们计算单变量的ks值时,有时数据质量不好,存在NAN值时,继续采用ks_calc_auc和ks_calc_2samp就会存在问题。

解决办法有两个 1. 提前去除数据中的NAN值 2. 直接采用ks_calc_cross计算。

本文系“京东金融”知乎机构号原创首发,欢迎点赞支持、关注。

本文作者介绍:京东金融-金融科技业务部-数据与金融市场研发部-白云飞(西南985非CS系渣渣硕,努力升级打怪的算法狗,知乎号@白云飞Harry)

如果关于这篇文章有任何问题可以评论讨论~

python ks值计算_风控模型中的K-S理解以及python实现相关推荐

  1. python ks值计算_利用Python计算KS的实例详解

    在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布.好的信用风控模型一般从准确性.稳定性和可解释性来评估模型.sOf免费资源网 一般来说.好人样本的分布同坏人样本的分布应该是有很 ...

  2. vb6调用python识别训练例子_在vb6中创建的“标准”dll在python中调用时会出现访问冲突...

    从vb6dll导出函数的最简单方法是使用vbAdvance add-in,现在它是免费软件.在 您面临的问题是,您需要在调用导出的线程上初始化VB6运行时.这包括初始化COM单元(STA).最简单的方 ...

  3. python列表查找值_查找列表中某个值的位置(python)

    p=list.index(value) list为列表的名字 value为查找的值 p为value在list的位置 Python3.2.2列表操作总结 list操作:快速创建list.新增item.删 ...

  4. 风控模型中的KS指标

    ks-指标 ks定义 ks是指通过衡量好坏样本累计分布之间的差值,来评估模型的风险的区分能力. ks曲线又叫洛伦兹曲线,以TRP和FPR分别作为纵轴,以阈值作为横轴,画出两条曲线.KS曲线则是两条曲线 ...

  5. 如何浅显得理解风控模型中的特征筛选|附实操细节(全)

    今天我们综合了星球同学的一些需求,给大家梳理了这样一篇风控建模中特征筛选,希望对所有的风控人员在模型开发上都有所启发. 本文,我们会跟大家介绍特征选择的内容,包括其中的重点问题跟注意的细节. 因为完整 ...

  6. 风控模型中的KS-指标

    KS-指标 ks定义 ks是指通过衡量好坏样本累计分布之间的差值,来评估模型的风险区分能力.KS曲线又叫洛伦兹曲线.以TPR和FPR分别作为纵轴,以阈值作为横轴,画出两条曲线.KS曲线则是两条曲线的在 ...

  7. matlab中N=256值是什么,应用MATLAB确定邓肯-张双曲线模型中的K,n参数

    应用MATLAB确定邓肯-张双曲线模型中的K,n参数 简介:接合承德中密砂常规三轴试验数据,介绍应用Matlab语言编写计算及绘图程序来处理试验数据的方法,可显著提高试验研究的数据处理效率和结果的可视 ...

  8. python稳健性检验_风控模型6大核心指标(附代码)

    欢迎各位同学学习python金融风控评分卡模型和数据分析微专业课 在我们开发完信用分模型后,经常需要计算如下的一些指标:●      区分度的指标:○      AUC○      KS○       ...

  9. 风控模型中的变量替换

    昨天的文章我们提到了评分模型中的监控报表汇总.文章中提及的监控报表内容,大部分是跟业务指标结合的监控内容,该文章所提及的监控的维度也较为丰富,大家抽空可以学习了解.传送:评分模型的监控报表汇总. 今天 ...

  10. 向前logistic回归与向后筛选出一样的变量_风控建模之特征筛选与建模(python)...

    特征筛选 在建模之前的一步就是将特征工程做好的变量进行筛选,在风控项目中筛选分为两步:初步筛选.逐步回归筛选以及稳定性筛选. 初步筛选 通常评分卡模型的特征筛选主要从以下4个角度出发: 缺失率(一般变 ...

最新文章

  1. 【Transformer】SOFT: Softmax-free Transformer with Linear Complexity
  2. 项目中的那些事---下载pdf文件
  3. Java基础之Collection和Map
  4. linux复制文件到另一个目录_Linux入门之四-Linux文件目录操作
  5. 新东方php面试题,新东方学校各教师面试题和笔试题及答案(9套)
  6. JavaScript:正则表达式 分组
  7. 异常处理与调试 - 零基础入门学习Delphi50
  8. 下载我的CSDN资源
  9. netty银行账目管理系统_基于Java的银行帐目管理系统.doc
  10. 个人笔记-C#txt文本分割器
  11. 在SPSS中将统计表格外观修改为三线表外观的步骤
  12. retainAll用法
  13. 使用阿里云邮件推送服务群发邮件
  14. 2022.01.24翻译Lorry
  15. 惠惠软件|CSDN笔耕不辍Lv1
  16. python 手机号码归属 ip地址查询
  17. android edittext 取消软键盘,android Edittext输入修改软键盘并关闭软键盘
  18. jadx在windows下的安装
  19. java 回调方法是什么意思_java什么是回调
  20. Linux - 安装内核源码

热门文章

  1. 计算机网络生活应用,浅谈计算机网络在生活中的应用
  2. 史上最著名的电脑病毒
  3. LOGO与BASIC语言编程入门pdf
  4. NRF51822基于蓝牙协议栈SDK+FDS-Flash data storage 的使用及应用例程
  5. python加密成pyc_pyc文件加密 python写的程序怎样加密
  6. 单片机c语言双电源程序,基于单片机的双电源自动切换开关控制器
  7. android stagefright框架
  8. B站晚会大火的 140 万个理由!
  9. 小数分频器vhdl实现_小数分频VHDL代码
  10. 2022-2027年(新版)中国数字出版行业发展动态与未来前景趋势报告