我在一个数据集上进行K-means聚类,并且我有可用的真实标签。我在聚类过程中使用这些标签来找到最佳的K值,并计算了V-Measure和调整后的Rand分数。
为了评估我的最佳模型,我希望为每个已知标签提供一个指标,描述它被聚类的效果如何——几乎就像纯度分数,但适用于跨多个聚类的标签。
例如,标签0
有5个数据点,因此我们有以下情况:
true_labels = [0,0,0,0,0]
cluster_numbers = [1,1,1,1,1]
(即所有标签0
的点都在同一个聚类中)
–> 应返回完美的分数1.0
如果标签的点分布在多个聚类中,像这样
cluster_numbers = [0,0,0,1,1]
–> 返回分数0.6
有没有人知道可以用来评估聚类中每个真实标签的指标?这不必像我上面给出的例子那样工作。
回答:
我认为你可以尝试评估混淆矩阵并检查多数投票。例如,我们使用鸢尾花数据集:
from sklearn.datasets import load_irisfrom sklearn.cluster import SpectralClusteringfrom sklearn.metrics import confusion_matriximport pandas as pd data = load_iris()df = pd.DataFrame(data.data, columns=['sepal.length','sepal.width','petal.length','petal.width'])labels = data.target
然后我们进行谱聚类:
clustering = SpectralClustering(n_clusters=3,assign_labels="discretize",random_state=0).fit(df) M = confusion_matrix(labels,clustering.labels_) Marray([[ 0, 50, 0], [ 2, 0, 48], [37, 0, 13]])
对于每一行,你都有每个标签的预测。你上面提到的纯度是这样的:
np.max(M,axis=1)/np.sum(M,axis=1)array([1. , 0.96, 0.74])
如果你想要一个总体的一致性评分,你可以使用:
from sklearn.metrics import adjusted_rand_scoreadjusted_rand_score(labels,clustering.labels_)0.7436826319432357