【问题标题】:Is there a bug in scikits ARI implementation or is my understanding of the algorithm flawed?scikits ARI 实现中是否存在错误,或者我对算法的理解存在缺陷?
【发布时间】:2019-06-03 06:02:27
【问题描述】:

在用scikit's implementation 计算ARI 时,我注意到一个奇怪的情况。对于在标签中看起来似乎有高度共识的某些列表,ARI 仍然是 0.0 甚至更差。

我尝试了几种标签,以下是观察到的最奇怪的标签:

from sklearn import metrics as m

labels_true = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1]
labels_pred = [1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1]

res = m.adjusted_rand_score(labels_true,labels_pred)

>>> res = 0.0 

结果是 0.0,这表明这两个列表是完全随机的标签。看着它们,直觉上会说这是一个很好的标签,除了一个列表条目,它是 0 类而不是 1 类的标签。这甚至是一个现实的聚类结果,例如如果只有一个聚类一个没有噪音的小数据集,一个点被错误地分类错误(0类)。

我的问题是:我对“好”标签的理解是完全错误的,还是算法可能存在某种错误甚至未记录的输入限制?

【问题讨论】:

  • 我可以验证我系统上的行为,并在sklearn's GitHub 上打开了一个错误报告。我认为这是一个错误。我们会看看他们怎么说。
  • 另外,我使用 sklearn 0.19.1 进行了验证。不确定您使用的是什么版本。
  • 感谢您打开这个问题。我认为对于其中一个列表中仅存在一个标签的情况可能存在某种错误。如果您在两个列表的末尾添加 2,您会神奇地得到大约 0.633 的 ARI。我使用的是 0.20.1 版
  • 如果我按照the wiki def 手动计算上述示例的 RI(无调整),我得到 0.90909090。 但是如果我使用列联表计算 ARI 公式的分子,它实际上是零。我什至会声称,只要一个标签只包含一个类别,它就始终为 0。如果该声明属实,则意味着公式中定义的 ARI 对于只有一个类别且没有噪声的实验毫无用处。

标签: python scikit-learn cluster-analysis scikits


【解决方案1】:

不是和是的。

否:实现似乎是正确的,是的:您的理解有缺陷。

调整后的 rand 索引将给定结果与标签的任何随机排列进行比较。 只有优于随机的结果才是好的。

现在,如果您查看日期,任何随机排列都会完全一样好。因此正确的调整值为 0:与随机排列完全一样。

不过,我同意您的评估,即 ARI 不能用于一类问题。因为在这样的数据上,所有排列都是相等的。解决您的问题的错误工具:它是关于比较数据集的分区,而您没有分区数据...

【讨论】:

  • 我唯一不同意的措辞是最后一句话;我可能没有对真实数据进行分区,但大多数算法都会犯一些小错误,让我得到一个稍微分区的结果。由于 ARI 是一种对称度量,这相当于对地面实况数据进行了轻微划分(低噪声)和只有一个类的聚类结果(无论出于何种原因)——这是最让我困惑的事情。我只需要一个适合一类问题的算法。感谢您的见解!
  • 也许 NMI 在这种情况下效果更好;但调整后的版本 AMI 可能有同样的问题。机会调整意味着您需要定义一些“预期随机结果”的概念。如果您只有标签,则排列是一种流行的选择。特别是因为一个排列与另一个的逆排列相同,所以它是对称的。
  • 我可以确认 AMI 只是面临完全相同的问题!
猜你喜欢
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-04
  • 2012-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多