1. 程式人生 > 其它 >關於Precision,Recall,ROC曲線,KS,Lift等模型評價指標的介紹

關於Precision,Recall,ROC曲線,KS,Lift等模型評價指標的介紹

1.Precision, Recall

準確率 \(Accuracy = \frac{TP+TN}{TP+TN+FP+FN}\)

精確率(或命中率) \(Precision = \frac{TP}{TP+FP}\),預測為positive中,實際為positive的比例,反映分類器的準確性

召回率 \(Recall = \frac{TP}{TP+FN}\),實際為positive中,預測為positive的比例,反映分類器的完備性

F值為精確率和召回率的調和平均:

\[F1\_Score=\frac{2*Precision*Recall}{Precision+Recall} \]

什麼情況下更注重Precision, 什麼情況下更注重Recall:

  • 注重 \(Precision = \frac{TP}{TP+FP}\),希望 FP 小 -> 希望判斷為正實際為負的情況少 -> 垃圾郵件 (垃圾郵件為1,非垃圾郵件為0,希望本不是垃圾郵件但被判定為垃圾郵件的情況越少越好)
  • 注重 \(Recall = \frac{TP}{TP+FN}\),希望 FN 小 -> 希望判斷為負實際為正的情況少 -> 信貸風控 (壞客戶為1,好客戶為0,希望本是壞客戶但被判定為好客戶的情況越少越好)

2.TPR,FPR

\[TPR (True\ Positive\ Rate) = \frac{TP}{TP+FN} \]

TPR 等價於 Recall

,正樣本中正確分類的比例(所有真實的1中,有多少被模型成功選出)

\[FPR(False\ Positive\ Rate) = \frac{FP}{FP+TN} \]

FPR,負樣本中錯分的比例(所有真實的0中,有多少被模型誤判為1)

3. Sensitivity, Specificity

靈敏度 \(Sensitivity = \frac{TP}{TP+FN}\)等價於 Recall,正樣本中正確分類的比例 (Accuracy with respect to positive cases, also called \(True\ Positive\ Rate\)).

特異度 \(Specificity = \frac{TN}{TN+FP}\)

,負樣本中正確分類的比例 (Accuracy with respect to negative cases).

\(FPR=1-Specificity\)

4. ROC 曲線

ROC曲線:ROC曲線是一個畫在二維平面上的曲線,橫座標是FPR(負樣本中錯分的比例),縱座標是TPR(TPR等價於recall,正樣本中正確分類的比例)。對某個分類器而言,根據其在測試樣本上的表現可以得到一個(FPR,TPR)點對,調整分類時使用的閾值,可以得到一個曲線,就是ROC曲線。一般情況下,這個曲線應該處於對角線的上方(對角線代表的是一個隨機分類器)。

參考 【建模基礎課】ROC、K-S,教你巧妙使用模型評價指標

最理想的模型,當然是 TPR 儘量高而 FPR 儘量低,然而任何模型在提高正確預測概率的同時,也會難以避免地增加誤判率,ROC曲線非常形象地表達了二者之間的關係。

對於一個二分類模型,輸出的最初結果是連續的(概率);假設已經確定一個閾值,那麼最初結果大於閾值時,則輸出最終結果為1,小於閾值則輸出為0。假如閾值取值為0.6,那麼 FPR 和 TPR 就可以計算出此時的取值,標記為一個點,記為 (FPR1,TPR1);如果閾值取值為0.5,同理可以計算出另一個點,記為 (FPR2,TPR2)。設定不同的閾值,就可以計算不同的點 (FPR,TPR),以 FPR 為橫座標, TPR 為縱座標,把不同的點連成曲線,就得到了ROC曲線。(閾值為0時,所有預測均會被判為正例,此時 (FPR,TPR)=(1,1);閾值為1時,所有預測均會被判為負例,此時 (FPR,TPR)=(0,0))

那麼問題來了,閾值如何確定?

以Logistic模型為例,模型輸出的結果其實是概率,我們通過設定閾值,把概率轉化為最終的輸出結果0和1。首先出現在我們腦中的直觀想法,就是把(0,1)區間進行等分,比如等分為十個區間,那麼就可以分別以0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9為閾值,首先計算出根據閾值判定出的0和1有多少,以及“真實為1判定為1”和“真實為0判斷為1”的有多少;然後計算出不同的(FPR,TPR)值;最後把點之間進行連線,畫出的曲線即是ROC曲線。

