监督聚类 - 评估每个真实标签的度量?

4
我正在对数据集执行K-means聚类,但我有可用的真实标签。在聚类期间,我使用它们来找到V-Measure和Adjusted Rand分数以获取最佳K。
为了评估我的最佳模型,我想要一个每个已知标签的度量,描述它如何被聚类 - 类似于Purity分数,但用于跨多个聚类的标签。
例如,标签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的分数
有人知道可以用来评估聚类中每个真实标签的指标吗?这不必像上面给出的示例那样运作。
2个回答

3

我认为您可以尝试评估混淆矩阵并检查多数投票。例如,我们使用鸢尾花数据集:

from sklearn.datasets import load_iris
from sklearn.cluster import SpectralClustering
from sklearn.metrics import confusion_matrix
import 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_)
    
M
array([[ 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_score
adjusted_rand_score(labels,clustering.labels_)
0.7436826319432357

1
为什么不同时使用调整兰德指数?您可以对每个集群进行计算,如果需要,还可以对集群进行平均。它忽略了排列,这对您的应用程序是一个优势。

我如何为每个聚类计算这个值?在scikit learn中,尝试使用adjusted_rand_score([0,0,0], [0,1,1])来查找调整后的Rand分数,除非第一个列表中至少有两个聚类,否则会得到0.0 - gregory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接