KS(洛伦兹曲线)

KS(洛伦兹曲线)

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(洛伦兹曲线)_第1张图片

绘制ks曲线

利用公式自主实现fpr,tpr值,也可以导入sklearn.metrics import auc,roc_curve 模块计算

import numpy as np

import matplotlib.pyplot as plt
%matplotlib  inline

from sklearn.metrics import auc,roc_curve
from sklearn.metrics import confusion_matrix

# 真实类别
y = np.array([1,1,1,1,1,1,0,0,0,1,1,0,0,1,1,0,0,1,1,0,0])
# 算法预测的概率
prob = np.array([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])

threshold= np.arange(0,1.01,0.01)

tprs=[]
fprs=[]
for t in threshold:
    y_=prob>=t
    y_=y_.astype(np.int8)
    m=confusion_matrix(y_,y)
 
    tpr= m[1][1]/(m[1][1]+m[0][1])
    tprs.append(tpr)
    fpr=m[1][0]/(m[1][0]+m[0][0])
    fprs.append(fpr)
    
ks=np.array(tprs)-np.array(fprs)
a=auc(fprs,tprs)

plt.plot(fprs,tprs,label=a)
plt.plot(threshold,ks)
plt.legend()

index=ks.argmax()
threshold[index]

plt.annotate(s='thredshould:0.56',xy=(0.56,0.75),xytext=(0.8,0.85),arrowprops={
     'width':5,'headwidth':10,'headlength':5})

KS(洛伦兹曲线)_第2张图片

你可能感兴趣的:(机器学习,算法,python,机器学习,人工智能)