切换标签的F1分数



我想使用sklearn的几个评估分数(NMI、ARI、F1(,用一些合成数据来评估聚类方法。虽然NMI和ARI工作良好,但我确实存在关于F1分数的问题,其中标签被切换,例如,真实标签是[0, 0, 0, 1, 1, 1],预测标签是[1, 1, 1, 0, 0, 0]。对于集群来说,这是一个完美的结果,因为两个集群都被正确识别,只有标签被切换:集群1具有标签0,反之亦然。F1分数似乎无法处理此问题,因为我的代码生成了0.0的F1分数。我认为发生这种情况是因为标签没有相同的名称/编号,但我不能手动切换每个集群的标签名称,因为这是一种需要大量工作的方式,尤其是对于大型数据集,所以有更通用的解决方案吗?

示例代码:

from sklearn.metrics import f1_score
if __name__ == '__main__':
labels = [0, 0, 0, 1, 1, 1]
pred = [1, 1, 1, 0, 0, 0]
print(f1_score(labels, pred, average='micro')

F1分数计算为:

2*((precision*recall)/(precision+recall))

我相信你知道精度定义为:

TP/(TP+FP)

召回是:

TP/(TP+FN)

所以在上述TP=0FP=3FN=3的情况下

因此,准确度和召回率均为0。这反过来使你的F1成绩计算看起来像

2*((0*0)/(0+0))

事实上,我认为当你除以零时,这应该是错误的,但也许scikit learn处理的方式不同。

因此,在你的情况下,如果真的是这样的话,你必须正确地标记预测,以匹配基本事实。F1车手永远不会知道这些信息。问题可能是如何将标签应用于你的聚类,或者你的测试数据,而不是f1分数。

最新更新