已经很久没有更新新的文章啦,最近在弄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)的一天啊!