首页 > 解决方案 > 聚类算法的准确性是多少?

问题描述

我有一组使用聚类算法(在本例中为 k-means)聚类的点。我也知道真实标签,我想衡量我的聚类有多准确。我需要的是找到实际的准确性。当然,问题在于聚类给出的标签与原始标签的顺序不匹配。

有没有办法测量这种准确性?直观的想法是计算每个标签组合的混淆矩阵的分数,并且只保留最大值。有没有这样做的功能?

我还使用 rand 分数和调整后的 rand 分数评估了我的结果。这两个指标与实际准确度有多接近?

谢谢!

标签: scikit-learncluster-computing

解决方案


首先,是什么The problem, of course, is that the labels given by the clustering do not match the ordering of the original one.意思?

如果您知道真实标签,那么您可以重新排列它们以匹配X矩阵的顺序,这样,Kmeans 标签将与预测后的真实标签一致。


在这种情况下,我建议如下。

  • 如果您有基本事实标签并且想查看模型的准确度,那么您需要诸如 Rand 指数或预测标签和真实标签之间的互信息之类的指标。您可以在交叉验证方案中执行此操作,并查看模型的行为方式,即它是否可以正确预测交叉验证方案下的类/标签。可以使用兰德指数等指标来计算预测优度的评估。

总之:

  • 定义一个 Kmeans 模型并使用交叉验证,并在每次迭代中估计分配真实标签之间的兰德指数(或互信息) 。对所有迭代重复此操作,最后取 Rand 指数分数的平均值。如果这个分数很高,那么模型就很好。

完整示例:

from sklearn.cluster import KMeans
from sklearn.metrics.cluster import adjusted_rand_score
from sklearn.datasets import load_iris
from sklearn.model_selection import LeaveOneOut
import numpy as np

# some data
data = load_iris()
X = data.data
y = data.target # ground truth labels
loo = LeaveOneOut()

rand_index_scores = []
for train_index, test_index in loo.split(X): # LOOCV here
   X_train, X_test = X[train_index], X[test_index]
   y_train, y_test = y[train_index], y[test_index]

   # the model
   kmeans = KMeans(n_clusters=3, random_state=0)
   kmeans.fit(X_train) # fit using training data
   predicted_labels = kmeans.predict(X_test) # predict using test data
   rand_index_scores.append(adjusted_rand_score(y_test, predicted_labels)) # calculate goodness of predicted labels

print(np.mean(rand_index_scores))

推荐阅读