KS-指标
-
ks定义
ks是指通过衡量好坏样本累计分布之间的差值,来评估模型的风险区分能力。KS曲线又叫洛伦兹曲线。以TPR和FPR分别作为纵轴,以阈值作为横轴,画出两条曲线。KS曲线则是两条曲线的在每一个阈值下的差值
真阳性率(TPR) : 判定为正例也是真正例的比率
伪阳性率(FPR) :判定为正例却不是真正例的比率
注:ks取的是TPR和FPR差值的最大值 -
KS(Kolmogorov-Smirnov)指标即max(TPR-FPR)
-
KS指标的含义
KS值可以反映模型的最优区分效果,此时所取的阈值一般作为定义好坏用户的最优阈值。KS值越大,模型的预测准确性越好。KS值的取值范围是[0,1] ,一般,KS>0.2即可认为模型有比较好的预测准确性。
KS<0.2:模型无鉴别能力;
0.2-0.4之间,模型勉强接受;
0.41-0.5之间,模型具有区别能力;
0.51-0.6之间,模型有很好的区别能力;
0.61-0.75之间,模型有非常好的区别能力;
KS>0.75,模型异常,很有可能有问题。 -
ks 图像
ks图线显示的是不同的阈值(cut_off)对应的不同ks值,取两条曲线的差值的最大值为ks值。故,ks值是找出模型中差异最大的一个分段,如评分卡这种相对就比较适合ks值的评估。对于一般任务更加关注负样本,那么区分度肯定就是很重要的,使用KS比AUC更加适合用于模型的评估。
-
代码的实现
-
第一种方法:
def compute_ks(data):
sorted_list = data.sort_values([‘predict_proba’], ascending=[True])#按照样本为正样本的概率值升序排序 ,也即坏样本的概率从高到低排序
total_good=sorted_list[‘label’].sum()
total_bad = sorted_list.shape[0] - total_good
max_ks = 0.0
good_count = 0.0
bad_count = 0.0
for index, row in sorted_list.iterrows(): #按照标签和每行拆开
if row[‘label’] == 0:
bad_count +=1
else:
good_count +=1
val = abs(bad_count/total_bad - good_count/total_good)
max_ks = max(max_ks, val)
return max_ks
test_pd=pd.DataFrame()
y_predict_proba=est.predict_proba(X_test)[:,1]#取被分为正样本的概率那一列
Y_test_1=np.array(Y_test)
test_pd[‘label’]=Y_test_1
test_pd[‘predict_proba’]=y_predict_proba
print (“测试集 KS:”,compute_ks(test_pd)) -
第二种方法:
y_predict_proba = est.predict_proba(X_test)[:,1]
fpr,tpr,thresholds= sklearn.metrics.roc_curve(np.array(Y_test),y_predict_proba)
print (‘KS:’,max(tpr-fpr))