【问题标题】:Determining accuracy for k-means clustering确定 k 均值聚类的准确性
【发布时间】:2018-12-21 13:06:06
【问题描述】:

我想使用 sklearns 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)

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

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

【问题讨论】:

标签: python scikit-learn k-means


【解决方案1】:

来自本博客的参考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)

【讨论】:

    【解决方案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

    【讨论】:

      【解决方案3】:

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

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

      这是我能想到的最好的方法。但是,这不是我们评估 custering 质量的方式,您可以使用一些指标,例如剪影系数。我希望我能帮上忙。

      【讨论】:

        猜你喜欢
        • 2020-06-15
        • 2019-08-17
        • 1970-01-01
        • 2014-07-24
        • 2017-12-30
        • 2015-03-22
        • 2015-02-09
        • 2017-12-30
        • 2017-01-15
        相关资源
        最近更新 更多