2011-11-27 70 views
3

我正在做多類分類,並且分類不均衡。F1比Scikit-learn中的精度和召回率都要小。

我注意到f1總是小於精度和召回的直接調和平均值,並且在某些情況下,f1甚至比精度和召回率都小。

FYI,我叫metrics.precision_score(y,pred)爲精度等。

我意識到微觀/宏觀平均值的差異,並且通過使用precision_recall_fscore_support()的類別結果測試它們不是微觀的。

不確定是由於使用了宏均值還是其他一些原因?


如下更新詳細結果:

N_SAMPLES次:75,n_features:250

MultinomialNB(阿爾法= 0.01,fit_prior =真)

2倍CV:

第一輪:

F1:  0.706029106029 
Precision: 0.731531531532 
Recall: 0.702702702703 

     precision recall f1-score support 

     0  0.44  0.67  0.53   6 
     1  0.80  0.50  0.62   8 
     2  0.78  0.78  0.78  23 

avg/total  0.73  0.70  0.71  37 

第二次運行:

F1:  0.787944219523 
Precision: 0.841165413534 
Recall: 0.815789473684 

     precision recall f1-score support 

     0  1.00  0.29  0.44   7 
     1  0.75  0.86  0.80   7 
     2  0.82  0.96  0.88  24 

avg/total  0.84  0.82  0.79  38 

總評:

Overall f1-score: 0.74699 (+/- 0.02) 
Overall precision: 0.78635 (+/- 0.03) 
Overall recall:  0.75925 (+/- 0.03) 
關於微/宏平均

定義從Scholarpedia

在多標籤分類,最簡單的方法計算一個 聚集門類分數是平均得分的所有 二元任務。結果得分稱爲宏觀平均召回率,精度,F1等。另一種平均方法是首先在所有類別上總結TP,FP, TN,FN和N,然後計算上述度量中的每一個。結果得分被稱爲微觀平均。 宏均值給每個類別賦予相同的權重,並且通常是由系統在稀有類別(大多數爲 )上的性能支配的冪律分佈類型。微平均給每個文檔一個相同的權重,並且通常由大多數常見類別上的系統性能決定 。


它是在Github上的電流open issue,#83。


以下例子說明如何微,宏和加權(在當前Scikit學習)平均可以不同:

y = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2] 
pred = [0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 2, 0, 1, 2, 2, 2, 2] 

混淆矩陣:上述

[[9 3 0] 
[3 5 1] 
[1 1 4]] 

Wei Pre: 0.670655270655 
Wei Rec: 0.666666666667 
Wei F1 : 0.666801346801 
Wei F5 : 0.668625356125 

Mic Pre: 0.666666666667 
Mic Rec: 0.666666666667 
Mic F1 : 0.666666666667 
Mic F5 : 0.666666666667 

Mac Pre: 0.682621082621 
Mac Rec: 0.657407407407 
Mac F1 : 0.669777037588 
Mac F5 : 0.677424801371 

F5爲速記F0.5 ...

+0

如果我們是宏觀平均值,這意味着每次觀測都會計算精度,召回率和F1分數,然後返回所有精度值,召回值和F1分數值的平均值。所以最終精確度和最終回憶的調和平均數絕對不會等於我已經更新結果的最終F1分數 – Antoine

回答

2

您可以請更新您的問題與輸出:

>>> from sklearn.metrics import classification_report 
>>> print classification_report(y_true, y_predicted) 

這將顯示每個類別的精度和召回以及支持,從而幫助我們理解平均值是如何工作的,並確定這是否是合適的行爲。

+0

。特別是第二輪,似乎有點奇怪... – Flake

+0

檢查結果。似乎既不使用微觀也不使用宏。在第二輪中出現了比精度和召回都小的奇怪行爲F1,並且剛剛意識到,它也部分地由諧波平均的性質引起,其中諧波(1.00,0.29)= 0.44違背了我的直覺,但是是正確的。然而,非微觀/宏觀的方法也可能是另一個原因。 – Flake

+1

實際的scikit-learn實現是權重爲支持(每個類中的樣本數)的類別的加權平均值。所以對我來說,這聽起來像是微觀平均值,但我沒有計算出細節,所以它可能根本不相等。 如果您想要使用TP,FP,TN,FN的平均值來實現微平均的實際實施,請隨時發送拉請求。 – ogrisel

相關問題