Scikit-learn中F1值小于精确率和召回率

我正在进行多类别分类,类别分布不均衡。

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

供参考,我使用metrics.precision_score(y,pred)来计算精确率等指标。

我了解微平均和宏平均的区别,并通过precision_recall_fscore_support()的类别结果测试确认这不是微平均的结果。

不确定这是因为使用了宏平均还是其他原因导致的?


以下是更新后的详细结果:

样本数:75,特征数:250

MultinomialNB(alpha=0.01, fit_prior=True)

2折交叉验证:

第一次运行:

F1:        0.706029106029Precision: 0.731531531532Recall:    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        23avg / total       0.73      0.70      0.71        37

第二次运行:

F1:        0.787944219523Precision: 0.841165413534Recall:    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        24avg / total       0.84      0.82      0.79        38

总体情况:

总体F1分数:   0.74699 (+/- 0.02)总体精确率:  0.78635 (+/- 0.03)总体召回率:     0.75925 (+/- 0.03)

关于微平均/宏平均的定义来自Scholarpedia

在多标签分类中,计算跨类别聚合得分的最简单方法是平均所有二元任务的得分。由此产生的得分称为宏平均召回率、精确率、F1等。另一种平均方法是首先对所有类别的TP、FP、TN、FN和N进行求和,然后计算上述每个指标。由此产生的得分称为微平均。宏平均赋予每个类别相同的权重,通常由系统在类似幂律分布的稀有类别(多数)上的表现所主导。微平均赋予每个文档相同的权重,通常由系统在最常见类别上的表现所主导。


这是一个当前在Github上的开放问题,编号为#83。


以下示例展示了微平均、宏平均和加权平均(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]

混淆矩阵:

[[9 3 0] [3 5 1] [1 1 4]]Wei Pre: 0.670655270655Wei Rec: 0.666666666667Wei F1 : 0.666801346801Wei F5 : 0.668625356125Mic Pre: 0.666666666667Mic Rec: 0.666666666667Mic F1 : 0.666666666667Mic F5 : 0.666666666667Mac Pre: 0.682621082621Mac Rec: 0.657407407407Mac F1 : 0.669777037588Mac F5 : 0.677424801371

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


回答:

请更新您的问题,添加以下输出的结果:

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

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

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注