您不能使用通过 k-means 获得的标签将问题视为监督分类问题。这是因为 k-means 将为它形成的每个集群分配一个任意标签。
如果您以经典准确度度量有意义的方式对齐任意标签,那将只是运气问题。
您应该寻找的是所谓的平均聚类准确度度量。无论任何集群的实际标签是什么,只要一个集群的成员在一起,这个度量就可以为您提供集群的准确性。
免责声明:我将要写的一切都归功于可以在这里找到的 github 脚本。如果你愿意,你可以跳过即将发生的事情,直接转到链接并应用那里定义的名为 cluster_acc 的函数
明智的做法是尝试找出可以让我获得最大聚类精度的最佳设置。我在这里设置的意思是:我的预测中的哪些标签对应于基本事实中的哪些标签。
您可以使用 sklearn.utils.linear_assignment_.linear_assignment 在 python 中执行此操作。该函数使用匈牙利算法来求解所谓的二分图。通过“找出最佳设置”来解决上述图表是我上面描述的。
现在,我将尝试详细解释如何获得二分图,以及如何从匈牙利方法的结果中获得聚类精度。
- 让y和y'分别是基本事实和预测的聚类分配。例如,y =[1,1,1,2,2,2,3,3,3];y' =[2,2,1,3,3,3,1,1,2]。请注意,在此示例中,经典准确度度量将给出 11% 的准确度,而更公平的聚类准确度度量将给出 78%,如下所示
- 构造矩阵W,这是一个DxD零矩阵,我们将在其中存储点。D是预测分配和基本事实之间的最大值(标签)。对于上面的相同示例,W将是 3x3。
- 回顾每一对预测的分配/基本事实。向W中的每个条目添加一个点,其中y'描述的行和y描述的列之间发生交集。对于我们的示例,这将产生:
W = [1 0 2; 2 0 1; 0 3 0](使用 MATLAB 表示法)。
- 从它的最大值中减去 W。每当出现最大值(在我们的例子中为 3)时,这将放置一个零。这给了我们我们的二分图 = [2 3 1; 1 3 2; 3 0 3]。
- 然后,使用上面提到的 sklearn 函数解决这个问题,我们得到了下面的匹配表: [ 1 3; 2 1; 3 2]。这告诉我们,预测中的一对应于基本事实中的三,二对一,三对二,这很容易得到证实。这个匹配表告诉我们在测量准确度时应该考虑 W 中的哪些条目
- 最后,我们所要做的就是去 W 中的条目 (1,3),(2,1) 和 (3,2) 并将它们相加,然后取平均值。这为我们提供了 78% 的聚类准确度。
希望这对您有所帮助,并再次感谢所附 github 存储库的作者。