分類模型的F1-score、Precision和Recall 計算過程

胖墩哥發表於2020-08-03

分類模型的F1分值、Precision和Recall 計算過程

引入

通常,我們在評價classifier的效能時使用的是accuracy

考慮在多類分類的背景下

accuracy = (分類正確的樣本個數) / (分類的所有樣本個數)

這樣做其實看上去也挺不錯的,不過可能會出現一個很嚴重的問題:例如某一個不透明的袋子裡面裝了1000臺手機,其中有600臺iphone6, 300臺galaxy s6, 50臺華為mate7,50臺mx4(當然,這些資訊分類器是不知道的。。。)。如果分類器只是簡單的把所有的手機都預測為iphone6, 那麼通過上面的公式計算的準確率accuracy為0.6,看起來還不錯;可是三星,華為和小米的全部預測錯了。如果再給一個袋子,裡面裝著600臺galaxy s6, 300臺mx4, 50臺華為mate7,50臺iphone,那這個分類器立馬就爆炸了,連回家帶孩子的要求都達不到

所以,僅僅用accuracy來衡量一個分類器的效能是很不科學的。因此要引入其他的衡量標準。

二分類

是不是經常看見如下類似的圖?這是二分類的圖,假設只有正類和負類,True和False分別表示對和錯;Positive和Negative分別表示預測為正類和負類。

那麼

  • TP:預測為Positive並且對了(樣本為正類且預測為正類)
  • TN:預測為Negative並且對了(樣本為負類且預測為負類)
  • FP:預測為Positive但錯了(樣本為負類但預測為正類)
  • FN:預測為Negative但錯了(樣本為正類但預測為負類)
  • TP+FP:預測為Positive並且對了+預測為Positive但錯了=預測為Positive的樣本總數
  • TP+FN:預測為Positive並且對了+預測為Negative但錯了=實際為Positive的樣本總數

所以precision就表示:被正確預測的Positive樣本 / 被預測為Positive的樣本總數

同理,recall就表示:被正確預測的Positive樣本 / 實際為Positive的樣本總數

F1是調和平均值,精準率和召回率只要有一個比較小的話,F1的值也會被拉下來:

多分類情況

其實和二分類情況很類似,例子如下 這個是Micro , 和二分類類似 (將例子中的precision和recall代入到F1公式中,得到的就是Micro下的F1值)

而Macro情況下計算F1需要先計算出每個類別的F1值,然後求平均值。如下

Macro情況下上述例子的計算

sklearn計算程式(macro)

下面是使用sklearn直接計算多類別F1/P/R的程式,將介面中的average引數配置為’macro’即可。

from sklearn.metrics import f1_score, precision_score, recall_score

y_true=[1,2,3]
y_pred=[1,1,3]

f1 = f1_score( y_true, y_pred, average='macro' )
p = precision_score(y_true, y_pred, average='macro')
r = recall_score(y_true, y_pred, average='macro')

print(f1, p, r)
# output: 0.555555555556 0.5 0.666666666667

參考連結:

https://blog.csdn.net/ybdesire/article/details/96507733

https://www.jianshu.com/p/14b26f59040b

相關文章