Macro-F1 Score與Micro-F1 Score

數據

假設有如下的數據

可以看出,上表為一份樣本量為9,類別數為3的含標註結果的三分類預測樣本。

F1 score

F1 = 2	imes frac{precision	imes recall}{precision + recall}

下面計算各個類別的准召:

對於類別A:

precision = 2/(2+0) = 100%

recall = 2/(2+2) = 50%

對於類別B:

precision = 2/(2+2) = 50%

recall = 2/(2+1) = 67%

對於類別C:

precision= 1/(1+2) = 33%

recall = 1/(1+1) = 50%

TN對於准召的計算而言是不需要的,因此上面的表格中未統計該值。

下面調用sklearn的api進行驗證:

from sklearn.metrics import classification_report
print(classification_report([0,0,0,0,1,1,1,2,2], [0,0,1,2,1,1,2,1,2]))
precision recall f1-score support
?
0 1.00 0.50 0.67 4
1 0.50 0.67 0.57 3
2 0.33 0.50 0.40 2
?
avg / total 0.69 0.56 0.58 9

可以看出,各個類別的准召計算完全一致。

Micro F1

micro f1不需要區分類別,直接使用總體樣本的准召計算f1 score。

該樣本的混淆矩陣如下:

precision = 5/(5+4) = 0.5556

recall = 5/(5+4) = 0.5556

F1 = 2 * (0.5556 * 0.5556)/(0.5556 + 0.5556) = 0.5556

下面調用sklearn的api進行驗證

from sklearn.metrics import f1_score
f1_score([0,0,0,0,1,1,1,2,2], [0,0,1,2,1,1,2,1,2],average="micro")
0.5555555555555556

可以看出,計算結果也是一致的(保留精度問題)。

Macro F1

不同於micro f1,macro f1需要先計算出每一個類別的准召及其f1 score,然後通過求均值得到在整個樣本上的f1 score。

類別A的?:

F1_{A} = 2	imes frac{1	imes 0.5}{1+0.5} = 0.6667

類別B的?:

F1_{B} = 2	imes frac{0.5	imes 0.67}{0.5 + 0.67} = 0.57265

類別C的?:

F1_{C} = 2	imes frac{0.33	imes 0.5}{0.33 + 0.5} = 0.39759

整體的f1為上面三者的平均值:

F1 = (0.6667 + 0.57265 + 0.39759)/3 = 0.546

調用sklearn的api進行驗證:

from sklearn.metrics import f1_score
f1_score([0,0,0,0,1,1,1,2,2], [0,0,1,2,1,1,2,1,2],average="macro")
0.546031746031746

可見,計算結果是一致的。


推薦閱讀:

【機器學習】入門第一步
機器學習之決策樹(C4.5演算法)
機器學習 Python scikit-learn 中文文檔 (1)
機器學習之機器學習代碼編寫流程
機器學習 Python scikit-learn 中文文檔(6)監督學習: 從高維觀測中預測輸出變數

TAG:sklearn | 混淆矩陣 |