在Sklearn中,基于实例的f-score小于精度和召回率

时间:2014-10-05 07:53:27

标签: python scikit-learn

我正在进行多标签分类,评估由precision_recall_fscore_support average = '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分数不等于2*smp_report[0]*smp_report[1]/(smp_report[0]+smp_report[1])的结果,{{1}}是精确度和召回的调和平均值。

有人能告诉我Sklearn如何实施这个?我使用的版本是0.15.0。

1 个答案:

答案 0 :(得分:4)

Scikit-learn首先计算列表集中每个项目的精度,召回率和谐波F度量([1,1,0,0],[1,0,0,1],[1, 1,1,1])。然后计算这些精度值的平均值,这些召回值的平均值以及这些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-measure 精确度和召回之间的调和平均值:

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 + .5 + .25 / 3 = .5833333333333333),这些召回值中的平均召回率(.5 + .333 + 1/3 = 0.61111111111111105),以及这些f度量中的平均f度量(.666 + .4 + .4 / 3 = 0.48888888888888893),并返回这些均值。这些是您在上面报告的值。 SK正在计算每个分类事件的调和平均值 - 它只是返回那些调和平均值的平均值。