微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么不能从宏精度和召回率计算宏 F1 度量?

如何解决为什么不能从宏精度和召回率计算宏 F1 度量?

我对通过宏精度和手动召回计算宏 f1 分数感兴趣。但结果并不相等。代码中 f1 和 f1_new 最终公式有什么区别?

from sklearn.metrics import precision_score,recall_score,f1_score

y_true = [0,1,0]
y_pred = [0,0]

p = precision_score(y_true,y_pred,average='macro')
r = recall_score(y_true,average='macro')
f1_new = (2 * p * r) / (p + r) # 0.6291390728476821

f1 = f1_score(y_true,average='macro') #  0.6190476190476191

print(f1_new == f1) 
# False

解决方法

f1_score 在 scikit-learn 中的计算如下:

all_positives = 4
all_negatives = 4
true_positives = 2
true_negatives = 3

true_positive_rate = true_positives/all_positives = 2/4
true_negative_rate = true_negatives/all_negatives = 3/4

pred_positives = 3
pred_negatives = 5

positive_predicted_value = true_positives/pred_positives = 2/3
negative_predicted_value = true_negatives/pred_negatives = 3/5

f1_score_pos = 2 * true_positive_rate * positive_predicted_value / (true_positive_rate + positive_predicted_value)
             = 2 * 2/4 * 2/3 / (2/4 + 2/3)

f1_score_neg = 2 * true_negative_rate * negative_predicted_value / (true_negative_rate + negative_predicted_value)
             = 2 * 3/4 * 3/5 / (3/4 + 3/5)

f1 = average(f1_score_pos,f1_score_neg)
   = 2/4 * 2/3 / (2/4 + 2/3) + 3/4 * 3/5 / (3/4 + 3/5)
   = 0.6190476190476191

这与 documentation 中为skicit-learn 的'macro'f1_score 参数给出的定义相匹配:计算每个标签的指标,并找到它们的未加权平均值.此定义也适用于 precision_scorerecall_score

您手动计算的 F1 分数如下:

precision = average(positive_predicted_value,negative_predicted_value)
          = average(2/3,3/5)
          = 19/30

recall = average(true_positive_rate,true_negative_rate)
       = average(2/4,3/4)
       = 5/8

f1_new = 2 * precision * recall / (precision + recall)
       = 2 * 19/30 * 5/8 / (19/30 + 5/8)
       = 0.6291390728476821

实际上,docs 中给出的一般公式 F1 = 2 * (precision * recall) / (precision + recall) 只对 average='binary'average='micro' 有效,但对 average='macro' 和 {{ 1}}。从这个意义上说,正如目前在 scikit-learn 中所呈现的那样,该公式具有误导性,因为它表明它与所选参数无关,但事实并非如此。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。