下面,我們以某商業銀行某時間段內某支行客戶的逾期相關資料為例詳細說明:P代表此支行的某客戶的逾期率(暫且定義為在此時間段內某客戶的逾期可能性),Y代表是否為高逾期客戶,X是與逾期有關的相關指標,比如行業、企業規模、客戶的五級分類等等。

然而,當把這個直觀的想法對案例資料付諸實施的時候,我們發現計算出的概率值都落在 [0.0092,0.578] 區間範圍內。這種情況下,如果還用上面的“直觀想法”(即仍然假定P小於閾值時,判定為0),那麼設定閾值為0.1到0.5時,能夠計算出不同的 (FPR,TPR) 值;而將閾值取到0.6到0.9時,模型的判定結果為所有的樣本就都是0了……so sad!此時計算出的 (FPR,TPR) 值都是 (0,0),ROC曲線的點由11個變成了6個.

面對這個特殊案例,我們的直觀想法肯定需要改進。於是最終,我們的實現方法是:

  1. 把 (0,1) 區間升級為 (min(P),max(P));
  2. 取值 (min(P),max(P))/10,設定閾值為 (min(P),max(P))*k/10,其中 k=1,2,3,…,9;
  3. 根據不同的閾值,計算出不同的 (FPR,TPR) 值。

這時候再畫出ROC曲線,就避免了上面的問題。然而小夥伴又發問了:這樣在寫程式碼實現的過程中,每次都要和閾值進行比較,計算量比較大,不如先對樣本計算出的P值從小到大排序,取前百分之幾(比如10%)處的值為閾值,那麼排在這之後的判定為0,其他則判定為1。這樣計算量就少了很多啦!

於是,我們繼續改進閾值的設定,首先把Logistic模型輸出的概率從小到大排序,然後取 10%*k(k=1,2,3,…,9)處的值(也就是概率值)作為閾值,計算出不同的(FPR,TPR)值,就可以畫出ROC曲線啦。

可是,從小到大排序之後,每次取前百分之幾處的值為閾值呢?總共分成10份還是100還是1000份呢?有選擇困難症的小夥伴又糾結了,告訴你個辦法,別糾結,有多少個模型輸出的概率值就分成多少份,不再考慮百分之幾!比如Logistic模型輸出的概率有214個,那麼我們把這214個值從小到大進行排序,然後分別以這214個概率值為閾值,可以計算出214個不同的 (FPR,TPR) 值,也可以畫出ROC曲線。

ROC曲線畫好後,就要發揮用處!對於一個模型一組引數可以畫出一條ROC曲線,此時最優的閾值是什麼呢(即以什麼閾值為準,去最終劃分為0,1)?TPR和FPR是正相關的,也就是說,正確判定出1的數量增加時,必然要伴隨著代價:誤判為1的FP也增加。

從ROC曲線上也可以反映出這種變化,從 ΔTPR>ΔFPR 到 ΔTPR<ΔFPR(一開始曲線比較陡,TPR增長得快,FPR增長得慢,即 ΔTPR>ΔFPR;到後面,曲線比較平緩,TPR增長得慢,FPR增長得快,有ΔTPR<ΔFPR),最理想的閾值是 ΔTPR=ΔFPR 時。但是在實際應用中,我們很少能夠給出ROC曲線的函式表示式,這時的解決方法包括:

  1. 給出ROC曲線的擬合函式表示式,然後計算出最優的閾值,這個目前通過軟體實現難度不大:如何給出最優擬合函式,計算數學上有很多方法;計算出 ΔTPR≈ΔFPR 的點即為最優的閾值。
  2. 從業務上給出最優的閾值。

對模型進行調參時,可以畫出多條ROC曲線,此時哪組引數是最優的呢?我們可以結合AUC指標,哪組引數的AUC值越高,說明此組引數下的模型效果越好。

AUC (Area Under the ROC Curve) 值:ROC曲線下的面積,取值範圍在 0.5 到 1 之間。使用AUC值作為評價標準是因為很多時候ROC曲線並不能清晰的說明哪個分類器的效果更好,而作為一個數值,對應AUC更大的分類器效果更好。

另外,在SAS的評分模型輸出中,常用來判斷收入分配公平程度的gini係數也用來評價模型,此時gini=2*AUC-1.

