Сравните кластеры с наземной истиной - PullRequest
1 голос
/ 28 мая 2020

Я столкнулся с проблемой при сравнении результатов моей кластеризации 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 для оценки (вычисление коэффициентов) неверны, но я действительно не вижу, в чем моя ошибка (если таковая имеется).

1 Ответ

0 голосов
/ 30 мая 2020

Я бы рекомендовал использовать NMI- или AMI-score .

Оценка AMI или (Скорректированная взаимная информация) масштабируется таким образом, что случайная кластеризация имеет оценку 0. NMI (Нормализованная взаимная информация) используется для случаев, когда у вас есть другое количество кластеров и, следовательно, часто золотой стандарт в сообществе кластеризации.

Обе меры находятся в диапазоне от 0 до 1, где 0 считается случайной кластеризацией, а 1 полностью соответствует основному истине.

Существуют также другие меры, такие как F-мера или чистота.

Я не уверен, почему в вашей «основной правде» существует много разных ярлыков, но, вероятно, вы можете провести большинство голосов по этим ярлыкам, чтобы соблюсти одну основную истину.

...