Я столкнулся с проблемой при сравнении результатов моей кластеризации HA C с достоверностью документов, помеченных вручную.
Весь набор данных состоит из 9 тыс. 100; последний позволяет использовать несколько меток, в то время как процесс кластеризации присваивает документ только одному кластеру. Оба они загружаются в фрейм данных pandas.
Кластеры
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' в столбце означает, что документу с этим идентификатором назначена эта (или те) метка (или метки).
Количество кластеров равно количеству меток (назначенных user), скажем -> 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 %
Это довольно плохо , но если я проверил результаты кластеризации, они выглядят не так плохо. Таким образом, я думаю, что мои метри c для оценки (вычисление коэффициентов) неверны, но я действительно не вижу, в чем моя ошибка (если таковая имеется).