【问题标题】:Supervised Clustering - Metric to Evaluate Each Ground Truth Label?监督聚类 - 评估每个真实标签的指标?
【发布时间】:2020-06-26 05:27:54
【问题描述】:

我正在对数据集执行 K-means 聚类,但我有可用的地面实况标签。我在聚类过程中使用它们来查找 V-Measure 和 Adjusted Rand 分数以获得最佳 K。

为了评估我的最佳模型,我希望每个已知标签都有一个指标来描述它的聚类程度 - 几乎类似于纯度分数,但标签分布在多个集群中。

例如,标签 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

是否有人知道可用于评估聚类中每个基本事实标签的指标?这不必与我上面给出的示例相同。

【问题讨论】:

    标签: algorithm machine-learning statistics cluster-analysis


    【解决方案1】:

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

    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
    

    【讨论】:

      【解决方案2】:

      为什么不将调整后的兰特分数也用于此目的? 如果需要,您可以为每个集群计算它并在集群之间进行平均。 它忽略了排列,这对您的应用程序来说是一个优势

      【讨论】:

      • 如何为每个集群计算这个?在 scikit learn 中,尝试使用 adjusted_rand_score([0,0,0], [0,1,1]) 查找调整后的 Rand 分数会得到 0.0,除非第一个列表中至少有两个集群。
      猜你喜欢
      • 2017-06-15
      • 2020-08-27
      • 2020-07-04
      • 2023-03-25
      • 2021-01-29
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      相关资源
      最近更新 更多