【问题标题】:how to handle cluster label mismatch如何处理集群标签不匹配
【发布时间】:2021-06-18 09:49:42
【问题描述】:

假设我有一个数据集并且它有一个类列:[1,1,0,0,2,2]。然后我使用 kmeans 聚类作为分类,并假设我得到的聚类标签为:[0,0,1,1,2,2]

现在,如果我使用 confusion_matrixclassification_report 来评估算法(将集群标签作为类处理),我应该得分完美,但实际上我不会因为类 0 和类之间的集群标签不匹配1.

这是假设性问题,我没有代码。我该如何处理?我正在使用 scikit-learn。

【问题讨论】:

  • 你听起来很困惑; kmeans 是一种无监督算法,confusion_matrixclassification_report 都不适用。正如您的标题所声称的,这也不是一个分类问题。
  • 我说,这是一个假设的、虚构的问题。我知道当我已经有分类列时,我不应该使用无监督算法。我只是在玩,但我认为我的问题是有效的。
  • 有效。但无论是否假设,尝试准确使用所使用的术语并没有什么坏处(编辑过的标题和帖子,请确保它仍然准确地描述了您的情况)。

标签: python scikit-learn k-means


【解决方案1】:

实际上,聚类算法只是试图将数据分成不同的集合,其中集合的名称是无关紧要的(只是集群 1、集群 2、...、集群 k)。

如上所述,可以返回任何集群分配,其中集群名称是真实类的某种排列。在您提供的示例中,预测的集群名称和真实的集群名称(分类列)之间的映射是 0->1、1->0、2->2。同样,[2,2,1,1,0,0] 的结果也是完美的结果。

因此,要将聚类结果与分类列对齐,您应该首先应用一些算法,将聚类名称与分类列匹配。这被称为Assignment Problem,其中一种可能的解决方案是使用Hungarian Algorithm 来解决它。 Scipy has such an optimizer.


就这个问题而言,我们可以将匈牙利算法视为一种将每个集群名称分类值匹配的方法。它将找到最小化错误的映射。

想象一下一个大的混淆矩阵,其中真正的类是列,预测是行。现在,图片移动行和列以尝试尽可能多地获得对角线匹配度非常高且对角线匹配度低得多的矩阵。类似于下图的东西:

在上图中你可以看到最好映射B->B,G->G,....匈牙利算法的结果会给你这样一个映射where:

  • 与示例图片不同,您不必将每个类都映射到自身,而只是一些映射。
  • 与示例图片类似,可能存在错误,如对角线之外的非零值所示。

【讨论】:

  • 你提供的资源让我有点难以理解。
  • @jaydrill - 添加了解释。现在好点了吗?
【解决方案2】:

有一个方便的小例子说明如何做到这一点。

import pandas as pd

def get_common_labels(labels, num_labels=3):
    check_labels = range(num_labels)
    
    labels_unique = pd.unique(labels)
    labels_to_cl = dict(zip(labels_unique, check_labels))
    
    labels_cl = list(map(labels_to_cl.get, labels))
    
    return labels_cl

y = [0, 0, 1, 1, 2, 2]
predicted = [1, 1, 0, 0, 2, 2]

print(get_common_labels(y) == get_common_labels(predicted))

【讨论】:

  • 如果预测是 100% 正确但只是使用不同的标签,您的解决方案似乎工作得很好,并且您的函数似乎依赖于预测是完美的但标签不同的事实。但是如果我碰巧有一些错误的预测,那么我不确定它是否仍然有效。谢谢。
  • 你是对的,当预测中有所有类的对象时它就起作用了,它只是它应该如何工作的灵感,实际上只看y和预测中的一些对象并映射它们的数字相同。
猜你喜欢
  • 2020-12-14
  • 2012-07-25
  • 2020-12-05
  • 2011-11-18
  • 2018-02-21
  • 2020-03-04
  • 2011-09-01
  • 2020-01-14
  • 1970-01-01
相关资源
最近更新 更多