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

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

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

好坏样本累计差异越大,KS指标越大,那么模型的风险区分能力越强。sOf免费资源网

1、crosstab实现,计算ks的核心就是好坏人的累积概率分布,我们采用pandas.crosstab函数来计算累积概率分布。sOf免费资源网

2、roc_curve实现,sklearn库中的roc_curve函数计算roc和auc时,计算过程中已经得到好坏人的累积概率分布,同时我们利用sklearn.metrics.roc_curve来计算ks值sOf免费资源网

3、ks_2samp实现,调用stats.ks_2samp()函数来计算。链接scipy.stats.ks_2samp¶为ks_2samp()实现源码,这里实现了详细过程sOf免费资源网

4、直接调用stats.ks_2samp()计算kssOf免费资源网

import pandas as pd

import numpy as np

from sklearn.metrics import roc_curve

from scipy.stats import ks_2samp

def ks_calc_cross(data,pred,y_label):

'''

功能: 计算KS值,输出对应分割点和累计分布函数曲线图

输入值:

data: 二维数组或dataframe,包括模型得分和真实的标签

pred: 一维数组或series,代表模型得分(一般为预测正类的概率)

y_label: 一维数组或series,代表真实的标签({0,1}或{-1,1})

输出值:

'ks': KS值,'crossdens': 好坏客户累积概率分布以及其差值gap

'''

crossfreq = pd.crosstab(data[pred[0]],data[y_label[0]])

crossdens = crossfreq.cumsum(axis=0) / crossfreq.sum()

crossdens['gap'] = abs(crossdens[0] - crossdens[1])

ks = crossdens[crossdens['gap'] == crossdens['gap'].max()]

return ks,crossdens

def ks_calc_auc(data,pred,y_label):

'''

功能: 计算KS值,输出对应分割点和累计分布函数曲线图

输入值:

data: 二维数组或dataframe,包括模型得分和真实的标签

pred: 一维数组或series,代表模型得分(一般为预测正类的概率)

y_label: 一维数组或series,代表真实的标签({0,1}或{-1,1})

输出值:

'ks': KS值

'''

fpr,tpr,thresholds= roc_curve(data[y_label[0]],data[pred[0]])

ks = max(tpr-fpr)

return ks

def ks_calc_2samp(data,pred,y_label):

'''

功能: 计算KS值,输出对应分割点和累计分布函数曲线图

输入值:

data: 二维数组或dataframe,包括模型得分和真实的标签

pred: 一维数组或series,代表模型得分(一般为预测正类的概率)

y_label: 一维数组或series,代表真实的标签({0,1}或{-1,1})

输出值:

'ks': KS值,'cdf_df': 好坏客户累积概率分布以及其差值gap

'''

Bad = data.loc[data[y_label[0]]==1,pred[0]]

Good = data.loc[data[y_label[0]]==0, pred[0]]

data1 = Bad.values

data2 = Good.values

n1 = data1.shape[0]

n2 = data2.shape[0]

data1 = np.sort(data1)

data2 = np.sort(data2)

data_all = np.concatenate([data1,data2])

cdf1 = np.searchsorted(data1,data_all,side='right')/(1.0*n1)

cdf2 = (np.searchsorted(data2,data_all,side='right'))/(1.0*n2)

ks = np.max(np.absolute(cdf1-cdf2))

cdf1_df = pd.DataFrame(cdf1)

cdf2_df = pd.DataFrame(cdf2)

cdf_df = pd.concat([cdf1_df,cdf2_df],axis = 1)

cdf_df.columns = ['cdf_Bad','cdf_Good']

cdf_df['gap'] = cdf_df['cdf_Bad']-cdf_df['cdf_Good']

return ks,cdf_df

data = {'y_label':[1,1,1,1,1,1,0,0,0,0,0,0],

'pred':[0.5,0.6,0.7,0.6,0.6,0.8,0.4,0.2,0.1,0.4,0.3,0.9]}

data = pd.DataFrame(data)

ks1,crossdens=ks_calc_cross(data,['pred'], ['y_label'])

ks2=ks_calc_auc(data,['pred'], ['y_label'])

ks3=ks_calc_2samp(data,['pred'], ['y_label'])

