Python k-均值聚类精度的确定
我想使用skk-means聚类函数对虹膜花数据集进行分类(虽然我去掉了标签,所以现在它是一个未标记的数据)。我已经建立了预测模型,输出似乎在很大程度上正确地对数据进行了分类,但它是随机选择标签(0、1和2),我无法将其与我自己的标签进行比较以确定准确性(我已将setosa标记为0,VersionColor标记为1,virginica标记为2)。有没有办法给这些花贴上正确的标签 代码如下: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_
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不是一个分类器。你想在这里实现什么?这是否回答了你的问题?