我正在做多類分類,並且分類不均衡。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 ...
如果我們是宏觀平均值,這意味着每次觀測都會計算精度,召回率和F1分數,然後返回所有精度值,召回值和F1分數值的平均值。所以最終精確度和最終回憶的調和平均數絕對不會等於我已經更新結果的最終F1分數 – Antoine