get_ks = lambda y_pred,y_true: ks_2samp(y_pred[y_true==1], y_pred[y_true!=1]).statistic

ks4=get_ks(data['pred'],data['y_label'])

print('KS1:',ks1['gap'].values)

print('KS2:',ks2)

print('KS3:',ks3[0])

print('KS4:',ks4)

输出结果:sOf免费资源网

KS1: [ 0.83333333]

KS2: 0.833333333333

KS3: 0.833333333333

KS4: 0.833333333333

sOf免费资源网

当数据中存在NAN数据时,有一些问题需要注意!sOf免费资源网

例如,我们在原数据中增加了y_label=0,pred=np.nan这样一组数据sOf免费资源网

data = {'y_label':[1,1,1,1,1,1,0,0,0,0,0,0,0],sOf免费资源网

'pred':[0.5,0.6,0.7,0.6,0.6,0.8,0.4,0.2,0.1,0.4,0.3,0.9,np.nan]}sOf免费资源网

此时执行sOf免费资源网

ks1,crossdens=ks_calc_cross(data,['pred'], ['y_label'])sOf免费资源网

输出结果sOf免费资源网

KS1: [ 0.83333333]sOf免费资源网

执行sOf免费资源网

ks2=ks_calc_auc(data,['pred'], ['y_label'])sOf免费资源网

将会报以下错误sOf免费资源网

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').sOf免费资源网

执行sOf免费资源网

ks3=ks_calc_2samp(data,['pred'], ['y_label'])sOf免费资源网

输出结果sOf免费资源网

KS3: 0.714285714286sOf免费资源网

执行sOf免费资源网

ks4=get_ks(data['pred'],data['y_label'])sOf免费资源网

输出结果sOf免费资源网

KS4: 0.714285714286sOf免费资源网

我们从上述结果中可以看出sOf免费资源网

三种方法计算得到的ks值均不相同。sOf免费资源网

ks_calc_cross计算时忽略了NAN,计算得到了数据正确的概率分布,计算的ks与我们手算的ks相同sOf免费资源网

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

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

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

解决办法有两个sOf免费资源网

1. 提前去除数据中的NAN值sOf免费资源网

2. 直接采用ks_calc_cross计算。sOf免费资源网

以上这篇利用Python计算KS的实例详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。sOf免费资源网

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

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

相关文章

教你如何用一句话激怒IT人

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删在IT行业摸爬滚打这么久,你是否听过下面这些话:“这个很简单,我也是做程序出身的。”“预算砍掉一半&#xf…

java的网络编程有用吗_十大有用但又偏执的Java编程技术

java的网络编程有用吗经过一段时间的编码(以我为例,大约20年左右,当您玩得开心时光飞逝),人们开始接受这些习惯。 因为,你知道... 任何可能出错的事情都会发生。 这就是为什么人们会采用“防御性编程”的原…

python bootstrap 4_Python3.4+Django1.9+Bootstrap3

实现和原理Python集成Django开发框架后,可以通过在cmd命令提示符下建立工程,工程名为learn_modelsdjango-admin.py startproject learn_models再进入到learn_models里面,新建一个app项目cd learn_modelspython manage.py startapp learn此时目…

未来五年有颠覆性的IT技术都在这里

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删据福布斯杂志报道,在美国奥兰多举行的Gartner研讨会上,市场研究机构Gartner Research的副总裁兼资深研究员大卫卡利&…

java ee maven_真正释放Maven和Java EE的强大功能

java ee maven如果野心和愿景太复杂而无法使用,则它们可能会淘汰伟大的解决方案。 尽管Maven和Java EE是在整个Java行业中都已建立的良好技术,但是使用它们并使用其作者打算使用的所有技术和模式来设计项目可能非常棘手。 在开发过程中途,由…

python字符串解释_python基础之字符串详解

1、Python环境配置:下载好之后安装,注意勾选环境变量。2、写python一定要注意代码的缩进。2、字符串:(1)、字符串是从左到右是从0开始索引,从右到左是从-1开始。遵循包前不包后原则。举例说明:代码: …

程序员们,想在双十一脱单?赶快跟我捯饬起来吧

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删生活中有很多男人一边抱怨自己不够洋气,找不到女票,另一方面又懒到宁肯在床上撸啊撸,也不愿意好好打扮自己。…

