Корректировка под случай при оценке качества кластеризации

Machine LearningMachine LearningBeginner
Практиковаться сейчас

This tutorial is from open-source community. Access the source code

💡 Этот учебник переведен с английского с помощью ИИ. Чтобы просмотреть оригинал, вы можете перейти на английский оригинал

Введение

Этот лаба исследует влияние равномерно распределенного случайного labeling на поведение некоторых метрик оценки кластеризации. Алгоритмы кластеризации в основном методы обучения без учителя, а метрики оценки используют информацию "с учителем" для количественной оценки качества получившихся кластеров. Однако, неадаптированные метрики оценки кластеризации могут быть ошибающими, так как они выдают большие значения для мелконастроенных labeling, которые могут быть совершенно случайными. Поэтому только адаптированные меры можно безопасно использовать в качестве индекса консенсуса для оценки средней стабильности алгоритмов кластеризации для заданного значения k на различных перекрывающихся подвыборках датасета.

Советы по работе с ВМ

После запуска ВМ нажмите в левом верхнем углу, чтобы переключиться на вкладку Notebook и получить доступ к Jupyter Notebook для практики.

Иногда вам может потребоваться подождать несколько секунд, пока Jupyter Notebook не загрузится полностью. Валидация операций не может быть автоматизирована из-за ограничений Jupyter Notebook.

Если вы сталкиваетесь с проблемами во время обучения, не стесняйтесь обращаться к Labby. Оставьте отзыв после занятия, и мы оперативно решим проблему для вас.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills ml/sklearn -.-> lab-49059{{"Корректировка под случай при оценке качества кластеризации"}} end

Определение списка метрик для оценки

Сначала мы определяем список метрик, которые будут использоваться для оценки алгоритмов кластеризации. Примерами таких метрик являются V-мера, индекс Рэнда, скорректированный индекс Рэнда (ARI), взаимная информация (MI), нормализованная взаимная информация (NMI) и скорректированная взаимная информация (AMI).

from sklearn import metrics

score_funcs = [
    ("V-мера", metrics.v_measure_score),
    ("Индекс Рэнда", metrics.rand_score),
    ("ARI", metrics.adjusted_rand_score),
    ("MI", metrics.mutual_info_score),
    ("NMI", metrics.normalized_mutual_info_score),
    ("AMI", metrics.adjusted_mutual_info_score),
]

Эксперимент 1 - фиксированные истинные метки и растущее количество кластеров

Мы создаем равномерно распределенное случайное labeling и используем функцию random_labels для создания фиксированного набора истинных меток (labels_a), распределенных по n_classes, а затем оцениваем несколько наборов случайно "предсказанных" меток (labels_b), чтобы оценить изменчивость заданной метрики при заданном n_clusters.

rng = np.random.RandomState(0)

def random_labels(n_samples, n_classes):
    return rng.randint(low=0, high=n_classes, size=n_samples)

def fixed_classes_uniform_labelings_scores(
    score_func, n_samples, n_clusters_range, n_classes, n_runs=5
):
    scores = np.zeros((len(n_clusters_range), n_runs))
    labels_a = random_labels(n_samples=n_samples, n_classes=n_classes)

    for i, n_clusters in enumerate(n_clusters_range):
        for j in range(n_runs):
            labels_b = random_labels(n_samples=n_samples, n_classes=n_clusters)
            scores[i, j] = score_func(labels_a, labels_b)
    return scores

Построение графиков результатов эксперимента 1

Мы строим графики результатов первого эксперимента с использованием библиотек matplotlib и seaborn. Индекс Рэнда достигает максимума при n_clusters > n_classes. Другие неадаптированные меры, такие как V-мера, показывают линейную зависимость между количеством кластеров и количеством образцов. Адаптированные под случай меры, такие как ARI и AMI, демонстрируют некоторую случайную вариацию вокруг среднего значения 0.0, независимо от количества образцов и кластеров.

import matplotlib.pyplot as plt
import seaborn as sns

n_samples = 1000
n_classes = 10
n_clusters_range = np.linspace(2, 100, 10).astype(int)
plots = []
names = []

sns.color_palette("colorblind")
plt.figure(1)

for marker, (score_name, score_func) in zip("d^vx.,", score_funcs):
    scores = fixed_classes_uniform_labelings_scores(
        score_func, n_samples, n_clusters_range, n_classes=n_classes
    )
    plots.append(
        plt.errorbar(
            n_clusters_range,
            scores.mean(axis=1),
            scores.std(axis=1),
            alpha=0.8,
            linewidth=1,
            marker=marker,
        )[0]
    )
    names.append(score_name)

plt.title(
    "Clustering measures for random uniform labeling\n"
    f"against reference assignment with {n_classes} classes"
)
plt.xlabel(f"Number of clusters (Number of samples is fixed to {n_samples})")
plt.ylabel("Score value")
plt.ylim(bottom=-0.05, top=1.05)
plt.legend(plots, names, bbox_to_anchor=(0.5, 0.5))
plt.show()

Эксперимент 2 - изменение количества классов и кластеров

В этом разделе мы определяем похожую функцию, которая использует несколько метрик для оценки двух равномерно распределенных случайных labeling. В этом случае количество классов и назначенное количество кластеров совпадают для каждого возможного значения в n_clusters_range.

def uniform_labelings_scores(score_func, n_samples, n_clusters_range, n_runs=5):
    scores = np.zeros((len(n_clusters_range), n_runs))

    for i, n_clusters in enumerate(n_clusters_range):
        for j in range(n_runs):
            labels_a = random_labels(n_samples=n_samples, n_classes=n_clusters)
            labels_b = random_labels(n_samples=n_samples, n_classes=n_clusters)
            scores[i, j] = score_func(labels_a, labels_b)
    return scores

Построение графиков результатов эксперимента 2

Мы строим графики результатов второго эксперимента с использованием библиотеки matplotlib. Мы наблюдаем сходные результаты, как и в первом эксперименте: скорректированные под случай метрики остаются постоянно близкими к нулю, в то время как другие метрики имеют тенденцию к увеличению при более детализированных labeling. Средняя V-мера случайного labeling увеличивается значительно, когда количество кластеров приближается к общему количеству образцов, используемых для вычисления метрики.

n_samples = 100
n_clusters_range = np.linspace(2, n_samples, 10).astype(int)

plt.figure(2)

plots = []
names = []

for marker, (score_name, score_func) in zip("d^vx.,", score_funcs):
    scores = uniform_labelings_scores(score_func, n_samples, n_clusters_range)
    plots.append(
        plt.errorbar(
            n_clusters_range,
            np.median(scores, axis=1),
            scores.std(axis=1),
            alpha=0.8,
            linewidth=2,
            marker=marker,
        )[0]
    )
    names.append(score_name)

plt.title(
    "Clustering measures for 2 random uniform labelings\nwith equal number of clusters"
)
plt.xlabel(f"Number of clusters (Number of samples is fixed to {n_samples})")
plt.ylabel("Score value")
plt.legend(plots, names)
plt.ylim(bottom=-0.05, top=1.05)
plt.show()

Обзор

В этом лабе исследовалось влияние равномерно распределенного случайного labeling на поведение некоторых метрик оценки кластеризации. Результаты показали, что неадаптированные метрики оценки кластеризации могут быть обманчивыми, и только скорректированные меры можно безопасно использовать в качестве индекса консенсуса для оценки средней стабильности алгоритмов кластеризации для заданного значения k на различных перекрывающихся подвыборках датасета.