KS(Kolmogorov-Smirnov)值
KS(Kolmogorov-Smirnov)值越大,表示模型能够将正、负客户区分开的程度越大。KS值的取值范围是[0,1]
ks越大,表示计算预测值的模型区分好坏用户的能力越强。
| ks值 | 含义 | 
|---|---|
| > 0.3 | 模型预测性较好 | 
| 0,2~0.3 | 模型可用 | 
| 0~0.2 | 模型预测能力较差 | 
| < 0 | 模型错误 | 
通常来讲,KS>0.2即表示模型有较好的预测准确性。
ks求解方法:
ks需要TPR和FPR两个值:真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TP+ FN),刻画的是分类器所识别出的 正实例占所有正实例的比例。另外一个是假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。KS=max(TPR-FPR)。其中:
TP:真实为1且预测为1的数目
FN:真实为1且预测为0的数目
FP:真实为0的且预测为1的数目
TN:真实为0的且预测为0的数目
一句话概括:
KS曲线是两条线,其横轴是阈值,纵轴是TPR(上面那条)与FPR(下面那条)的值,值范围[0,1] 。两条曲线之间之间相距最远的地方对应的阈值,就是最能划分模型的阈值。
计算步骤:
1. 按照分类模型返回的概率升序排列 ,也可以直接是数据,根据某一阈值判断为1或0即可
2. 把0-1之间等分N份,等分点为阈值,计算TPR、FPR (可以将每一个都作为阈值)
3. 对TPR、FPR描点画图即可 (以10%*k(k=1,2,3,…,9)为横坐标,分别以TPR和FPR的值为纵坐标,就可以画出两个曲线,这就是K-S曲线。)
KS值即为Max(TPR-FPR)
Python代码实现:
#-*- coding:utf-8 -*-
#自己实现计算ks与调包
from sklearn.metrics import roc_curve
import matplotlib.pyplot as plt
import seaborn as sns
#%matplotlib inline
#%config InlineBackend.figure_format = 'retina'
plt.rcParams['font.sans-serif'] = ['SimHei'] # 中文字体设置-黑体
plt.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
sns.set(font='SimHei') # 解决Seaborn中文显示问题 class BinJianAna:
def __init__(self):
pass def ComuTF(self,lst1,lst2):
#计算TPR和FPR
#lst1为真实值,lst2为预测值
TP = sum([1 if a==b==1 else 0 for a,b in zip(lst1,lst2)])#正例被预测为正例
FN = sum([1 if a==1 and b==0 else 0 for a,b in zip(lst1,lst2)])#正例被预测为反例
TPR = TP/(TP+FN)
TN = sum([1 if a==b==0 else 0 for a,b in zip(lst1,lst2)])#反例被预测为反例
FP = sum([1 if a==0 and b==1 else 0 for a,b in zip(lst1,lst2)])#反例被预测为正例
FPR = FP/(TN+FP)
return TPR - FPR def Getps_ks(self,real_data,data):
#real_data为真实值,data为原数据
d = []
for i in data:
pre_data = [1 if line >=i else 0 for line in data]
d.append(self.ComuTF(real_data,pre_data))
return max(d),data[d.index(max(d))] def GetKS(self,y_test,y_pred_prob):
'''
功能: 计算KS值,输出对应分割点和累计分布函数曲线图
输入值:
y_pred_prob: 一维数组或series,代表模型得分(一般为预测正类的概率)
y_test: 真实值,一维数组或series,代表真实的标签({0,1}或{-1,1})
'''
fpr,tpr,thresholds = roc_curve(y_test,y_pred_prob)
ks = max(tpr-fpr)
#画ROC曲线
plt.plot([0,1],[0,1],'k--')
plt.plot(fpr,tpr)
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.show()
#画ks曲线
plt.plot(tpr)
plt.plot(fpr)
plt.plot(tpr-fpr)
plt.show()
return fpr,tpr,thresholds,ks if __name__ == '__main__':
a = BinJianAna()
data = [790,22,345,543,564,342,344,666,789,123,231,234,235,347,234,237,178,198,567,222]#原始评分数据
real_data = [1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0]
y_pred_prob = [0.42,0.73,0.55,0.37,0.57,0.70,0.25,0.23,0.46,0.62,0.76,0.46,0.55,0.56,0.56,0.38,0.37,0.73,0.77,0.21]
#以下只为演示如何调用方法,2种方法独立计算,数据之间无关联,因此得出的ks不一样
print(a.Getps_ks(real_data,data))#自己实现
print(a.GetKS(real_data,y_pred_prob))#代码实现
本文链接:https://blog.csdn.net/sinat_30316741/article/details/80018932
KS(Kolmogorov-Smirnov)值的更多相关文章
- 柯尔莫可洛夫-斯米洛夫检验(Kolmogorov–Smirnov test,K-S test)
		柯尔莫哥洛夫-斯米尔诺夫检验(Колмогоров-Смирнов检验)基于累计分布函数,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同. 在进行cumulative probab ... 
