KS(Kolmogorov-Smirnov)值越大,表示模型能够将正、负客户区分开的程度越大。KS值的取值范围是[0,1]

通常来讲,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代码实现:

注意:以下代码只是为了让原理更通俗易懂,采用了非常简洁的实现方式(横轴按概率等分时直接用的阈值进行计算等分,实际上有更准确的方式(传送门:https://blog.csdn.net/sscc_learning/article/details/86707005?utm_medium=distribute.pc_relevant.none-task-blog-baidujs_baidulandingword-2&spm=1001.2101.3001.4242))

#-*- 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):passdef 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 - FPRdef 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,ksif __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))#代码实现

#参考博客:http://www.sohu.com/a/132667664_278472

如有错误的地方,请大家帮忙指正,多谢~

ks(洛伦兹曲线)指标理解相关推荐

  1. 分类评估指标之家族成员:ROC、AUC、Lift、Gain、Gini、KS、PR曲线、F1、洛伦兹曲线

    关于AUC.KS评价指标.洛伦兹曲线.Gini系数.Lift曲线和Gain曲线.在别人的博客里看到下面的一个小故事: 故事是这样的(向善于总结的大佬致敬): ​ 首先,混淆矩阵是个元老,年龄最大也资历 ...

  2. AUC、KS评价指标、洛伦兹曲线、Gini系数、Lift曲线和Gain曲线

    文章目录 1.AUC 1.1.混淆矩阵 1.2.ROC曲线 1.3.关于AUC值 2.KS评价指标 3.洛伦兹曲线 4.Gini系数 5.Lift曲线和Gain曲线 5.1.Lift曲线 5.2.Ga ...

  3. 泊松回归、gamma回归、Tweedie回归等广义线性回归模型GLM的评估指标:校准曲线、 洛伦兹曲线、卡方检验、AIC、BIC、偏差(Deviance)指标

    泊松回归.gamma回归.Tweedie回归等广义线性回归模型GLM的评估指标:校准曲线(Calibration curve). 洛伦兹曲线(Lorenz Curve).卡方检验.AIC.BIC.偏差 ...

  4. 我对洛伦兹曲线与GINI系数的一点看法

    数据分析有时需要针对单变量进行数据描述,有时需要针对多变量之间的关系进行数据描述,洛伦兹曲线就是为描述多变量间关系而服务的.洛伦兹曲线即累计频数分布曲线,用于分析社会财富.土地.工资分配是否公平的问题 ...

  5. 洛伦兹曲线如何度量TCP公平性

    洛伦兹曲线一般用来描述收入分配,但实际上收入分配只是一个case,所有涉及固定资源分配的case,都可以用洛伦兹曲线来描述,而基于洛伦兹曲线度量公平性的指标,便是基尼指数. 如何理解洛伦兹曲线呢?我给 ...

  6. 洛伦兹曲线看财富分配的公平性

    读了篇自己很早以前的写的一篇文章,学到了不少,然而和最近的一些新想法相冲突,所以本文先抽象简化之前那篇,最后加上浙江温州那段,后面有时间再写关于多维填充导致的尺度不变性的解释,也就是幂律的终极根源. ...

  7. 洛伦茨曲线_什么叫洛伦兹曲线,什么叫基尼系数,我国的基尼系数偏大说明什么问题...

    展开全部 1.洛伦兹曲线 洛伦兹曲线(Lorenz curve),也译为"劳伦兹曲线".指在一个总体(国家.地区)内,以e69da5e6ba9062616964757a686964 ...

  8. R语言建模收入不平等:分布函数拟合及洛伦兹曲线(Lorenz curve)

    最近我们被客户要求撰写关于洛伦兹曲线的研究报告,包括一些图形和统计输出. 洛伦兹曲线来源于经济学,用于描述社会收入不均衡的现象.将收入降序排列,分别计算收入和人口的累积比例. 本文,我们研究收入和不平 ...

  9. 洛伦茨曲线半高全宽_洛伦兹曲线

    洛伦兹曲线 百科名片 洛伦兹曲线(Lorenz curve),也译为"劳伦兹曲线".就是,在一个总体(国家.地区)内,以"最贫穷的人口计算起一直到最富有人口"的 ...

  10. matlab做基尼曲线,计算基尼系数和matplotlib绘制洛伦兹曲线

    基尼系数和洛伦兹曲线,在表示数据的不平均方面特别是财富的不平均上被广泛应用.但是目前在python里面并没有找到很好的可以直接绘制洛伦兹曲线的函数,由于目前项目用到,也就在实际应用中使用到,就把如何使 ...

最新文章

  1. Java项目:无库版银行管理系统(java+Gui+文档)
  2. 同时打开两个excel工作窗口
  3. boost::python::dict相关的测试程序
  4. BeetleX.WebFamily之Markdown编辑器
  5. js使用location的方法实验
  6. linux如何做bond4,linux系统做bond
  7. Kali Linux学习之arp地址欺骗
  8. (概论)java web后台开发跟手机APP后台开发有什么不同
  9. Ubuntu电视卡安装指南
  10. 关于Raster的理解
  11. 解决报错: You have not concluded your merge (MERGE_HEAD exists)
  12. python日常实用技能:使用python将大量数据导出到Excel中的
  13. Pygame(四)画椭圆,弧
  14. 干货分享!华为模拟器Web配置防火墙
  15. mac mini调整屏幕亮度
  16. 赛车小游戏c语言代码,网页赛车小游戏(纯JavaScript编写)
  17. 一文读懂XPath基本语法_XPath语法详解_XPath教程
  18. English语法_定语从句-关系副词
  19. 八成多的姓氏发源于姬姓,这个最“牛”的姓氏为什么现在这么少?
  20. 自动点击器如何设置最快_「宝可梦大师」自动挂机刷本教学!我们不肝!安卓之自动点击器...

热门文章

  1. 破冰、融合、同心 —— 沃创云开展2021年户外团建活动
  2. debug 服务器应用程序不可用
  3. matlab拟合韦布尔分布,Matlab 三参数Weibull分布拟合求解
  4. HDU 4745 Two Rabbits(区间dp)
  5. Java获得腾讯QQ在线状态(.net webservice)
  6. Contest - 第10届“新秀杯”ACM程序设计大赛网络资格赛 赛后信息(题解)
  7. C#中使用python(基于Ironpython)
  8. 一个炫酷的动态背景页面
  9. ip子网掩码计算及子网划分
  10. Android学习——地图(百度地图)