我想使用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。我假设发生这种情况是因为标签不具有相同的名称/编号,但是我不能手动为每个集群切换标签名称,因为这是一种很大的工作方式,特别是对于大型数据集,那么有没有更通用的解决方案?
示例代码:
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')发布于 2019-10-26 22:58:38
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分数。
https://stackoverflow.com/questions/58570781
复制相似问题