确定k均值聚类的准确性

时间:2018-07-13 07:52:16

标签: python scikit-learn k-means

我想使用sklearns k-means聚类函数对鸢尾花数据集进行分类(尽管我删除了标签,所以现在是未标签的数据)。我已经建立了预测模型,并且输出似乎在很大程度上对数据进行了正确分类,但是它是随机选择标签(0、1和2),因此我无法将其与自己的标签进行比较以确定准确性(I已将setosa标记为0,杂色标记为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是包含花值的矩阵,setosa为0,杂色为1,virginica为2

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

3 个答案:

答案 0 :(得分:4)

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

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

这是我想到的最好的方法。但是,这不是我们评估刻划质量的方法,您可以使用一些度量标准,例如轮廓系数。希望我能帮上忙。

答案 1 :(得分:2)

您需要查看clustering metrics来评估您的谓词,其中包括

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

现在以完整性得分为例,

  

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

例如

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)

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

答案 2 :(得分: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)