Machine learning 为什么F1宏度量可以';不能根据宏精度和召回率计算?

Machine learning 为什么F1宏度量可以';不能根据宏精度和召回率计算?,machine-learning,scikit-learn,precision-recall,Machine Learning,Scikit Learn,Precision Recall,我感兴趣的是通过宏精度和手动调用来计算宏f1分数。但结果并不相同。新代码中f1和f1_的最终公式有什么不同 从sklearn.metrics导入精度评分、召回评分、f1评分 y_true=[0,1,0,1,0,1,1,0] y_pred=[0,1,0,0,1,1,0,0] p=精度分数(y_真、y_pred、average='macro') r=回忆分数(y_真,y_pred,average='macro') f1#U new=(2*p*r)/(p+r)#0.6291390728476821 f

我感兴趣的是通过宏精度和手动调用来计算宏f1分数。但结果并不相同。新代码中f1和f1_的最终公式有什么不同

从sklearn.metrics导入精度评分、召回评分、f1评分
y_true=[0,1,0,1,0,1,1,0]
y_pred=[0,1,0,0,1,1,0,0]
p=精度分数(y_真、y_pred、average='macro')
r=回忆分数(y_真,y_pred,average='macro')
f1#U new=(2*p*r)/(p+r)#0.6291390728476821
f1=f1_分数(y_真,y_pred,average='macro')#0.6190476190476191
打印(f1_new==f1)
#假的

scikit学习中的f1\U分数计算如下:

all_正值=4
全部否定=4
真正=2
真/负=3
真阳性率=真阳性/全部阳性=2/4
正确/否定率=正确/否定/所有否定=3/4
pred_正值=3
pred_负片=5
正预测值=真预测值/预测值=2/3
负预测值=真负/预测负=3/5
f1评分位置=2*真阳性率*阳性预测值/(真阳性率+阳性预测值)
= 2 * 2/4 * 2/3 / (2/4 + 2/3)
f1评分负=2*真负率*负预测值/(真负率+负预测值)
= 2 * 3/4 * 3/5 / (3/4 + 3/5)
f1=平均值(f1分数为正,f1分数为负)
= 2/4 * 2/3 / (2/4 + 2/3) + 3/4 * 3/5 / (3/4 + 3/5)
= 0.6190476190476191
这与skicit learn的
f1\u分数的
“宏”
参数中给出的定义相匹配:计算每个标签的指标,并找到其未加权平均值。此定义也适用于
精度评分
召回评分

您对F1成绩的手动计算如下:

精度=平均值(正预测值、负预测值)
=平均值(2/3,3/5)
= 19/30
召回率=平均值(真阳性率、真阴性率)
=平均值(2/4,3/4)
= 5/8
f1_new=2*精度*召回/(精度+召回)
= 2 * 19/30 * 5/8 / (19/30 + 5/8)
= 0.6291390728476821

事实上,中给出的一般公式
F1=2*(精度*召回)/(精度+召回)
仅适用于
average='binary'
average='micro'
,而不适用于
average='macro'
average='weighted'
。从这个意义上讲,正如scikit learn中当前所述,该公式具有误导性,因为它表明,无论选择的参数如何,该公式都成立,但事实并非如此。

以不同的顺序取平均值并进行聚合会导致不同的结果。这是一个数学关系;它属于“开”,不属于这里。@Aryamcarthy我一直投票将ML理论/方法学问题作为离题题来结束,但这里的情况似乎不是这样。这似乎是一个实现问题(即使它是关于sklearn内部的),有一个完全可复制的最小示例,所以我认为它确实属于这里。也许我们应该提出一个问题,指出这一点,并要求在文件中添加澄清。