sklearn k 表示集群标签与真值标签

sklearn k means cluster labels vs ground truth labels

提问人:Andrea 提问时间:3/30/2020 更新时间:3/30/2020 访问量:3642

问:

我正在尝试学习sklearn。正如我从以下示例的第 5 步中了解到的那样,预测的集群可能会被错误标记,由我来正确重新标记它们。这在sci-kit的示例中也完成了。必须重新分配标签,以便聚类结果和真值按颜色匹配。

我如何知道预测聚类的标签是否与初始数据标签匹配,以及如何重新调整标签的索引以正确匹配两组?

python scikit-learn

评论


答:

4赞 Steven Fontanella 3/30/2020 #1

在聚类中,聚类之间没有有意义的顺序或比较,我们只是找到具有共同点的观测值组。没有理由将一个集群称为“蓝色集群”和“红色集群”(除非您对该域有一些额外的了解)。出于这个原因,sklearn 会任意为每个集群分配编号。

print(clustering.labels_)
[1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
 1 1 1 1 1 1 1 1 1 1 1 1 1 0 0 0 2 2 2 0 2 2 2 2 2 2 2 2 0 2 2 2 2 0 2 2 2
 2 0 0 0 2 2 2 2 2 2 2 0 0 2 2 2 2 2 2 2 2 2 2 2 2 2 0 2 0 0 0 0 2 0 0 0 0
 0 0 2 2 0 0 0 0 2 0 2 0 2 0 0 2 0 0 0 0 0 0 2 2 0 0 0 2 0 0 0 2 0 0 0 2 0
 0 2]

标签可以很容易地将所有 1 替换为 0,将 0 替换为 1,并且仍然是同一组簇。

在本例中,编号与真实值中使用的编号不匹配,因此当我们查看生成的聚类与真实值时,颜色不匹配,因此我们使用示例中所示的方式重新分配它们:np.choose

relabel = np.choose(clustering.labels_,[2,0,1]).astype(np.int64)

这将采用当前标签,并将 0 更改为 2(因为索引 0 为 2)、1 更改为 0 和 2 更改为 1。这是同一组集群,但我们更改了(任意)标签以匹配。

回答你关于如何知道它们何时匹配或不匹配的问题:聚类是一种无监督学习形式,这意味着你通常根本没有基本事实,也没有什么需要担心匹配的。在这个例子中,我们知道了基本事实,我们可以看到聚类没有并排匹配,因此我们可以根据需要选择使颜色匹配。我们也可以选择不这样做,因为它们无论如何都是相同的集群,但您可能会发现以这种方式可视化更容易。

评论

1赞 Andrea 3/30/2020
谢谢你的回答。由于编号/标签不匹配,因此我认为如果不首先重新标记,运行 print(classification_report(y_true = y, y_pred = clustering.labels_)) 的精度和精度分数将不准确。这是对的吗?
1赞 Steven Fontanella 3/31/2020
是的,所以你说得对,你应该在这样做之前确保标签匹配。
0赞 Andrea 3/31/2020
再次感谢您的帮助。