我正在进行多标签分类,评估由precision_recall_fscore_supportaverage = 'samples'完成:

predict = array(([1,1,0,0], [1,0,0,1], [1,1,1,1]))
expect = array(([1,1,1,1], [1,1,1,0], [1,0,0,0]))
smp_report = precision_recall_fscore_support(expect, predict, average = 'samples')
f_report = f1_score(expect, predict, average = 'samples')

在这个例子中有三个实例,二进制值代表对应的四个类的存在。
然后smp_reportf_report分别给我(0.58333333333333337, 0.61111111111111105, 0.48888888888888893, None)0.488888888889
f值不等于精度和召回率的调和平均值。
有谁能告诉我Sklearn是如何实现这一点的吗?我使用的版本是0.15.0。

最佳答案

Scikit learn首先计算列表集合([1,1,0,0],[1,0,0,1],[1,1,1,1,1])中每个项目的精度、召回率和谐波F-度量。然后,它计算这些精度值的平均值、那些召回值的平均值和那些f度量值的平均值,并返回这些平均值。这些是上面报告的P、R和F值。
这有助于计算列表中单个项的精度、召回率和f度量值。要计算列表中第三项的P、R和F值,可以运行:

import numpy as np
from sklearn import metrics

predict = np.array([[1,1,1,1]])
expect = np.array([[1,0,0,0]])
smp_report = metrics.precision_recall_fscore_support(expect, predict, beta=1, average = 'samples')
f_report = metrics.f1_score(expect, predict, average = 'samples')

print f_report, smp_report

运行此代码将使您0.4 (0.25, 1.0, 0.40000000000000002)。括号内的值表示分类的精度、召回率和f度量(按该顺序)。如您所见,f度量是精度和召回之间的调和平均值:
2 * [(.25 * 1) / (.25 + 1) ] = .4

通过将前两个列表交换到上面的代码中,您可以计算数据集中三个项目的精度、召回率和谐波f度量:
第一项值:
0.666666666667 (1.0, 0.5, 0.66666666666666663)
第二项值
0.4 (0.5, 0.33333333333333331, 0.40000000000000002)
第三项值
0.4 (0.25, 1.0, 0.40000000000000002)
然后,SK计算这些精度值之间的平均精度(即1+0.5+0.25/3=.5833333333333333)、这些召回值之间的平均召回率(.5+0.333+1/3=0.61111111111111105)以及这些f度量值之间的平均f度量值(.666+0.4+0.4/3=0.48888888888888893),并返回这些平均值。以上是您报告的值。SK计算每个分类事件的调和平均值——它只是返回这些调和平均值的平均值。

关于python - 基于示例的f得分小于Sklearn中的精度和召回率,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26200718/

10-12 04:42