切换标签的 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 分数。
我想使用 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 分数。