概念
對于準確率與召回率的概念,雖然有很多文章介紹了,但是很多人還是不容易形成直覺的理解。這里不談公式,結合一個通俗的例子,幫助大家理解。
例子:有100個人,1人患有癌癥。我們對其進行預測,然后再計算每種預測的準確率與召回率。
準確率與召回率是相對于正樣本來說的,也就是要先定義什么是正。我們這里將“有癌癥”定義為正,那么沒有癌癥就是負。
他們還有另一對名字,更直觀也更容易理解:
- 準確率也叫查準率。只管所預測為正的情況下,有多準確。
- 召回率也較查全率。只管真實為正的樣本中,你找出了幾個。
預測情況 | 準確率/查準率 | 召回率/查全率 |
---|---|---|
將100人全部預測為有癌癥 | 1% (預測100個為正,結果只有1個是對的) | 100%(真實結果中有1個正贗本,被找出來了) |
將100人全部預測為沒有癌癥 | 未定義 | 0% (沒有找出任何真實的正樣本) |
預測了2個有癌癥,其中有一個是正確的 | 50% (2個中有一半正確) | 100% (全部找出了真實的正樣本) |
全部預測正確 | 100% | 100% |
全部預測錯誤 | 0% | 0% |
動態調整模型的準確率與召回率
有什么用?
在不同的任務中,可能對準確率與召回率有不同的要求。本篇文章要討論的問題是在模型已經訓練完成后,如果在不重新訓練模型的情況下,調整其預測的準確率與召回率。也就是說,將一個模型發布后,不同的使用者可以使用同一個模型去完整不同的任務。
二分類
在二分類任務中,模型輸出一般為0到1之間的一個數值,記為,如果大于0.5,我們預測為正,否則為負。這里的0.5代表一個閾值,記為
,則分類標準如下:
要調整準確率與召回率,直接調整s就行了。增大s,準確率上升,召回率下降;減少s,準確率下降,召回率上升。
如何理解?
模型的輸出可以代表信心(也就是模型預測樣本為正的確信程度)。閾值
增加,則表示需要更大的信心才會預測為正,這時準確率必然增加;同時,閾值的增加導致所預測正樣本的減少,找出正樣本的可能性就會降低,從而導致召回率的下降。
多分類
在多分類任務中,模型會輸出一個Category分布,比如3分類,一個可能的輸出是[0.1, 0.2, 0.7]。在深度學習模型中,我們一般使用一個softmax函數來生成中的分布。記前一層的輸出為, 最終的輸出為
, 則:
要調整類別1所對應的準確率召回率,我們直接調整就行了(增加/減少一個值)。增加
,類別1的的召回率增加,準確率下降;同時,類別2、類別3的召回率下降,準確率增加。
如何理解?
增加,類別1所對應的概率會增加,其它類別的概率則會降低。人為提升概率,會導致其預測正樣本的概率增加,從而導致召回率的上升,其它類別的情況則相反。
序列標注
在NLP中,分詞、詞性、NER都被轉化為序列標注任務進行處理。序列標注任務也就是序列分類任務。學會了分類任務準確率召回率調整方法,調整序列標注任務也就不難了。以NER任務為例:
標簽 | 成 | 都 | ... |
---|---|---|---|
O | |||
B-LOC | |||
I-LOC | |||
... | ... | ... |
現在主流的序列標注模型是BI-LSTM-CRF、BERT-CRF等,都是先使用一個神經網絡計算每個字每個類別的分數,然后再通過CRF層進行調整。我們可以通過調整進入CRF之前的分數,從而達到調整準確率與召回率的目的。(BI-LSTM-CRF和CRF的PyTorch通用實現可以參考開源庫bi-lstm-crf)
在上面的表格種,每一列對應一個字的多分類的分數,這些分數的范圍沒有經過歸一化,范圍是整個,但是調整的方法還是一樣的,直接修改這些分數就行了。
比如通過增加"O"標簽對應的分數,"O"標簽對應的最終概率就會提升,跟實體相關的標簽(B-LOC, I-LOC, ...)的概率則會下降,這樣NER的召回率就會下降,準確率則會上升。
如果確定調整的數值?
通過實驗法,拿一個帶標注的數據集作為測試集,使用不同的調整數值,跑完整個測試集上,并計算準確率與召回率。這樣就會得到2根曲線,一條對應準確率、一條對應召回率,橫坐標對應不同的調整數值。然后根據需要選擇對應的調整數值即可。