切换标签的 F1 分数

F1 score for switched labels

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

示例代码:

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=0, FP=3, FN=3

因此精确率和召回率均为 0。这反过来又使您的 F1 分数计算看起来像

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

实际上,我认为当您除以零时应该会出错,但也许 scikit learn 会以不同的方式处理它。

因此,在您的情况下,如果情况确实如此,您将必须正确标记预测以匹配基本事实。 F1 分数永远不会知道该信息。问题可能是标签如何应用于您的集群或您的测试数据,而不是 f1 分数。