在解決分類問題的時候,能夠選擇的評價指標簡直不要太多。但基本能夠分紅兩2大類,咱們今分別來講道說道測試
在說指標以前,咱先把分類問題中會遇到的全部狀況簡單過一遍。36度的北京讓咱們舉個涼快一點的例子-咱們預測會不會下雨!橫軸是預測機率從0-1,紅色的部分是沒下雨的日子(負樣本),藍色的部分是下雨的日子(正樣本)。在真實狀況下咱們很難找到能對正負樣本進行完美分割的分類器,因此咱們看到在預測機率靠中間的部分,正負樣本存在重合,也就是無論咱們閾值卡在哪裏都會存在被錯誤預測的樣本。lua
上述分佈中的四種狀況,能夠簡單的用confusion matrix來歸納spa
TP:預測爲正&真實爲正
FP:預測爲正&真實爲負
TN:預測爲負&真實爲負
FN:預測爲負&真實爲正3d
分類模型輸出的是每一個樣本爲正的機率,咱們要先把機率轉換成0/1預測。給定一個閾值,咱們把預測機率大於閾值的樣本預測爲正,小於的爲負。這時就會出現上述confustion matrix裏面的四種狀況。那咱們該如何去評價模型表現呢?orm
這應該是大多數人第一個知道的評價指標,它把正負樣本混在一塊兒去評價總體的分類準確率。blog
\[Accuracy = \frac{TP + TN}{TP + TN + FN + FP}\]排序
老手會用一個在全部tutorial裏面都能看到的Imbalance Sample的例子來告訴你,若是你的正樣本只有1%,那所有預測爲負你的準確率就是99%啦 - so simple and naive ~.~ip
固然Accuracy也不是不能用,和正樣本佔比放在一塊兒比較也是能看出來一些信息的。但Accuracy確實更適用正負樣本55開,且預測不止針對正樣本的狀況。ci
Accuracy知道咋算就能夠啦,在解決實際問題的時候,每每會使用更有指向性的指標, 並且通常都會同時選用2個以上的指標由於不一樣指標之間每每都有trade-offget
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, 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比賽
不過開始用到和閾值相關的評價指標有時是在模型已經肯定之後。第一步在肯定模型時,每每仍是須要一些能夠綜合衡量模型總體表現的指標。簡單!粗暴!別整啥曲線閾值的,你給我個數就完了!
綜合評價指標基本都是對上述指標再加工的產物。對應的kaggle比賽會持續更新。
隨着閾值從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的狀況,且分類問題對模型預測機率的準確度沒有要求的狀況。詳見【實戰篇】
和上述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放在這裏會有點奇怪,由於本質上它是和這裏其餘全部指標都不一樣的存在。其餘的評價指標評價的是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應該是你的選擇。詳見【實戰篇】
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