首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >确定k均值聚类的准确性

确定k均值聚类的准确性
EN

Stack Overflow用户
提问于 2018-07-13 15:52:16
回答 3查看 9.2K关注 0票数 4

我想使用sklearns k-means聚类函数对鸢尾花数据集(我去掉了标签,所以现在它是一个未标记的数据)进行分类。我已经建立了预测模型,输出似乎在很大程度上正确地对数据进行了分类,然而它是随机选择标签(0,1和2),我无法将其与我自己的标签进行比较来确定准确性(我将setosa标记为0,versicolor标记为1,virginica标记为2)。有没有办法给这些花贴上正确的标签?

代码如下:

代码语言:javascript
复制
from sklearn.cluster import KMeans
cluster = KMeans(n_clusters = 3)
cluster.fit(features)
pred = cluster.labels_
score = round(accuracy_score(pred, name_val), 4)
print('Accuracy scored using k-means clustering: ', score)

特征,正如预期的那样包含特征,name_val是包含花值的矩阵,0表示刚毛,1表示杂色,2表示维吉尼亚

编辑:我想出的一个解决方案是将random_state设置为任何数字,以便标签是恒定的,还有其他解决方案吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-07-13 19:10:40

您需要查看clustering metrics来评估您的预测,这些预测包括

  1. Homegenity Score
  2. V measure
  3. Completenss Score

现在以完整性分数为例,

如果作为给定类成员的所有数据点都是同一聚类的元素,则聚类结果满足完备性。

例如

代码语言:javascript
复制
from sklearn.metrics.cluster import completeness_score
print completeness_score([0, 0, 1, 1], [1, 1, 0, 0])
#Output : 1.0

这和你想要的差不多。对于您来说,代码应该是completeness_score(pred,name_val)。这里请注意,分配给数据点的标签并不重要,重要的是它们彼此之间的标签。

另一方面,同质性关注的是同一集群中数据点的质量。然而,V-度量被定义为2 * (homogeneity * completeness) / (homogeneity + completeness)

请在此处阅读官方文档:Homogenity, completeness and V-measure

票数 4
EN

Stack Overflow用户

发布于 2018-07-13 16:29:48

首先,你不是在对数据进行分类,而是对数据进行聚类。分类是一个不同的过程。

K-Means算法在选择初始聚类中心时包含随机性。通过设置random_state,您可以重现相同的聚类,因为初始聚类中心将是相同的。但是,这并不能解决您的问题。你想要的是id为0的集群是setosa,1是versicolor等等。这是不可能的,因为K-Means算法不知道这些类别,它只根据花的相似性对花进行分组。您可以做的是创建一个规则来确定哪个集群对应于哪个类别。例如,您可以说,如果属于某个集群的花的50%以上也属于setosa类别,则应该将该集群的文档与setosa类别中的文档集进行比较。

这是我能想到的最好的方法。然而,这不是我们评估客户质量的方式,有一些指标可以使用,例如轮廓系数。我希望我能帮上忙。

票数 4
EN

Stack Overflow用户

发布于 2021-06-02 17:12:20

参考这个博客https://smorbieu.gitlab.io/accuracy-from-classification-to-clustering-evaluation/,你需要用匈牙利算法从混淆矩阵中得到关系。代码如下:

代码语言:javascript
复制
from scipy.optimize import linear_sum_assignment as linear_assignment
def cluster_acc(y_true, y_pred):
    cm = metrics.confusion_matrix(y_true, y_pred)
    _make_cost_m = lambda x:-x + np.max(x)
    indexes = linear_assignment(_make_cost_m(cm))
    indexes = np.concatenate([indexes[0][:,np.newaxis],indexes[1][:,np.newaxis]], axis=-1)
    js = [e[1] for e in sorted(indexes, key=lambda x: x[0])]
    cm2 = cm[:, js]
    acc = np.trace(cm2) / np.sum(cm2)
    return acc

或仅导入库coclust

代码语言:javascript
复制
from coclust.evaluation.external import accuracy
accuracy(labels, predicted_labels)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51320227

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档