如何测试无监督聚类模型输出的准确性?

数据挖掘 聚类 k-均值
2021-09-23 14:21:46

我正在尝试测试我的无监督 K-Means 聚类如何正确聚类我的数据。我有一个无监督的 K-Means 聚类模型输出(如下面的第一张照片所示),然后我使用实际分类对我的数据进行了聚类。

在此处输入图像描述

下面的照片是实际的分类。我正在尝试在 Python 中测试我的 K-Means 分类(上图)对实际分类的效果如何。

在此处输入图像描述

对于我的 K-Means 代码,我使用了一个简单的模型,如下所示:

kmeans = KMeans(n_clusters=4, random_state=0).fit(myData)
labels = kmeans.labels_

比较我的无监督 KMeans 聚类模型与实际分类的效果的最佳方法是什么?

3个回答

由于您有实际的标签,您可以将它们与获得的标签进行比较并评估性能。通常使用纯度和 nmi(归一化互信息)。阅读此(聚类评估)文档以获取详细说明。

如果您没有实际的标签,那么您可以使用模块化或 [Silhouette] 来测量聚类性能。

您不能使用通过 k-means 获得的标签将问题视为监督分类问题。这是因为 k-means 将为它形成的每个集群分配一个任意标签。

如果您以经典准确度度量有意义的方式对齐任意标签,那将只是运气问题。

您应该寻找的是所谓的平均聚类准确度度量。无论任何集群的实际标签是什么,只要一个集群的成员在一起,这个度量就可以为您提供集群的准确性。

免责声明:我将要写的一切都归功于可以在这里找到的 github 脚本。如果你愿意,你可以跳过即将发生的事情,直接转到链接并应用那里定义的名为 cluster_acc 的函数

明智的做法是尝试找出可以让我获得最大聚类精度的最佳设置。我在这里设置的意思是:我的预测中的哪些标签对应于基本事实中的哪些标签。

您可以使用 sklearn.utils.linear_assignment_.linear_assignment 在 python 中执行此操作。该函数使用匈牙利算法来求解所谓的二分图。通过“找出最佳设置”来解决上述图表是我上面描述的。

现在,我将尝试详细解释如何获得二分图,以及如何从匈牙利方法的结果中获得聚类精度。

  1. yy'分别是基本事实和预测的聚类分配。例如,y =[1,1,1,2,2,2,3,3,3];y' =[2,2,1,3,3,3,1,1,2]。请注意,在此示例中,经典准确度度量将给出 11% 的准确度,而更公平的聚类准确度度量将给出 78%,如下所示
  2. 构造矩阵W,这是一个DxD零矩阵,我们将在其中存储点。D是预测分配和基本事实之间的最大值(标签)。对于上面的相同示例,W将是 3x3。
  3. 回顾每一对预测的分配/基本事实。向W中的每个条目添加一个点,其中y'描述的行和y描述的列之间发生交集对于我们的示例,这将产生: W = [1 0 2; 2 0 1; 0 3 0](使用 MATLAB 表示法)。
  4. 从它的最大值中减去 W。每当出现最大值(在我们的例子中为 3)时,这将放置一个零。这给了我们我们的二分图 = [2 3 1; 1 3 2; 3 0 3]。
  5. 然后,使用上面提到的 sklearn 函数解决这个问题,我们得到了下面的匹配表: [ 1 3; 2 1; 3 2]。这告诉我们,预测中的一对应于基本事实中的三,二对一,三对二,这很容易得到证实。这个匹配表告诉我们在测量准确度时应该考虑 W 中的哪些条目
  6. 最后,我们所要做的就是去 W 中的条目 (1,3),(2,1) 和 (3,2) 并将它们相加,然后取平均值。这为我们提供了 78% 的聚类准确度。

希望这对您有所帮助,并再次感谢所附 github 存储库的作者。

检查性能的另一种可能性是评估混淆矩阵其中预测和实际标签进行比较,并测量每个类别的分类结果