Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python F1小于Scikit学习中的精度和召回率_Python_Machine Learning_Scikits_Scikit Learn - Fatal编程技术网

Python F1小于Scikit学习中的精度和召回率

Python F1小于Scikit学习中的精度和召回率,python,machine-learning,scikits,scikit-learn,Python,Machine Learning,Scikits,Scikit Learn,我在做多类分类,分类不平衡 我注意到f1总是小于精度和召回率的直接调和平均值,在某些情况下,f1甚至小于精度和召回率 仅供参考,我调用了metrics.precision\u score(y,pred)以获取精度等信息 我意识到微观/宏观平均值的差异,并使用precision\u recall\u fscore\u support() 不确定这是因为使用了宏平均还是其他原因 更新的详细结果如下: n_样本:75个,n_特征:250个 多项式Nb(α=0.01,拟合度=真) 2倍CV: 第一次运

我在做多类分类,分类不平衡

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

仅供参考,我调用了
metrics.precision\u score(y,pred)
以获取精度等信息

我意识到微观/宏观平均值的差异,并使用
precision\u recall\u fscore\u support()

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


更新的详细结果如下:

n_样本:75个,n_特征:250个

多项式Nb(α=0.01,拟合度=真)

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)

关于微观/宏观平均值的定义来自:

在多标签分类中,计算 各类别的总得分是所有类别得分的平均值 二进制任务。结果分数称为宏观平均回忆, 精度,F1等。另一种平均方法是将TP,FP, 首先计算所有类别的TN、FN和N,然后计算每个 上述指标。所得分数称为微平均。 宏观平均为每个类别赋予相等的权重,并且通常 由系统在稀有类别上的表现主导( (多数)在类似幂律的分布中。微平均给出了一个 每个文档的权重相等,并且通常由系统的 最常见类别的性能


这是Github中的一个电流#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…

的简写,请用以下输出更新您的问题:

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

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

检查了结果。似乎既不使用微观也不使用宏观。在第二次运行中,出现了比精确度和召回率都小的奇怪行为F1,并且刚刚意识到,这也部分是由调和平均值的性质造成的,其中调和(1.00,0.29)=0.44与我的直接直觉相反,但却是真的。然而,非微观/宏观的方法也可能是另一个原因。实际的scikit学习实现是一个加权平均的类,其中权重是支持(每个类中的样本数)。所以对我来说,这听起来像是微平均,但我还没有计算出细节,所以它可能根本就不是等效的。如果您想使用跨类平均的TP、FP、TN、FN实现微观平均,请随时发送拉取请求。我将更仔细地研究代码并找出答案。:)我对Python非常陌生,因此,我将看看这是否会在将来发生。无论如何,我真的对你们在Scikit-learn中的工作很感兴趣并高度赞赏。我发现了这个问题。我试过一个例子,对于n>2,当前的计算实际上既不是宏观的也不是微观的。这会带来一些棘手的行为,比如f1<精确性和召回率。我确实忘记了这个问题。我的记忆不再持续几个月了。我想应该归咎于推特引起的注意力障碍。。。因此,确实,请随时向我们提交微观平均的拉动请求(我不认为宏观平均有多大用处,但它更易于实现)。如果我们是宏观平均,这意味着每次观察都会计算精度、召回率和F1分数,然后是所有精度值、召回率值的平均值,并返回F1分数值。因此,最终精确度和最终召回率的调和平均值绝对不会等于F1的最终得分