- Kolmogorov–Smirnov test(KS)
		sklearn实战-乳腺癌细胞数据挖掘( 博主亲自录制) https://study.163.com/course/introduction.htm?courseId=1005269003&u ... 
- 反思K-S指标(KPMG大数据挖掘)
		评估信用评级模型,反思K-S指标 2015-12-05 KPMG大数据团队 KPMG大数据挖掘 “信用评级”的概念听起来可以十分直截了当.比如一天早上你接到电话,有个熟人跟你借钱,而你将在半睡半醒间迅 ... 
- R语言与正态性检验
		1.Kolmogorov-Smirnov正态性检验 Kolmogorov-Smirnov是比较一个频率分布f(x)与理论分布g(x)或者两个观测值分布的检验方法,若两者间的差距很小,则推论该样本取自某 ... 
- 【R】正态检验与R语言
		正态检验与R语言 1.Kolmogorov–Smirnov test 统计学里, Kolmogorov–Smirnov 检验(亦称:K–S 检验)是用来检验数据是否符合某种分布的一种非参数检验,通过比 ... 
- Tests for normality正态分布检验
		欢迎关注博主主页,学习python视频资源,还有大量免费python经典文章 sklearn实战-乳腺癌细胞数据挖掘(博主亲自录制视频教程) https://study.163.com/course/ ... 
- Applied Nonparametric Statistics-lec10
		Ref:https://onlinecourses.science.psu.edu/stat464/print/book/export/html/14 估计CDF The Empirical CDF ... 
- PP图和QQ图
		一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ... 
- Spark 1.5新特性介绍
		一.DataFrame执行后端优化(Tungsten第一阶段) DataFrame可以说是整个Spark项目最核心的部分,在1.5这个开发周期内最大的变化就是Tungsten项目的第一阶段已经完成.主 ... 
- Q-Q图和P-P图
		一. QQ图 分位数图示法(Quantile Quantile Plot,简称 Q-Q 图) 统计学里Q-Q图(Q代表分位数)是一个概率图,用图形的方式比较两个概率分布,把他们 ... 
随机推荐
- Android笔记(六十九) 仿微信界面(一)
			综合之前的Fragment和自定义组件的知识,实现微信界面 MainActivity.java package cn.lixyz.test; import android.app.Acti ... 
- Android笔记(五十四) Android四大组件之一——ContentProvider(一)
			ContentProvider提供数据 在Android中,他的每个应用都是相互独立的,各自运行在自己的Dalvik虚拟机中,但现实使用中常常需要在多个应用之间进行数据交换,例如发短信需要获取联系人中 ... 
- 开发环境wamp3.06 + Zend studio 12 调试配置
			<?php $fileName = "php大师.test.php"; //补充程序,显示文件名(不包括扩展名) $start = strrpos($fileName, &q ... 
- 时间模块time和datetime的使用
			日期和时间 一 time模块 import time 时间的表示形式: 时间戳 时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现 ... 
- Lombok的使用详解(最详尽的解释,覆盖讲解所有可用注解),解决@Builder.Default默认值问题
			原文:https://blog.csdn.net/f641385712/article/details/82081900 前言 Lombok是一款Java开发插件,使得Java开发者可以通过其定义的一 ... 
- sql:拼接字符串、截取字符串、取字符串长度
			--第一段 SELECT substr('1233***6795', 0, (select instr('1233***6795', '***', 1, 1) from dual) - 1) from ... 
- 行为型模式(八) 职责链模式(Chain of Responsibility)
			一.动机(Motivate) 在软件构建过程中,一个请求可能被多个对象处理,但是每个请求在运行时只能有一个接受者,如果显示指定,将必不可少地带来请求发送者与接受者的紧耦合.如何使请求的发送者不需要指定 ... 
- KVM虚拟机,如何设置虚拟机的CPU型号与物理机是一样的
			1.在kvm主机上修改配置文件 [root@node160 ~]# virsh edit CentOS-7.3-X86_64 将xml配置文件中的: <cpu mode='custom' mat ... 
- 浅析 pagehelper 分页
			之前项目一直使用的是普元框架,最近公司项目搭建了新框架,主要是由公司的大佬搭建的,以springboot为基础.为了多学习点东西,我也模仿他搭了一套自己的框架,但是在完成分页功能的时候,确遇到了问题. ... 
- GITHUB下载源码
			从昨天开始就想着从GitHub上下载一个开源的Vue的实战项目,希望能从中学习更多的Vue的实用内容,结果搞了半天好不容易下载了,不知道怎么弄.然而,今天终于成功了,激动地我赶紧来记录一下. 如何从G ... 
