(原創)sklearn中 F1-micro 與 F1-macro區別和計算原理


       最近在使用sklearn做分類時候,用到metrics中的評價函數,其中有一個非常重要的評價函數是F1值,(關於這個值的原理自行google或者百度)

       在sklearn中的計算F1的函數為 f1_score ,其中有一個參數average用來控制F1的計算方式,今天我們就說說當參數取micromacro時候的區別

 

1、F1公式描述:

  F1-score:    2*(P*R)/(P+R)


 

                准確率(P): TP/ (TP+FP) 
                召回率(R): TP(TP + FN)
 
對於數據測試結果有下面4種情況:
真陽性(TP): 預測為正, 實際也為正
假陽性(FP): 預測為正, 實際為負
假陰性(FN): 預測為負,實際為正
真陰性(TN): 預測為負, 實際也為負

2、 f1_score中關於參數average的用法描述:

'micro':Calculate metrics globally by counting the total true positives, false negatives and false positives.

'micro':通過先計算總體的TP,FN和FP的數量,再計算F1

'macro':Calculate metrics for each label, and find their unweighted mean. This does not take label imbalance into account.

'macro':分布計算每個類別的F1,然后做平均(各類別F1的權重相同)

3、初步理解

通過參數用法描述,想必大家從字面層次也能理解他是什么意思,micro就是先計算所有的TP,FN , FP的個數后,然后再利上文提到公式計算出F1

macro其實就是先計算出每個類別的F1值,然后去平均,比如下面多分類問題,總共有1,2,3,4這4個類別,我們可以先算出1的F1,2的F1,3的F1,4的F1,然后再取平均(F1+F2+F3+4)/4

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

4、進一步理解

  我們還是以上面的例子為例說明sklearn中是如何計算micro 和 macro的:


 

  micro計算原理

  首先計算總TP值,這個很好就算,就是數一數上面有多少個類別被正確分類,比如1這個類別有3個分正確,2有2個,3有2個,4有1個,那TP=3+2+2+1=8

       其次計算總FP值,簡單的說就是不屬於某一個類別的元數被分到這個類別的數量,比如上面不屬於4類的元素被分到4的有1個

    如果還比較迷糊,我們在計算時候可以把4保留,其他全改成0,就可以更加清楚地看出4類別下面的FP數量了,其實這個原理就是 One-vs-All (OvA),把4看成正類,其他看出負類

            

同理我們可以再計算FN的數量

  1類 2類 3類 4類 總數
TP 3 2 2 1 8
FP 0 0 3 1 4
FN 2 2 1 1 6

     所以micro的 精確度P 為 TP/(TP+FP)=8/(8+4)=0.666    召回率R TP/(TP+FN)=8/(8+6)=0.571   所以F1-micro的值為:0.6153

 

     可以用sklearn來核對,把average設置成micro

y_true = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4]
y_pred = [1, 1, 1, 0, 0, 2, 2, 3, 3, 3, 4, 3, 4, 3]
print(f1_score(y_true,y_pred,labels=[1,2,3,4],average='micro'))
#>>> 0.615384615385

 


 

計算macro

     macro先要計算每一個類的F1,有了上面那個表,計算各個類的F1就很容易了,比如1類,它的精確率P=3/(3+0)=1  召回率R=3/(3+2)=0.6  F1=2*(1*0.5)/1.5=0.75

     可以sklearn,來計算核對,把average設置成macro

#average=None,取出每一類的P,R,F1值
p_class, r_class, f_class, support_micro=precision_recall_fscore_support(y_true=y_true, y_pred=y_pred, labels=[1, 2, 3, 4], average=None) print('各類單獨F1:',f_class) print('各類F1取平均:',f_class.mean()) print(f1_score(y_true,y_pred,labels=[1,2,3,4],average='macro')) #>>>各類單獨F1: [ 0.75 0.66666667 0.5 0.5 ] #>>>各類F1取平均: 0.604166666667 #>>>0.604166666667

 如有裝載,請注明出處,謝謝


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM