在解決分類問題的時候,可以選擇的評價指標簡直不要太多。但基本可以分成兩2大類,我們今分別來說道說道
- 基於一個概率閾值判斷在該閾值下預測的準確率
- 衡量模型整體表現(在各個閾值下)的評價指標
在說指標之前,我們先把分類問題中會遇到的所有情況簡單過一遍。36度的北京讓我們舉個涼快一點的例子-我們預測會不會下雨!橫軸是預測概率從0-1,紅色的部分是沒下雨的日子(負樣本),藍色的部分是下雨的日子(正樣本)。在真實情況下我們很難找到能對正負樣本進行完美分割的分類器,所以我們看到在預測概率靠中間的部分,正負樣本存在重合,也就是不管我們閾值卡在哪裡都會存在被錯誤預測的樣本。
上述分佈中的四種情況,可以簡單的用confusion matrix來概括
TP:預測為正&真實為正
FP:預測為正&真實為負
TN:預測為負&真實為負
FN:預測為負&真實為正
基於閾值的指標
分類模型輸出的是每個樣本為正的概率,我們要先把概率轉換成0/1預測。給定一個閾值,我們把預測概率大於閾值的樣本預測為正,小於的為負。這時就會出現上述confustion matrix裡面的四種情況。那我們該如何去評價模型表現呢?
新手視角- Accuracy!
這應該是大多數人第一個知道的評價指標,它把正負樣本混在一起去評價整體的分類準確率。
\[Accuracy = \frac{TP + TN}{TP + TN + FN + FP}\]
老手會用一個在所有tutorial裡面都能看到的Imbalance Sample的例子來告訴你,如果你的正樣本只有1%,那全部預測為負你的準確率就是99%啦 - so simple and naive ~.~
當然Accuracy也不是不能用,和正樣本佔比放在一起比較也是能看出來一些資訊的。但Accuracy確實更適用正負樣本55開,且預測不止針對正樣本的情況。
Accuracy知道咋算就可以啦,在解決實際問題的時候,往往會使用更有指向性的指標, 而且一般都會同時選用2個以上的指標因為不同指標之間往往都有trade-off
當目標是對正樣本進行準確預測 - precision, recall, F1
precision從預測的角度衡量預測為正的準確率,recall從真實分佈的角度衡量預測為正的準確率。precision和recall存在trade-off, 想要挑選出更多的正樣本,就要承擔預測為正準確率下降的風險。例如在飛機過安檢時,想要保證危險物品基本都被識別出來,就肯定要承擔一定的誤判率。不過在這種情境下查不出危險物品顯然比讓誤判乘客多開包檢查一遍要重要的多。
\[ \begin{align} precision &= \frac{TP}{TP+FP} \\ recall &= \frac{TP}{TP+FN} \end{align} \]
既然有trade-off,一般就會用可以綜合兩個指標的複合指標 - F1 Score
\[
F1 =\frac{1}{\frac{1}{precision} + \frac{1}{recall}}= \frac{precision * recall}{precision + recall}
\]
其實簡單一點直接對precision,recall求平均也可以作為複合指標,但F1用了先取倒數再求平均的方式來避免precision或recall等於0這種極端情況的出現
當目標是對真實分佈進行準確預測 - sensitivity(recall), specifity, fpr
sensitivity, sepcifity都從真實分佈的角度,分別衡量正/負樣本預測的準確率。這一對搭配最常在醫學檢驗中出現,衡量實際生病/沒生病的人分別被正確檢驗的概率。正確檢驗出一個人有病很重要,同時正確排除一個人沒生病也很重要。
\[ \begin{align} sensitivity &= recall \\ specifity & =\frac{TN}{TN + FP} \\ \end{align} \]
如果specifity對很多人來說很陌生的話,它兄弟很多人一定知道fpr。fpr和recall(tpr)一起構成了ROC曲線。這一對的tradeoff同樣用醫學檢驗的邏輯來解釋就是,醫生既不希望遺漏病人的病情(recall),要不希望把本身沒病的人嚇出病來(fpr)。
\[
fpr = \frac{FP}{TN+FP} = 1- specifity
\]
和閾值相關經常用到的指標差不多就是這些。這些指標的計算依賴於閾值的確定,所以在應用中往往用驗證集來找出使F1/accuracy最大的閾值,然後應用於測試集,再用測試集的F1/accuracy來評價模型表現。下面是幾個應用上述指標的kaggle比賽
- F1 score
https://www.kaggle.com/c/quora-insincere-questions-classification/overview/evaluation - accuracy
https://www.kaggle.com/c/titanic/overview/evaluation
不過開始用到和閾值相關的評價指標有時是在模型已經確定以後。第一步在確定模型時,往往還是需要一些可以綜合衡量模型整體表現的指標。簡單!粗暴!別整啥曲線閾值的,你給我個數就完了!
綜合評價指標
綜合評價指標基本都是對上述指標再加工的產物。對應的kaggle比賽會持續更新。
tpr(recall) + fpr = ROC-> AUC
隨著閾值從1下降到0,我們預測為正的樣本會逐漸變多,被正確篩選出的正樣本會逐漸增多,但同時負樣本被誤判為正的概率也會逐漸上升。
整個遍歷閾值的過程可以用ROC曲線來表示,橫軸是誤判率(fpr),縱軸是準確率(tpr/recall/sensitivity)。但是給你兩個分類器想要直接比較誰的ROC曲線會有點困難,所以我們用一個scaler來描述ROC曲線就是AUC - Area under curve。 ROC曲線下的面積越大越接近完美的分類器,而對角線50%是隨機猜正負就可以得到的AUC。
Kaggle連結 https://www.kaggle.com/c/santander-customer-transaction-prediction/overview/evaluation
AUC 適用於正負樣本相對balance的情況,且分類問題對模型預測概率的準確度沒有要求的情況。詳見【實戰篇】
precision + recall = AUCPR(AP)
和上述ROC-AUC的思路相同。隨著閾值從1下降到0,預測為正的樣本變多,被正確篩選出的正樣本增多,但同時預測為正的準確率會下降。
這樣我們得到PR曲線,以及曲線下的面積AUCPR。有時AUCPR也被稱作AP,就是對所有recall取值對應的precision求平均。第一眼看上去我也被糊弄了,一直當成兩個概念來記。但是式子一寫出來,媽呀這倆不是一個東西麼。
\[
AUCPR = \sum_1^K\Delta{r(k)} * p(k) = \int_o^1 {p(r) dr} = AP
\]
AP 剛好彌補AUC曲線的不足,適用於正負樣本imbalance的情況,或者我們更關心模型在正樣本上表現的情況。但AP同樣不能保證模型預測概率的準確率。詳見【實戰篇】
cross-entropy loss
cross-entropy放在這裡會有點奇怪,因為本質上它是和這裡其他所有指標都不同的存在。其他的評價指標評價的是0/1的分類效果,或者更準確說是對排序效果(根據閾值把預測值從大到小分成0/1兩半)進行評價。但是cross-entropy是直接對預測概率是否擬合真實概率進行評價。
\[
L = -\sum_{i=1}^N y_i * log p_i + (1-y_i) * log(1-p_i)
\]
kaggle連結 https://www.kaggle.com/c/statoil-iceberg-classifier-challenge/overview/evaluation
cross-entropy彌補了AP和AUC的不足。如果分類目標其實是獲得對真實概率的估計的話,使用cross-entropy應該是你的選擇。詳見【實戰篇】
*Mean F1 Score
kaggle連結 https://www.kaggle.com/c/instacart-market-basket-analysis/overview/evaluation
第一次見到這個指標是在Instacart的kaggle比賽裡面。這裡的mean不是指的對所有閾值下的F1求平均值而是對每個order_id的多個product_id求F1,再對所有order_id的F1求平均,有點繞...
之所以把這個評價指標也放在這裡是因為這個特殊的評價方法會對你如何split訓練集/測試集,以及如何選定最優的閾值產生影響。有興趣的可以來試一試,反正我覺得自己是把能踩的坑都踩了一個遍,歡迎大家一起來踩坑 >_<
Reference
- Alaa Tharwat,Classification assessment methods,Applied Computing and Informatics
- Nan Ye,Kian Ming A. Chai,Wee Sun Lee,Hai Leong Chieu,Optimizing F-Measures: A Tale of Two Approaches,
- https://en.wikipedia.org/wiki/Confusion_matrix