F1 小于 Scikit-learn 中的精度和召回率

Fla*_*ake 5 python machine-learning scikits scikit-learn

我正在做多类分类,类别不平衡。

我注意到 f1 总是小于精度和召回率的直接调和平均值,在某些情况下,f1 甚至小于精度和召回率。

仅供参考,我要求metrics.precision_score(y,pred)精确等等。

我知道微观/宏观平均值的差异,并通过使用precision_recall_fscore_support().

不确定这是由于使用了宏观平均还是其他一些原因?


更新详细结果如下:

n_samples: 75, n_features: 250

MultinomialNB(alpha=0.01, fit_prior=True)

2倍简历:

第一次运行:

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
Run Code Online (Sandbox Code Playgroud)

第二次运行:

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
Run Code Online (Sandbox Code Playgroud)

总体:

Overall f1-score:   0.74699 (+/- 0.02)
Overall precision:  0.78635 (+/- 0.03)
Overall recall:     0.75925 (+/- 0.03)
Run Code Online (Sandbox Code Playgroud)

Scholarpedia关于微观/宏观平均的定义:

在多标签分类中,计算跨类别聚合分数的最简单方法是对所有二元任务的分数求平均值。结果分数称为宏观平均召回率、精度、F1 等。 另一种平均方法是首先对所有类别的 TP、FP、TN、FN 和 N 求和,然后计算上述每个指标。结果分数称为微平均。宏观平均为每个类别赋予相同的权重,并且通常由系统在幂律分布中的稀有类别(大多数)上的性能决定。微平均赋予每个文档相同的权重,并且通常由系统在最常见类别上的性能决定。


这是Github 中的当前未解决问题,#83。


以下示例演示了 Micro、Macro 和加权(Scikit-learn 中的当前)平均可能有何不同:

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]
Run Code Online (Sandbox Code Playgroud)

混淆矩阵:

[[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
Run Code Online (Sandbox Code Playgroud)

上面的 F5 是 F0.5 的简写...

ogr*_*sel 2

您能否用以下输出更新您的问题:

>>> from sklearn.metrics import classification_report
>>> print classification_report(y_true, y_predicted)
Run Code Online (Sandbox Code Playgroud)

这将显示每个单独类别的精确度和召回率以及支持度,从而帮助我们了解平均的工作原理并确定这是否是适当的行为。