scikit-learn - 聚类算法的准确性是多少?
问题描述
我有一组使用聚类算法(在本例中为 k-means)聚类的点。我也知道真实标签,我想衡量我的聚类有多准确。我需要的是找到实际的准确性。当然,问题在于聚类给出的标签与原始标签的顺序不匹配。
有没有办法测量这种准确性?直观的想法是计算每个标签组合的混淆矩阵的分数,并且只保留最大值。有没有这样做的功能?
我还使用 rand 分数和调整后的 rand 分数评估了我的结果。这两个指标与实际准确度有多接近?
谢谢!
解决方案
首先,是什么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))
推荐阅读
- python - 后端更改后如何更新Django的模板
- laravel - 在 laravel 上使用 get 和 first 时模型和查询构建器方法的区别?
- c# - Unity 在运行时使用导入器翻转 obj 中的 x 坐标
- angularjs - ng-change 事件只能在输入完成后调用
- node.js - Redux:在做其他事情之前等待状态变化
- hazelcast-jet - Jet map 聚合性能瓶颈:如何避免本地记录的序列化?
- time-complexity - 一般来说,将 n 个元素发送到 p 个处理器的 MPI_Scatter 和 MPI_Bcast 的运行时间是多少
- api - cURL 请求抛出“格式不正确的请求”错误
- c# - C# Dictionary ContainsKey 与 Keys.Any()
- silverstripe - 如何构建用于模块开发和测试的 Silverstripe 环境?