python ks值计算_风控模型中的K-S理解以及python实现
笔者在工作中计算单变量的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实现相关推荐
- python ks值计算_利用Python计算KS的实例详解
在金融领域中,我们的y值和预测得到的违约概率刚好是两个分布未知的两个分布.好的信用风控模型一般从准确性.稳定性和可解释性来评估模型.sOf免费资源网 一般来说.好人样本的分布同坏人样本的分布应该是有很 ...
- vb6调用python识别训练例子_在vb6中创建的“标准”dll在python中调用时会出现访问冲突...
从vb6dll导出函数的最简单方法是使用vbAdvance add-in,现在它是免费软件.在 您面临的问题是,您需要在调用导出的线程上初始化VB6运行时.这包括初始化COM单元(STA).最简单的方 ...
- python列表查找值_查找列表中某个值的位置(python)
p=list.index(value) list为列表的名字 value为查找的值 p为value在list的位置 Python3.2.2列表操作总结 list操作:快速创建list.新增item.删 ...
- 风控模型中的KS指标
ks-指标 ks定义 ks是指通过衡量好坏样本累计分布之间的差值,来评估模型的风险的区分能力. ks曲线又叫洛伦兹曲线,以TRP和FPR分别作为纵轴,以阈值作为横轴,画出两条曲线.KS曲线则是两条曲线 ...
- 如何浅显得理解风控模型中的特征筛选|附实操细节(全)
今天我们综合了星球同学的一些需求,给大家梳理了这样一篇风控建模中特征筛选,希望对所有的风控人员在模型开发上都有所启发. 本文,我们会跟大家介绍特征选择的内容,包括其中的重点问题跟注意的细节. 因为完整 ...
- 风控模型中的KS-指标
KS-指标 ks定义 ks是指通过衡量好坏样本累计分布之间的差值,来评估模型的风险区分能力.KS曲线又叫洛伦兹曲线.以TPR和FPR分别作为纵轴,以阈值作为横轴,画出两条曲线.KS曲线则是两条曲线的在 ...
- matlab中N=256值是什么,应用MATLAB确定邓肯-张双曲线模型中的K,n参数
应用MATLAB确定邓肯-张双曲线模型中的K,n参数 简介:接合承德中密砂常规三轴试验数据,介绍应用Matlab语言编写计算及绘图程序来处理试验数据的方法,可显著提高试验研究的数据处理效率和结果的可视 ...
- python稳健性检验_风控模型6大核心指标(附代码)
欢迎各位同学学习python金融风控评分卡模型和数据分析微专业课 在我们开发完信用分模型后,经常需要计算如下的一些指标:● 区分度的指标:○ AUC○ KS○ ...
- 风控模型中的变量替换
昨天的文章我们提到了评分模型中的监控报表汇总.文章中提及的监控报表内容,大部分是跟业务指标结合的监控内容,该文章所提及的监控的维度也较为丰富,大家抽空可以学习了解.传送:评分模型的监控报表汇总. 今天 ...
- 向前logistic回归与向后筛选出一样的变量_风控建模之特征筛选与建模(python)...
特征筛选 在建模之前的一步就是将特征工程做好的变量进行筛选,在风控项目中筛选分为两步:初步筛选.逐步回归筛选以及稳定性筛选. 初步筛选 通常评分卡模型的特征筛选主要从以下4个角度出发: 缺失率(一般变 ...
最新文章
- 【Transformer】SOFT: Softmax-free Transformer with Linear Complexity
- 项目中的那些事---下载pdf文件
- Java基础之Collection和Map
- linux复制文件到另一个目录_Linux入门之四-Linux文件目录操作
- 新东方php面试题,新东方学校各教师面试题和笔试题及答案(9套)
- JavaScript:正则表达式 分组
- 异常处理与调试 - 零基础入门学习Delphi50
- 下载我的CSDN资源
- netty银行账目管理系统_基于Java的银行帐目管理系统.doc
- 个人笔记-C#txt文本分割器
- 在SPSS中将统计表格外观修改为三线表外观的步骤
- retainAll用法
- 使用阿里云邮件推送服务群发邮件
- 2022.01.24翻译Lorry
- 惠惠软件|CSDN笔耕不辍Lv1
- python 手机号码归属 ip地址查询
- android edittext 取消软键盘,android Edittext输入修改软键盘并关闭软键盘
- jadx在windows下的安装
- java 回调方法是什么意思_java什么是回调
- Linux - 安装内核源码
热门文章
- 计算机网络生活应用,浅谈计算机网络在生活中的应用
- 史上最著名的电脑病毒
- LOGO与BASIC语言编程入门pdf
- NRF51822基于蓝牙协议栈SDK+FDS-Flash data storage 的使用及应用例程
- python加密成pyc_pyc文件加密 python写的程序怎样加密
- 单片机c语言双电源程序,基于单片机的双电源自动切换开关控制器
- android stagefright框架
- B站晚会大火的 140 万个理由!
- 小数分频器vhdl实现_小数分频VHDL代码
- 2022-2027年(新版)中国数字出版行业发展动态与未来前景趋势报告