切换标签的F1分数

2024-03-28 18:48:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想用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')

Tags: 数据方法名称labels聚类标签sklearn代码生成
1条回答
网友
1楼 · 发布于 2024-03-28 18:48:03

F1分数计算如下:

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

我相信你知道精度的定义是:

TP/(TP+FP)

召回是:

TP/(TP+FN)

在上述情况下,TP=0FP=3FN=3

因此精确度和召回率都是0。这反过来又使你的F1成绩计算看起来像

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

事实上,我相信当你被0除的时候应该会出错,但是也许scikitlearn处理的方式不同。你知道吗

因此,在你的情况下,你将必须正确地标记预测,以符合地面真相,如果这是真正的情况。F1的分数永远不会知道这些信息。问题可能是如何将标签应用于簇,或者测试数据,而不是f1分数。你知道吗

相关问题 更多 >