You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无真实标签时,如何计算亲和传播聚类的Adjusted Rand Index?

如何在无真实标签的情况下计算亲和传播的调整兰德指数(ARI)

首先得明确:调整兰德指数(ARI)的核心是对比真实聚类标签和模型预测标签的匹配度,没有真实标签的话,直接计算ARI是不可能的。不过针对你的短文本场景,有几个可行的解决思路:


1. 手动标注真实标签(最可靠的方案)

你的数据集看起来都是短文本(比如查询词),标注成本其实很低。你可以:

  • 先定义好聚类规则:比如把所有包含"Youtube"的句子归为一类,"Facebook"相关的归为另一类,以此类推。
  • 给全部或者部分样本标注真实标签(如果数据量很大,随机选20%-30%的样本标注也足够评估)。
  • 标注完成后,用sklearn的adjusted_rand_score计算ARI:
    from sklearn.metrics import adjusted_rand_score
    
    # 假设你已经有了真实标签数组true_labels,模型输出的预测标签是labels
    ari_score = adjusted_rand_score(true_labels, labels)
    print(f"Adjusted Rand Index: {ari_score}")
    

比如你的样例数据:["Youtube", "Facebook", "Whatsapp", "Open Youtube"],真实标签可以设为[0,1,2,0],如果模型预测的标签也是[0,1,2,0],那ARI就是1.0,代表聚类完全准确。


2. 用启发式规则生成「伪真实标签」

如果不想手动标注,可以基于文本内容自动生成伪标签,适合你的短文本场景:
比如根据关键词匹配来分配标签,代码示例:

def generate_pseudo_labels(sentences):
    # 自定义关键词和对应的标签
    keyword_label_map = {
        "Youtube": 0,
        "Facebook": 1,
        "Whatsapp": 2
    }
    pseudo_labels = []
    for sent in sentences:
        # 默认标签(无匹配关键词的样本)
        label = -1
        # 检查句子是否包含目标关键词
        for keyword, lbl in keyword_label_map.items():
            if keyword.lower() in sent.lower():
                label = lbl
                break
        pseudo_labels.append(label)
    return pseudo_labels

# 生成伪标签后计算ARI
true_labels = generate_pseudo_labels(sentences)
ari_score = adjusted_rand_score(true_labels, labels)

注意:这种方法依赖关键词的准确性,如果句子存在多关键词重叠或者歧义,需要调整规则(比如优先匹配更长的关键词)。


3. 改用无需真实标签的聚类评估指标

如果实在没办法获取真实标签,不如放弃ARI,改用内部聚类评估指标——这类指标只基于数据本身的聚类结果,不需要真实标签:

  • 轮廓系数(Silhouette Score):衡量样本与自身簇内样本的相似度,以及与其他簇样本的差异度,取值范围[-1,1],越接近1说明聚类效果越好。
    from sklearn.metrics import silhouette_score
    # tf_idf_matrix是你之前生成的TF-IDF矩阵
    silhouette_avg = silhouette_score(tf_idf_matrix, labels)
    
  • Calinski-Harabasz指数:计算簇内离散度和簇间离散度的比值,数值越大说明簇内越紧凑、簇间越分离。
    from sklearn.metrics import calinski_harabasz_score
    ch_score = calinski_harabasz_score(tf_idf_matrix.toarray(), labels)
    
  • Davies-Bouldin指数:衡量簇间相似度的平均值,取值越小说明聚类效果越好。
    from sklearn.metrics import davies_bouldin_score
    db_score = davies_bouldin_score(tf_idf_matrix.toarray(), labels)
    

另外提一句:你当前的亲和传播代码用了预计算的相似度矩阵,调整damping或者preference参数可以改变聚类的数量和效果,结合上面的评估指标一起调参,能得到更优的聚类结果。

内容的提问来源于stack exchange,提问作者Sonal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:15:17