欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ks(洛伦兹曲线)指标理解

程序员文章站 2022-07-15 16:00:58
...

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

通常来讲,KS>0.2即表示模型有较好的预测准确性。

ks求解方法:

ks需要TPR和FPR两个值:真正类率(true positive rate ,TPR), 计算公式为TPR=TP/ (TPFN),刻画的是分类器所识别出的 正实例占所有正实例的比例。另外一个是假正类率(false positive rate, FPR),计算公式为FPR= FP / (FP + TN),计算的是分类器错认为正类的负实例占所有负实例的比例。KS=max(TPR-FPR)。其中:

TP:真实为1且预测为1的数目

FN:真实为1且预测为0的数目
FP:真实为0的且预测为1的数目

TN:真实为0的且预测为0的数目

计算步骤:

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):
    	#y_test为真实值,y_pred_prob为预测出来的概率
    	fpr,tpr,thresholds = roc_curve(y_test,y_pred_prob)
    	#画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


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,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,0.39]
    print(a.Getps_ks(real_data,data))#自己实现
    print(a.GetKS(real_data,y_pred_prob))#代码实现

ks(洛伦兹曲线)指标理解

ks(洛伦兹曲线)指标理解

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



上一篇: windows10的IIS

下一篇: CVE-2016-0189