Kolmogorov-Smirnov KS 定義 python實現 KS值的正負

定義

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的差值)

如圖:
KS圖

代碼實現

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相交。

  1. 如果按照兩條線距離的絕對值,那麼絕對值最大的地方可能是模型反向預測的地方。
  2. 如果按照max(TPR-FPR),我們得到的結果時正向預測的最大值的點,但是無法得到模型區分能力最強的點。
  3. 如果取(TPR-FPR)的最小值和最大值,然後返回這兩個值絕對值最大的那個原始值,例如2和-4返回-4,這樣既可以知道兩條曲線最大的距離是多少,也可以通過符號判斷出此處模型是否已經反向預測。

我的代碼是第三種,這種情況其實在真實場景中很小概率出現,但是從指標的意義上來說我覺得第三種是最貼近實際生產環境的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章