Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python k-均值聚类精度的确定_Python_Scikit Learn_K Means - Fatal编程技术网

Python k-均值聚类精度的确定

Python k-均值聚类精度的确定,python,scikit-learn,k-means,Python,Scikit Learn,K Means,我想使用skk-means聚类函数对虹膜花数据集进行分类(虽然我去掉了标签,所以现在它是一个未标记的数据)。我已经建立了预测模型,输出似乎在很大程度上正确地对数据进行了分类,但它是随机选择标签(0、1和2),我无法将其与我自己的标签进行比较以确定准确性(我已将setosa标记为0,VersionColor标记为1,virginica标记为2)。有没有办法给这些花贴上正确的标签 代码如下: from sklearn.cluster import KMeans cluster = KMeans(n_

我想使用skk-means聚类函数对虹膜花数据集进行分类(虽然我去掉了标签,所以现在它是一个未标记的数据)。我已经建立了预测模型,输出似乎在很大程度上正确地对数据进行了分类,但它是随机选择标签(0、1和2),我无法将其与我自己的标签进行比较以确定准确性(我已将setosa标记为0,VersionColor标记为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算法在选择初始聚类中心时考虑了随机性。通过设置random_状态,您可以复制相同的群集,因为初始群集中心将相同。但是,这并不能解决您的问题。您想要的是id为0的簇被设置为setosa,id为1的簇被设置为versicolor等。这是不可能的,因为K-Means算法不知道这些类别,它只根据花的相似性对花进行分组。您可以做的是创建一个规则来确定哪个集群对应于哪个类别。例如,您可以说,如果属于一个簇的花中有50%以上也在setosa类别中,那么该簇的文档应该与setosa类别中的文档集进行比较


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

你需要看一下以评估你的倾向,包括

  • 等等
  • 现在以完整性得分为例

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

    比如说

    from sklearn.metrics.cluster import completeness_score
    print completeness_score([0, 0, 1, 1], [1, 1, 0, 0])
    #Output : 1.0
    
    和你想要的差不多。对于您来说,代码将是完整性评分(pred,name\u val)。这里需要注意的是,指定给数据点的标签并不重要,而是它们之间的标签很重要

    另一方面,同质性关注同一集群内数据点的质量。鉴于,V-度量定义为
    2*(同质性*完整性)/(同质性+完整性)

    请阅读此处的官方文档:

    此博客的参考资料 您需要使用匈牙利算法从混淆矩阵中获得关系。 代码如下:

    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)
    

    k-means不是一个分类器。你想在这里实现什么?这是否回答了你的问题?