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的数目
利用公式自主实现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})