[筆記] macro, micro 與 binary 不同版本的 acc., precision, recall, fscore 計算方法

tags: AI/ML

使用套件:
https://scikit-learn.org/stable/modules/generated/sklearn.metrics.precision_recall_fscore_support.html
這篇舉例說明頗清楚:
https://blog.csdn.net/jmh1996/article/details/114935105

我也來舉個例子:

Notations

  • gt: ground truth
  • pred: predict result
  • 檢測陽性,正樣本 + : label 為 1
  • 檢測陰性,負樣本 - : label 為 0

看表格解釋

d1 d2 d3 d4 d5 d6 d7 d8 d9 d10
gt 0 0 0 1 1 0 0 0 0 1
pred 0 1 0 1 0 0 0 1 0 1
對於+ TN FP TN TP FN TN TN FP TN TP
對於- TP FN TP TN FP TP TP FN TP TN

統計一下
對於+ 當中 \(TP: 2, FP: 2, TN: 5, FN: 1\)
對於- 當中 \(TP:5, FP:1, TN:2, FN:2\)
根據定義
\[precision=\frac{TP}{TP+FP} \hspace{0.5cm} recall=\frac{TP}{TP+TN}\]
\[F1\_score=2\frac{precision\times recall}{precision+recall}\]

binary avg. of precision, recall

在 sklearn.metrics 的 precision_recall_fscore_support 裡所謂的 binary average 模式
就是只看對於+(陽性樣本)的 precision, recall, fscore 值
計算出來得到
\[bin\_precision(+)=\frac{2}{2+2}=0.5 \hspace{0.5cm} bin\_recall(+)=\frac{2}{2+1}=0.6666\]

F1 值為這兩個的平均,在此就不贅述

macro avg. of precision, recall

macro 就是把對於正樣本(+) 的結果與對於負樣本(-) 的結果分別算出來後,做平均
正樣本的結果已經在上一段落算完,因此我們還需要計算
對於-(陰性樣本)的precision, recall, fscore 值計算如下
\[bin\_precision(-)=\frac{5}{5+1}=0.8333 \hspace{0.5cm} bin\_recall(-)=\frac{5}{5+2}=0.7142\]
接著就可以計算 macro average 版本的 precision, recall, fscroe 值計算如下
\[macro\_precision=\frac{0.5+0.8333}{2}=0.6666 \hspace{0.5cm} macro\_recall=\frac{0.6666+0.7142}{2}=0.6904\]

micro avg. of precision, recall

micro avg 是把上述的

  • 對於+ 當中 \(TP: 2, FP: 2, TN: 5, FN: 1\)
  • 對於- 當中 \(TP:5, FP:1, TN:2, FN:2\)

把以上兩個分類觀點觀察到的 TP, FP, TN, FN 都做加總之後再做計算:
\(sum\_TP:2+5=7\) , \(sum\_FP:2+1=3\) , \(sum\_TN:5+2=7\) , \(sum\_FN:2+1=3\)

再根據定義計算出 micro average 版本的 precision, recall, fscore 值計算如下
\[micro\_precision=\frac{7}{7+3}=0.7 \hspace{0.5cm} micro\_recall=\frac{7}{7+3}=0.7\]

報告完畢

Select a repo