背景
之前文章講了如果用 tensorflow 訓練模型之後,如果對模型體積有要求,或者希望優化模型網絡結構的時候,我們會調整模型的一些網絡結構。但是如果證明調整後的網絡結構與之前的網絡結構相比的優劣性呢。
最簡單的,我們一般會跑一個準确率,那麼除了這個準确率之外還有其他的名額能證明模型的優劣嗎,這篇文章給大家講下評估分類模型優劣的其他幾個名額。
名稱解釋
舉個例子,假設一個二分類模型,模型的作用是用來區分一堆資料中真的資料和假的資料。
假設一共有 22 個資料,22 個資料中真資料有 12 個,假資料有 10 個。而分類模型認為其中 8 個資料是真的,當然,這 8 個資料中有 5 個是真的,而另外 3 個是假的,卻被模型錯誤的認為是真的。如下圖所示:

那讓我們定義以下概念:
TP = 5
FP = 3
TN = 7
FN = 7
真正率、真陽率、靈敏度
真正率(true positive rate, TPR),真陽率,靈敏度(sensitivity),指的是被模型預測的正樣本的比例:
TPR = TP / (TP + FN)
在例子中指的是 5/12
這個比例高适合于那些需要“甯可錯殺一千,不可放過一個”的模型,比如地震預測,地震預測錯多次也沒關系,重要的是真的發生地震的時候一定要預測出來。
真負率、特異度
真負率(true negative rate, TNR),特異度(specificity),指的是被模型正确預測的負樣本的比例:
TNR = TN / (TN + FP)
在例子中是 7/10
這個比例高适合于那些需要“不能冤枉一個好人”的業務模型,比如預測一些人是否罪犯,甯可放過一些罪犯,也不能冤枉一個好人。
假正率、假陽率
假正率(false positive rate, FPR),假陽率,指的是被模型錯誤預測的正樣本比例:
FPR = FP / (TN + FP)
在例子中指的是 3/10
假負率
假負率(false negative rete, FNT),指的是被模型錯誤預測的負樣本的比例:
FNR = FN / (TP + FN)
在例子中指的是 7/12
精确度、精度、查準率
精度(precision)指的是模型查出來的所有資料中,有多少是準的。
p = TP / (TP + FP)
在例子中指的是 5/8
召回率、查全率、真正率、真陽率、靈敏度
召回率(recall)指的是所有對的資料中,有多少能被模型查出來。但其實召回率就是前面提到的真陽率。
r = TP / (TP + FN)
F1
F1分數(F1 Score),又被稱為平衡F分數(balanced F Score),是一個兼顧精确率和召回率的調和平均數。定義如下:
但如果你的模型對精确率和召回率考慮的權重不一樣時,可以定義 F-β 分數如下:
當 β 為 1 是,召回率和精确率的權重一樣,也就是 F-1 分數。當 β 大于 1 時,召回率的權重高于精确率,如 F-2 分數。當 β 小于 1 時,精确率的權重高于召回率,如 F-0.5 分數。
ROC
ROC全稱受試者工作特征曲線(receiver operating characteristic curve),又稱為感受性曲線(sensitivity curve)。繪制方式是以假陽率(FPR)為橫坐标,以真陽率為(TPR)為縱坐标,對于模型輸出的特征值,以不同的門檻值進行劃分,得到曲線。
舉個簡單的例子:
假設 5 個資料點,模型輸出的特征值分别是
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
其中前 5 個資料點為負,後 5 個資料點為正,也就是說,10 個資料的标簽時如下形式
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
那麼,當我的門檻值分别取以下值的時候
[1. 0.9 0.8 0.7 0.6 0.5 0.4 0.3 0.2 0.1]
假陽率和真陽率分别是以下值
假陽率:[0. 0. 0. 0. 0. 0.2 0.4 0.6 0.8 1. ]
真陽率:[0.2 0.4 0.6 0.8 1. 1. 1. 1. 1. 1. ]
按照 ROC 的定義,得到的曲線如圖
在 ROC 曲線中,左上角的點代表取這個門檻值的時候,假陽率最低,真陽率最高,是最佳門檻值,上圖中的最佳門檻值是 0.6。
AUC
AUC(Area Under Curve)被定義為 ROC 曲線下的面積,顧名思義。這個值存在的意義是開發者希望用一個定量的數字來表示模型的性能。
由上圖可知,AUC 的取值範圍在 0 到 1 ,越大越好。但 AUC 小于 0.5 的模型我們認為是沒有意義的,分類效果太差。
上圖中的 AUC 是 1。
PRC
PRC(Precision Recall Curve),精度召回率曲線,以召回率(查全率)為橫坐标,精度(查準率)為縱坐标,和 RPC 類似,對于模型輸出的特征值,以不同的門檻值進行劃分,得到曲線。
還是上面那個例子,5 個資料點,模型輸出的特征值分别是
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0]
[0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
[0.6 0.7 0.8 0.9 1]
查全率(召回率):[1. 0.8 0.6 0.4 0.2 0. ]
查準率(精度):[1. 1. 1. 1. 1. 1.]
繪制的曲線如圖
在 PRC 曲線中,最右上角的點,查全率和查準率都最高,也就是最佳門檻值,在這個例子中,是 0.6(在這個例子中 ROC 曲線和 PRC 曲線得到的最佳門檻值是同一個數,但并不總是這樣)。
損失函數曲線
損失函數曲線(Loss Curve),是以訓練次數為橫軸,以當次的損失率為縱軸繪制的曲線。
損失函數
關于損失函數的定義可以參考其他機器學習教程,這裡就不細說了,簡單來說,是如下定義:
這裡的 X,Y 并不是變量,而是常量,指的是 n 個樣本及 n 個樣本的标簽值。損失函數是一個關于 f(x) 中參數的公式。
每次訓練後,在訓練集和交叉驗證集(或測試集)上分别跑下損失函數的值,大概是一個如下的曲線:
這個曲線可以顯示欠拟合和過拟合的程度,從上面曲線可以看出來,在訓練集上,損失函數值是逐漸趨于0的,而在驗證集上損失函數在下降一段時間後開始上升,這說明出現了過拟合。
MNIST 問題中的 Loss 曲線
可以看出一直沒有出現過拟合的情況
ROC和PRC曲線比較
ROC 曲線有個很好的特性:當測試集中的正負樣本的分布變化的時候,ROC 曲線能夠保持不變。在實際的資料集中經常會出現類不平衡(class imbalance)現象,即負樣本比正樣本多很多(或者相反),而且測試資料中的正負樣本的分布也可能随着時間變化。下圖是 ROC 曲線和 Precision-Recall 曲線的對比:
在上圖中,(a) 和 (c) 為ROC曲線,(b) 和 (d) 為Precision-Recall曲線。(a) 和 (b) 展示的是分類其在原始測試集(正負樣本分布平衡)的結果,(c) 和 (d) 是将測試集中負樣本的數量增加到原來的 10 倍後,分類器的結果。可以明顯的看出,ROC 曲線基本保持原貌,而 Precision-Recall 曲線則變化較大。
也就是 PRC 曲線會面臨一個問題,當需要獲得更高 recall 時,model 需要輸出更多的樣本,precision 可能會伴随出現下降/不變/升高,得到的曲線會出現浮動差異(出現鋸齒),無法像 ROC 一樣保證單調性。
結論:AUC 用得比較多的一個重要原因是,實際環境中正負樣本極不均衡,PR 曲線無法很好反映出分類器性能,而 ROC 受此影響小。
總結
以上各個名額都不能全面的覆寫分類器的各種性能,在實際應用中,應該合理的組合使用以上名額來判斷分類器的效果。