如何解决为什么不能从宏精度和召回率计算宏 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_score
和 recall_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 举报,一经查实,本站将立刻删除。