多分类f1分数_所以多分类情况下sklearn的f1值到底是怎么计算的

已经很久没有更新新的文章啦,最近在弄GCN,很多东西的理解都还没有很透彻,所以也不太好发,不过就在今天“南归”的时候刷知乎,刷到了这么一个朋友( @苏小胖与喵 )的疑问:

这。。。么简单的问题。。。。

我还真没思考过。。。。调包侠调sklearn习惯了,殊不知岁月静好有人为我负重前行,所以到底哪种计算方式才是正确的我不太好说,不过sklearn的方式是值得探究探究。

于是,就直接做了个小实验:

大致思路如下:

当前只有两种已知计算方式:先计算macro_precision和macro_recall,之后将二者带入f1计算公式中

直接计算每个类的f1并取均值

因此我们只需要验证其中一种就行啦~反正二者答案不同,首先我们构建数据集:

import numpy as np

#三分类问题

trueY=np.matrix([[1,2,3,2,1,3,1,3,1,1,3,2,3,2]]).T

testY=np.matrix([[1,2,3,2,2,3,1,3,1,1,3,2,3,2]]).T

然后,调用sklearn获取这些值的macro_f1值(变量oriF1)

from sklearn.metrics import f1_score,precision_score,recall_score

oriF1=f1_score(trueY,testY,average="macro")

print("sklearn-f1:",oriF1)

所得结果如下:

>>>sklearn-f1: 0.9259259259259259

接下来我们先试用较为简单的方式2进行验证

f1_1=f1_score(trueY==1,testY==1,labels=True)#针对分类1的f1

f1_2=f1_score(trueY==2,testY==2,labels=True)#针对分类2的f1

f1_3=f1_score(trueY==3,testY==3,labels=True)#针对分类3的f1

f1_123=np.mean([f1_1,f1_2,f1_3])#计算均值

print("ave-f1:",f1_123)

所得结果如下:

>>>ave-f1: 0.9259259259259259

因此,最终结论为:

sklearn计算macro_f1的方式为第二种方式,即计算每一个分类的f1值后求均值。

啊!今天又是充(cheng)满(gong)收(hua)获(shui)的一天啊!

你可能感兴趣的:(多分类f1分数)