zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    织梦分页条添加省略号(支持动态静态)
    织梦点击数或者其他数值过【千】过【万】过【亿】的写法
    织梦文章页每个TAG标签单独输出相关文章
    织梦验证码不显示解决方法总结
    织梦搜索结果根据搜索不同栏目显示不同搜索结果模板
    织梦正则提取中英混合字符串中第一个中文汉字
    织梦让内容摘要多行文本支持换行
    织梦dede:tag标签输入添加自增autoindex
    织梦去除底部版权power by dedecms
    织梦自定义表单添加访客提交时间和访客IP+限制每天每个IP提交表单次数
  • 原文地址:https://www.cnblogs.com/Allen-rg/p/11511900.html
Copyright © 2011-2022 走看看