2011-11-27 102 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

相关问题