KS指標即max(TPR-FPR)。
方法一
第一種方法很長,具體情境是:二分類問題,正樣本標記為1,負樣本標記為0。里面有用到pandas和numpy庫,import語句就不貼了,代碼如下:
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))
具體的邏輯是根據這篇文章中介紹的KS的計算方法:
https://wenku.baidu.com/view/5f3e9c803c1ec5da51e2700e.html
方法二
這個方法比較簡潔,使用了sklearn的metrics里的函數roc_curve()求出FPR,TPR,然后直接計算max(TPR-FPR),是不是超方便噠~~~~
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))
親測這兩種方法計算出的結果是一樣的!
參考:https://wenku.baidu.com/view/5f3e9c803c1ec5da51e2700e.html