jboss8日志级别设置_罐中研讨会:设置JBoss BRMS全日研讨会

jboss8日志级别设置是否在寻找一种简单的方法来宣传,展示或演示使用JBoss业务规则管理系统(BRMS)产品的入门难度? 别无所求,因为我们已经召集了这个研讨会,因此您可以围绕JBoss BRMS构建一个晚上&#xff…

python具有伪代码的本质吗_Python的优点之一是具有伪代码的本质。( )_学小易找答案...

【单选题】下面关于函数的说法,错误的是( )。【单选题】实际开发中,文件或者文件夹操作都要用到os模块。( )【单选题】函数能处理比声明时更多的参数,它们是( ) 参数。【单选题】函数的名称可以随意命名。( )【单选题】Python源代码被解释器转换后的格式为( )。【单选题】Pytho…

C语言编程时你常犯的18种错误

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C语言的最大特点是:功能强、使用方便灵活。C编译的程序对语法检查并不象其它高级语言那么严格,这就给编程人员留下“灵活…

python字典items返回什么_Python 字典items返回列表,iteritems返回迭代器

说明:items以列表方式返回字典中的键值对,iteritems以迭代器对象 返回键值对儿(Python3中不再支持);字典items()方法和iteritems()方法,是python字典的内建函数,分别会返回列表和迭代器,下面一起来看下字典…

pl/postgresql_将PostgreSQL PL / Java安装为PostgreSQL扩展

pl/postgresql在2011年,我在PostgreSQL PL / Java上撰写了一系列文章。 基本信息仍然可靠,但是现在有了一种从源代码安装PL / Java的简便得多的方法。 这也消除了依赖第三方来创建软件包的需要。 由于我的读者已经熟悉git和maven,因此这些注释…

这些知识你都不知道,难怪说你学不懂C语言!

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删关于C语言的那些小知识,准备学习或者刚刚入门的你已经了解了吗?语言种类编译语言静态声明语言面向过程的编程语言环境工具…

图片识别出处_AI人脸识别

前言最近网络上爆火的藏族小哥哥丁真,大家都知道吗?十几天前凭借一张纯真、干净、帅气的脸霸屏各大短视频平台,连各大电视台新闻媒体都争相报道,这个藏族小伙瞬间火了!!网友们对于丁真的长相评价不一&#…

java源文件编译成jar_从源文件和JAR文件构建Java代码模型

java源文件编译成jar最近,我花了一些时间来研究有效java ,该方法正在GitHub上达到300星(可以免费帮助实现目标:D)。 Effectivejava是在您的Java代码上运行查询的工具。 它基于我参与的另一个项目javaparser 。 Javapa…

【从零开始学C语言】知识总结一:C语言的基本知识汇总

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作 为系统设计语言,编写工作系统应…

排球分组循环交叉编排_同学!中国海洋大学第一届排球联赛等你来战!

New中国海洋大学第一届排球联赛开始啦比赛宗旨1亲爱的同学们:为增强学生凝聚力,加强新老生交流,促进各院系的友谊,培养同学们的团队精神,丰富同学们的课余生活,展示我校文体风采,特此举办本次中…

jolokia_使用WildFly 9和Jolokia监视DevOps样式

jolokiaDevOps是当今最热门的话题之一。 并且围绕它的广泛主题使您很难真正找到完整的描述或涵盖体面粒度的所有内容。 可以肯定的一件事是:最重要的部分之一是提供正确的度量标准和信息以监视应用程序。 Java EE和JMX 监视Java EE服务器的标准方法是JMX。 使用JCo…

计算机的本质是哲学

点击蓝字关注我们因公众号更改推送规则,请点“在看”并加“星标”第一时间获取精彩技术分享来源于网络,侵删学什么抽象模型庄子说过吾生有崖,知无涯。以有限的生命去学习无尽的知识是很愚蠢的。所以,学习的终极目标一定不是知识本…

用户首次登录之前必须更改密码_技术丨带你玩转Win10系统的用户账户

由于微软关于Win10家庭版系统用户和组的功能设置,在一般情况下,用户无法直接进行用户账户的管理。但通过简单的设置,同样能够玩转Win10系统的用户账户。今天我们将探索并学习:如何实现用户账户的设置与更改。Microsoft账户登录首次…