定義
TP: True Postive 預測正類,實際也是正類
FP:False Positive 預測正類,實際是負類
TN:True Negtive 預測負類,實際也是負類
FN:False Negtive 預測負類,實際是正類
TPR:TP / (TP+FN) 所有正例中有多少個正例被分出來。
FPR: FP / (TN+FP) 所有負例中有多少例子被分爲正例。
模型預測的結果通常是一個概率值,概率值越大說明這個樣本是正例的可能性越大,我們需要一個閾值(threshold)來定義多大的概率以上纔是正例,通常這個值設爲0.5,表示概率值大於0.5表示這個樣本是正例,小於0.5表示這個樣本是負例。
TPR曲線:橫軸是閾值,縱軸是TPR,通過將閾值從1.0->0來畫出很多個TPR的點,連起來得到TPR曲線。
FPR曲線:橫軸是閾值,縱軸是FPR,通過將閾值從1.0->0來畫出很多歌FPR的點,連起來得到FPR曲線。
KS值:TPR曲線和FPR曲線相距最遠的距離值(同一個閾值的TPR和FPR的差值)
如圖:
代碼實現
from sklearn.metrics import roc_curve
import numpy as np
def ks(y_true, y_score):
fpr, tpr, _ = roc_curve(y_true, y_score)
diff = np.subtract(tpr, fpr)
mins, maxs = diff.min(), diff.max()
return mins if abs(mins) > abs(maxs) else maxs
按照數學的定義,距離是一個絕對值,在二分類問題的結果當中,一個不穩定的分類器可能導致TPR和FPR相交。
- 如果按照兩條線距離的絕對值,那麼絕對值最大的地方可能是模型反向預測的地方。
- 如果按照max(TPR-FPR),我們得到的結果時正向預測的最大值的點,但是無法得到模型區分能力最強的點。
- 如果取(TPR-FPR)的最小值和最大值,然後返回這兩個值絕對值最大的那個原始值,例如2和-4返回-4,這樣既可以知道兩條曲線最大的距離是多少,也可以通過符號判斷出此處模型是否已經反向預測。
我的代碼是第三種,這種情況其實在真實場景中很小概率出現,但是從指標的意義上來說我覺得第三種是最貼近實際生產環境的。