ROC曲線的特性:當測試集中的正負樣本的分佈(比例)變化的時候,ROC曲線能保持不變。當資料中存在類不平衡現象時可以使用ROC曲線來評估模型的效能。

5. KS 曲線與 KS 值

參考:
【建模基礎課】ROC、K-S,教你巧妙使用模型評價指標
KS(Kolmogorov-Smirnov)值
模型指標—KS

常用的模型評價還有K-S曲線,它和ROC曲線的畫法異曲同工。以Logistic模型為例,首先把Logistic模型輸出的概率從大到小排序,然後取 \(10\%*k(k=1,2,3,…,9)\) 處的值作為閾值,計算出不同的 FPR 和 TPR 值(其中TPR其實就是所有正樣本中當前累計抓出了多少,FPR就是所有負樣本中當前累計抓出了多少),以 \(10\%*k(k=1,2,3,…,9)\) 為橫座標(以閾值為橫座標),分別以 TPR 和 FPR 的值為縱座標,就可以畫出兩條曲線,這就是 K-S曲線。

從K-S曲線就能衍生出KS值KS=max(TPR-FPR)(或者KS=max(|TPR-FPR|)),即是兩條曲線之間的最大間隔距離。當(TPR-FPR)最大時,也就是ΔTPR-ΔFPR=0,這和ROC曲線上找最優閾值的條件ΔTPR=ΔFPR是一樣的。從這點也可以看出,ROC曲線、K-S曲線、KS值的本質是相同的。

例1:

例2:

KS(Kolmogorov-Smirnov)值越大,表示模型區分正負樣本的能力越強。KS值的取值範圍是 [0,1]。

ks值 含義
>0.3 模型預測能力較好
0.2~0.3 模型可用
0~0.2 模型預測能力較差

通常來講,KS>0.2即表示模型有較好的預測準確性。

K-S曲線能直觀地找出模型中差異最大的一個分段,比如評分模型就比較適合用KS值進行評估;但同時,KS值只能反映出哪個分段是區分度最大的,不能反映出所有分段的效果。所以,在實際應用中,模型評價一般需要將ROC曲線、K-S曲線、KS值、AUC指標結合起來使用。

6. Lift 提升度

參考:
模型和策略效果衡量常用指標——LIFT提升度
分類模型的效能評估——以 SAS Logistic 迴歸為例 (3): Lift 和 Gain | 統計之都 (cosx.org)
怎麼做模型提升度的曲線?
Understand Gain and Lift Charts (listendata.com)
Comparing Model Evaluation Techniques Part 2: Classification and Clustering - Data Science Central
11 Important Model Evaluation Techniques Everyone Should Know - Data Science Central
Evaluation Metrics Machine Learning (analyticsvidhya.com)

6.1 什麼是 Lift

Lift提升度衡量的是,與不利用模型相比,模型的預測能力 “變好” 了多少(how much better one can expect to do with the predictive model comparing without a model. The "lift" is the ratio of results with and without the model; Better models have higher lifts.)。它衡量的是一個模型(或規則)對目標中“響應”的預測能力優於隨機選擇的倍數,以1為界線,大於1的Lift表示該模型或規則比隨機選擇捕捉了更多的“響應”,等於1的Lift表示該模型的表現獨立於隨機選擇,小於1則表示該模型或規則比隨機選擇捕捉了更少的“響應”。維基百科中提升度被解釋為“Target response divided by average response”。

顯然,lift(提升指數)越大,模型的執行效果越好。如果這個模型的預測能力跟 baseline model 一樣(lift 等於 1),這個模型就沒有任何 “提升” 了(套一句金融市場的話,它的業績沒有跑過市場)。

以信用評分卡模型為例,LIFT提升度衡量的是評分模型對壞樣本的預測能力相比隨機選擇的倍數,LIFT大於1說明模型表現優於隨機選擇。我們通常會將打分後的樣本按分數從低到高(違約概率從高到低)排序,取10或20等分(有同分數對應多條觀測的情況,所以各組觀測數未必完全相等),並對組內觀測數與壞樣本數進行統計。用評分卡模型捕捉到的壞客戶的佔比,可由該組壞樣本數除以總的壞樣本數計算得出;而不使用評分卡,以隨機選擇的方法覆蓋到的壞客戶佔比,等價於該組觀測數佔總觀測數的比例。對兩者取累計值,取其比值,則得到提升度Lift,即該評分卡抓取壞客戶的能力是隨機選擇的多少倍。(詳細的計算見後文)

