Scikit learn 聚类算法的准确度是多少?

Scikit learn 聚类算法的准确度是多少?,scikit-learn,cluster-computing,Scikit Learn,Cluster Computing,我有一组使用聚类算法(本例中为k-means)聚类的点。我也知道基本真相标签,我想衡量我的聚类有多准确。我需要的是找到实际的准确度。当然,问题是集群给出的标签与原始标签的顺序不匹配 有没有办法测量这种精确度?直观的想法是计算每个标签组合的混淆矩阵的分数,只保留最大值。有没有这样的函数 我还使用兰德分数和调整后的兰德分数评估了我的结果。这两个指标与实际准确度有多接近 谢谢 您可以使用下面提到的链接中记录的sklearn.metrics.accurity 在下面提到的链接中可以看到一个例子 首先,

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

有没有办法测量这种精确度?直观的想法是计算每个标签组合的混淆矩阵的分数,只保留最大值。有没有这样的函数

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


谢谢

您可以使用下面提到的链接中记录的sklearn.metrics.accurity

在下面提到的链接中可以看到一个例子


首先,
问题当然是,集群给出的标签与原始标签的顺序不匹配。
的意思是什么

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


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

  • 如果您有地面真实值标签,并且希望了解模型的准确性,那么您需要诸如兰德指数或预测和真实标签之间的互信息等指标。您可以在交叉验证方案中执行此操作,并查看模型的行为,即它是否能够正确预测交叉验证方案下的类/标签。预测优度的评估可以使用兰德指数等指标进行计算
总之:

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))
  • 定义Kmeans模型,使用交叉验证,并在每次迭代中估计赋值真标签之间的兰德指数(或互信息)。对所有迭代重复该步骤,最后取兰德指数分数的平均值。如果这个分数很高,那么这个模型就是好的

完整示例:

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))

由于集群是一个无监督的学习问题,因此您有特定的度量标准:

您可以参考《scikit学习用户指南》中的讨论,了解集群不同指标之间的差异:


例如,调整后的兰德指数将比较一对点,并检查如果这些标签在地面真相中是相同的,那么在预测中也是相同的。与准确度不同,您不能严格定义标签相等。

您所说的“混淆矩阵得分”是什么意思?谢谢!我还有几个问题:为什么我需要原始数据(在你的例子中是X)?我已经在我的数据集上试过了,我得到的准确度比随机猜测要差得多,而随机猜测肯定是错误的。总而言之,当我有10个集群时,为什么会得到三个不同的答案?再次感谢你!