Python 将集群与地面真相进行比较
在比较HAC聚类结果与手动标记文档的基本事实时,我遇到了一个问题 整个数据集由9k份文档组成,而基本事实为100份;最后一个允许使用多标签,而集群过程仅将文档分配给一个集群。 它们都被加载到一个数据帧中 集群Python 将集群与地面真相进行比较,python,cluster-analysis,hierarchical-clustering,Python,Cluster Analysis,Hierarchical Clustering,在比较HAC聚类结果与手动标记文档的基本事实时,我遇到了一个问题 整个数据集由9k份文档组成,而基本事实为100份;最后一个允许使用多标签,而集群过程仅将文档分配给一个集群。 它们都被加载到一个数据帧中 集群 id label 0 1 1 4 2 9 .... 9k 3 基本事实 id label1 label2 label3 ... labeln 0
id label
0 1
1 4
2 9
....
9k 3
基本事实
id label1 label2 label3 ... labeln
0 0 1 0 1
1 1 0 1 ... 0
.....
100 0 0 0 ...... 0
列中的“1”表示具有该ID的文档已分配给该(或那些)标签
集群的数量等于标签的数量(由用户指定),比如-->14
现在我要做的是:
# computes all possible pairs
def all_pairs(partition):
return list(itertools.combinations(partition, 2))
# main
indexes = list(map(int, ground_truth['id'].values.tolist()))
# reduce clusters_file matching only manually analyzed documents:
reduced_df = clusters.loc[clusters['id'].isin(indexes), :]
clusters_groups = reduced_df.groupby('label')
clusters_k = len(clusters_groups)
for label, df_group in clusters_groups:
docs_in_cluster = df_group['id'].values.tolist()
pairs_docs_in_cluster = all_pairs(docs_in_cluster)
intersection_list = []
for col in self.ground_truth.columns[1:]:
# get pairs for this columns/label
constraints = list(
map(int, ground_truth.loc[ground_truth[col] == 1, 'id'].values.tolist())
)
pairs_constraints = all_pairs(constraints)
# find sets intersection (of pairs) between current cluster and ground_truth
intersection = list(set(pairs_constraints) & set(pairs_docs_in_cluster))
if len(intersection) > 0:
# concatenate with other labels from ground_truth
intersection_list += intersection
ratio = len(intersection_list) / len(pairs_docs_in_cluster) * 100
print("Cluster: ", label, "[{}] elements".format(df_group.shape[0]),
'matched {} unique pairs'.format(len(intersection_list)), "--> {:.2f} %".format(ratio))
我得到的结果是:
Automatic clustering: 8469 elements and k=14 clusters
Ground Truth: 107 elements and m=14 labels
Cluster: 0 [29] elements matched 111 unique pairs --> 27.34 %
Cluster: 1 [5] elements matched 1 unique pairs --> 10.00 %
Cluster: 2 [1] elements matched 0 unique pairs --> 0.00 %
Cluster: 3 [1] elements matched 0 unique pairs --> 0.00 %
Cluster: 4 [9] elements matched 5 unique pairs --> 13.89 %
Cluster: 5 [6] elements matched 2 unique pairs --> 13.33 %
Cluster: 6 [13] elements matched 27 unique pairs --> 34.62 %
Cluster: 7 [2] elements matched 0 unique pairs --> 0.00 %
Cluster: 8 [4] elements matched 3 unique pairs --> 50.00 %
Cluster: 9 [3] elements matched 0 unique pairs --> 0.00 %
Cluster: 10 [2] elements matched 0 unique pairs --> 0.00 %
Cluster: 11 [8] elements matched 2 unique pairs --> 7.14 %
Cluster: 12 [6] elements matched 10 unique pairs --> 66.67 %
Cluster: 13 [17] elements matched 29 unique pairs --> 21.32 %
这很糟糕,但如果我检查聚类结果,它们看起来并没有那么糟糕。
因此,我认为我的评估指标(比率计算)是错误的,但我真的看不出我的错误在哪里(如果有)。我建议使用或 对AMI或(调整后的互信息)分数进行重新缩放,以使随机聚类的分数为0。NMI(规范化互信息)用于集群数量不同的情况,因此通常是集群社区的黄金标准 这两个度量值的范围都在0和1之间,其中0被视为随机聚类,1与基本事实完全匹配 还有其他措施,如F-措施或纯度
我不确定,为什么在你们的“基本事实”中有许多不同的标签,但也许你们可以对这些标签进行多数投票,以观察一个基本事实 你的基本真相有n列。这是因为n个人,他们手动标记他们吗?谢谢你的回答。我的教授给我的基本事实贴上了标签,他说每个文档的主题都是关于该领域的知识(实时系统文档),假设文档可以属于多个主题。你如何看待一个混淆矩阵的分析?如果你想到一个混淆矩阵,那么我会建议F测度(或者F1分数),因为这是精确和回忆之间的关系。但是因为我的GT是由100个文档组成的,所以我必须只考虑那些来自DataSet的文档吗?好吧,这对我来说还不清楚。你可以用你对其他真相进行聚类的相同方法对基本真相进行聚类。然后,您可以根据此测试集评估您的方法的集群性能。尽管如此,您需要确定n列中的哪一列是正确的。我试图解释:我有一个9k文档的语料库,在这个语料库上我与Kmeans进行了集群会话。之后,我手动阅读了100份文件,我说:“好的,这篇文章讲的是‘实时调度’,另一篇讲的是‘数据库’和‘抢占式调度’,等等。。。在那之后,我运行上面的所有代码来检查我说过的有多少文档必须放在一起,实际上在某个集群中放在一起。