我正在做多标签分类,评估是通过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_report
和f_report
分别给我(0.58333333333333337, 0.61111111111111105, 0.48888888888888893, None)
和0.488888888889
。
f分数不等于2*smp_report[0]*smp_report[1]/(smp_report[0]+smp_report[1])
的结果,是精度和召回率的调和平均值。
谁能告诉我Sklearn是如何实现这个的?我使用的版本是 0.15.0。
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正在计算每个分类事件的谐波平均值 - 它只是返回这些谐波平均值的平均值。