使用sklearn计算宏f1分数

时间:2017-04-15 02:09:19

标签: python scikit-learn metrics

我正在使用sklearn来计算macro f1得分,我怀疑代码中是否存在任何错误。以下是一个示例(标签0被忽略):

from sklearn.metrics import f1_score, precision_recall_fscore_support

y_true = [1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4]
y_pred = [1, 1, 1, 0, 0, 2, 2, 3, 3, 3, 4, 3, 4, 3]



p_macro, r_macro, f_macro, support_macro \
    = precision_recall_fscore_support(y_true=y_true, y_pred=y_pred, labels=[1, 2, 3, 4], average='macro')

p_micro, r_micro, f_micro, support_micro\
    = precision_recall_fscore_support(y_true=y_true, y_pred=y_pred, labels=[1, 2, 3, 4], average='micro')

def f(p, r):
    return 2*p*r/(p+r)

my_f_macro = f(p_macro, r_macro)

my_f_micro = f(p_micro, r_micro)

print('my f macro {}'.format(my_f_macro))

print('my f micro {}'.format(my_f_micro))

print('macro: p {}, r {}, f1 {}'.format(p_macro, r_macro, f_macro))

print('micro: p {}, r {}, f1 {}'.format(p_micro, r_micro, f_micro))

输出:

my f macro 0.6361290322580646
my f micro 0.6153846153846153
macro: p 0.725, r 0.5666666666666667, f1 0.6041666666666666
micro: p 0.6666666666666666, r 0.5714285714285714, f1 0.6153846153846153

如您所见,sklearn0.6041666666666666提供macro f1。但是,它不等于2*0.725*0.566666666/(0.725+0.566666666),其中0.7250.566666666macro precisionmacro recallsklearn计算。

1 个答案:

答案 0 :(得分:2)

计算宏观程序的程序有所不同。和'微'平均值。

documentation of f_score中所述:

  

' micro ':通过计算总真阳性,误报和误报来全局计算指标。

     

' ':计算每个标签的指标,找到未加权的均值。这不会考虑标签不平衡。

在宏中,单独计算所有类的调用,精度和f1,然后返回它们的均值。因此,您不能指望将公式def f(p, r)应用于它们。因为它们与你想要的不一样。

在微观中,f1是根据最终精度和召回计算的(所有类别的全局组合)。这样就匹配了您在my_f_micro中计算的分数。

希望它有意义。

有关详细说明,请在此处阅读答案: -