确定k-means聚类的准确性

4
我想使用sklearn的k-means聚类函数对鸢尾花数据集进行分类(我去掉了标签,因此现在是无标签数据)。我已经制作了预测模型,输出似乎大部分情况下可以正确地对数据进行分类,但它随机选择标签(0、1和2),我无法将其与自己的标签进行比较以确定准确性(我已将setosa标记为0,versicolor标记为1,virginica标记为2)。有没有办法正确地标记这些花?以下是代码:
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表示setosa,1表示versicolor,2表示virginica。

编辑:我想到的一个解决方案是将random_state设置为任何数字,以便标记保持不变,还有其他解决方案吗?


k-means不是一个分类器。你在这里想要实现什么? - ypnos
这个回答解决了你的问题吗?sklearn:计算k-means在测试数据集上的准确率得分 - fuenfundachtzig
我认为这是你需要的措施,请查看链接:https://dev59.com/DJjga4cB1Zd3GeqPEg7n#71866136 - Science Man
3个回答

6

您需要查看聚类度量来评估您的预测结果,其中包括:

  1. 同质性得分
  2. V度量
  3. 完整性得分

现在以完整性得分为例,

如果聚类结果中给定类别的所有数据点都是同一簇的元素,则满足完整性。

例如

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-measure定义为2 * (homogeneity * completeness) / (homogeneity + completeness)

阅读官方文档:同质性、完整性和V-measure


4
首先,你正在进行数据聚类而不是分类。分类是一个不同的过程。
K-Means算法在选择初始群集中包含随机性。通过设置random_state,您可以重现相同的聚类,因为初始群集中心将是相同的。然而,这并不能解决你的问题。你想要的是id为0的簇成为setosa,1成为versicolor等等。这是不可能的,因为K-Means算法对这些类别没有任何了解,它只根据它们的相似性对花进行分组。你可以创建一个规则来确定哪个簇对应哪个类别。例如,你可以说如果属于一个簇的花中超过50%也属于setosa类别,则应该将这个簇的文档与setosa类别的文档集进行比较。
这是我能想到的最好的方法。然而,这不是我们评估聚类质量的方式,有一些指标可以使用,如轮廓系数。希望我能帮到你。

0

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

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

from coclust.evaluation.external import accuracy
accuracy(labels, predicted_labels)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接