6.2 為什麼要看 Lift

舉個例子,一個貸款產品目標客群有10000個人,其中混合了500個壞客戶。如果隨機選擇1000個人放款,可能會遇到50個壞客戶。但是如果運用模型對壞客戶加以預測,只選擇模型分數最高的1000人放款,如果這1000個客戶表現出來最終逾期的只有20戶,說明模型在其中是起到作用的,此時的LIFT就是大於1的。如果表現出來逾期客戶超過或等於50個,LIFT小於等於1,那麼從效果上來看這個模型用了還不如不用。LIFT就是這樣一個指標,可以衡量使用這個模型比隨機選擇對壞樣本的預測能力提升了多少倍。

6.3 Lift 如何計算

通常計算LIFT的時候會把模型的最終得分按照從低到高(違約概率從高到低)排序並等頻分為10組或20組(有同分數對應多條觀測的情況,所以各組觀測數未必完全相等),計算分數最低(違約概率最高)的一組對應的累計壞樣本佔比/累計總樣本佔比就等於LIFT值了。(一般會計算第1組,1-2組,1-3組,...的累計提升度,最後取最大值,但最大值一般就在第1組)
分子:累計壞樣本佔比相當於是使用模型的情況下截止到該組能夠從所有的壞樣本中挑出多少比例的壞樣本(截止到該組壞樣本數/總壞樣本數)
分母:累計總樣本佔比等於隨機抽樣的情況下從所有壞樣本抽取了多少比例的壞樣本(截止到該組人數/總人數),即以隨機選擇的方法覆蓋到的壞客戶佔比,等價於截止到該組觀測數佔總觀測數的比例,也即完全隨機的情況下,抽取10%的樣本也會對應抽到壞樣本中的10%,以6.2中的例子:

注:關於提升度與累計提升度:通常提升度指的就是累計提升度?
每組都可以算一個累計提升度:衡量截止到目前組的情況
最大值:到前多少組,兩者比值達到最大(一定在第一組?)

個人理解:累計提升度可以理解為用百分之多少的人數覆蓋了百分之多少的目標人群,如果用很少的人數覆蓋了很大一部分的目標人群,則累計提升度會比較大。比較兩個模型的效果時,以一個模型劃分結果去等人數劃分另一個模型(分母相同),哪個模型覆蓋的目標人群更多(分子更大),則其提升度越大。

下圖是一個提升表(Lift Table)的示例:

以分數段為橫軸,以提升度為縱軸,可繪製出累計提升圖,示例如下:

有了累計提升圖,我們就能直觀地去比較不同模型或策略給我們帶來的區分能力增益程度。

對累計提升度的解釋:

(假設等分為10份) The Cum Lift of 4.03 for top two deciles, means that when selecting 20% of the records based on the model, one can expect 4.03 times the total number of targets (events) found by randomly selecting 20%-of-file without a model.

另一個例子:

(來自 Lift Charts (uregina.ca)

6.4 關於提升度與混淆矩陣

While the confusion matrix gives proportions between all negatives and positives, Gain and lift charts focus on the true positives. One of their most common uses is in marketing, to decide if a prospective client is worth calling.

Gain and lift charts work with a sample (a fraction of the population). In comparison, a confusion matrix uses the whole population to evaluate a model.

注:Gain 和提升度類似(其實就是Lift的分子部分)

7. 在 Python 中的實現

from sklearn.metrics import precision_score, recall_score, f1_score
from sklearn.metrics import confusion_matrix
from sklearn.metrics import roc_auc_score
from sklearn.metrics import roc_curve

def evaluation_metric(y_true, y_pred, y_pred_prob):
    print("precision: ", precision_score(y_true, y_pred))
    print("recall: ", recall_score(y_true, y_pred))
    print("f1_score: ", f1_score(y_true,  y_pred))
    print("=========")

    print("confusion matrix: ")
    cm = confusion_matrix(y_true, y_pred)
    print(cm)
    print("=========")

    print("auc: ", roc_auc_score(y_true, y_pred_prob)) # auc用預測概率進行計算
    
    fpr, tpr, thresholds = roc_curve(y_true, y_pred_prob)
    ks = max(tpr-fpr)
    print("ks: ", ks)