sklearn.metrics.f1_score中micro、macro、samples理解

ZLBryant發表於2020-10-23

前言

micro_f1、macro_f1、example_f1等指標在多標籤場景下經常使用,sklearn中也進行了實現,在函式f1_score中通過對average設定"micro"、“macro”、"samples"便可進行上述指標的計算。關於micro_f1、macro_f1網上有很多資料,但example_f1相關資料較少,為此對sklearn.metrics中_classification.py進行了解讀,對上述三種指標的計算過程進行簡單總結。
可以直接看總結部分,如果能理解的話(主要個人表達能力確實比較差)就可以不看具體的計算過程。
設多標籤預測結果為(這裡為三個樣本、六個標籤)

[
[0,1,1,0,0,0],
[1,1,1,0,0,0],
[1,1,0,0,0,1]
]

實際標籤為

[
[1,0,0,0,0,0],
[0,1,1,0,0,0],
[0,0,1,1,0,0]
]

micro(micro_f1)

首先獲取每個標籤的混淆矩陣(混淆矩陣可參照這篇部落格進行學習https://blog.csdn.net/vesper305/article/details/44927047),結果如下(每個二維列表對應一個標籤的混淆矩陣):

[
[[0,2], [1,0]],
[[0,2], [0,1]],
[[0,1], [1,1]],
[[2,0], [1,0]],
[[3,0], [0,0]],
[[2,1], [0,0]]
]

根據混淆矩陣獲取各標籤上true positive的個數:tp_sum = [0,1,1,0,0,0],獲取真實標籤在各標籤上正樣本的個數:true_sum = [1,1,2,1,0,0],獲取預測結果在各標籤上正樣本的個數:pred_sum = [2,3,2,0,0,1]。
對tp_sum、true_sum、pred_sum分別求和獲取tp_sum = [2]、true_sum = [5]、pred_sum = [8],計算precision為0.25,recall為0.4,所以micro_f1 = 2 ∗ p r e c i s i o n ∗ r e c a l l p r e c i s i o n + r e c a l l = 0.3077 \frac {2*precision*recall}{precision+recall}=0.3077 precision+recall2precisionrecall=0.3077

macro(macro_f1)

macro與micro前一部分一樣,得到tp_num、true_num、pred_num,然後在每個標籤上計算precision=[0,0.3333,0.5,0,0,0],recall=[0,1,0.5,0,0,0],接著在每個標籤上計算f1_score=[0,0.5,0.5,0,0,0],最後將三者平均得到最終的precision=0.1389,recall=0.25,f1_score=0.1667,此時的f1_score就是macro_f1。

samples(example_f1)

首先獲取每個樣本的混淆矩陣

[
[[3,2], [1,0]],
[[3,1], [0,2]],
[[1,3], [2,0]]
]

根據混淆矩陣獲取各樣本上true positive的個數:tp_sum = [0,2,0],獲取真實標籤在各樣本上為正的個數:true_sum = [1,2,2],獲取預測結果在各樣本上為正的個數:pred_sum = [2,3,3]。
然後在每個樣本上計算precision=[0,0.6667,0],recall=[0,1,0],接著在每個樣本上計算f1_score=[0,0.8,0],最後將三者平均得到最終的precision=0.2222,recall=0.3333,f1_score=0.2667,此時的f1_score就是example_f1。

總結

總體來說micro_f1統計整體的true positive情況,計算整體的precision和recall,然後得到f1_score,此時的f1_score就是micro_f1;macro_f1統計每個標籤的true positive情況,計算每個標籤的的precision和recall,然後得到每個標籤的f1_score,對每個標籤的f1_score進行平均,此時的f1_score就是macro_f1;example_f1統計每個樣本的true positive情況,計算每個樣本的的precision和recall,然後得到每個樣本的f1_score,對每個樣本的f1_score進行平均,此時的f1_score就是example_f1。

相關文章