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

    На этом шаге мы перечислим проблемы, возникающие при организации такой оценки.

    Несмотря на то, что мы только что показали один из способов оценить работу алгоритмов кластеризации, на практике использование метрик типа ARI сопряжено с большими проблемами. При использовании алгоритмов кластеризации, информация об истинных кластерах, с которой можно было бы сравнить полученные результаты, как правило, отсутствует. Если бы мы знали, как выглядит правильная кластеризация данных, мы могли бы использовать эту информацию, чтобы построить модель контролируемого обучения типа классификатора. Поэтому, использование таких показателей, как ARI и NMI, как правило, помогает в разработке алгоритмов, но не в оценке их эффективности с точки зрения конкретного применения.

    Существуют метрики кластеризации, которые не требуют знания истинных результатов кластеризации, например, силуэтный коэффициент (silhouette coefficient). Однако на практике они работают плохо. Силуэтная мера вычисляет компактность кластера, более высокое значение соответствует лучшему результату, идеальное значение равно 1. Несмотря на то, что компактные кластеры удобны, компактность не предполагает сложных форм.

    Ниже приведен пример сравнения результатов, полученных с помощью алгоритмов k-средних, агломеративной кластеризации и DBSCAN для набора two_moons, при этом использовалась силуэтная мера (рисунок 1):

[In 69]:
from sklearn.metrics.cluster import silhouette_score
X, y = make_moons(n_samples=200, noise=0.05, random_state=0)
# масштабируем данные так, чтобы получить нулевое среднее и единичную дисперсию
scaler = StandardScaler()
scaler.fit(X)
X_scaled = scaler.transform(X)
fig, axes = plt.subplots(1, 4, figsize=(15, 3), 
                         subplot_kw={'xticks': (), 'yticks': ()})

# случайно присваиваем точки двум кластерам для сравнения
random_state = np.random.RandomState(seed=0)
random_clusters = random_state.randint(low=0, high=0, size=len(X))
# выводим на графике результаты случайного присвоения кластеров
axes[0].scatter(X_scaled[:, 0], X_scaled[:, 1], c=random_clusters, 
                cmap=mglearn.cm3, s=60)
axes[0].set_title("Случайное присвоение кластеров: {:.2f}".format(
    silhouette_score(X_scaled, random_clusters)))
algorithms = [KMeans(n_clusters=2), AgglomerativeClustering(n_clusters=2),
              DBSCAN()]

for ax, algorithm in zip(axes[1:], algorithms):
    clusters = algorithm.fit_predict(X_scaled)
    # выводим на графике принадлежность к кластерам и центры кластеров
    ax.scatter(X_scaled[:, 0], X_scaled[:, 1], c=clusters, cmap=mglearn.cm3, s=60)
    ax.set_title("{} : {:.2f}".format(algorithm.__class__.__name__,
                                  silhouette_score(X_scaled, clusters)))


Рис.1. Сравнение результатов случайной кластеризации, k-средних, агломеративной кластеризации и DBSCAN для набора данных two_moons, использовался силуэтный коэффициент (более интуитивно понятный результат DBSCAN имеет меньшее значение силуэтного коэффициента, чем результат k-средних)

    Можно увидеть, что алгоритм k-средних получает самое высокое значение силуэтного коэффициента, хотя мы, возможно, предпочтем результаты, полученные с помощью алгоритма DBSCAN. Чуть более лучшая стратегия для оценки результатов кластеризации заключается в использовании метрик кластеризации на основе робастности (robustness-based clustering metrics). Эти метрики запускают алгоритм после добавления некоторого шума в данные или применяют различные настройки параметров, а затем сравнивают полученные результаты. Идея заключается в том, что если разные значения параметров и разные возмущения данных возвращают один и тот же результат, ему, вероятно, можно доверять. К сожалению, на данный момент эта стратегия не была реализована в scikit-learn.

    Даже если мы получим очень робастные результаты кластеризации или очень высокое значение силуэтной меры, у нас по-прежнему будет отсутствовать информация о том, несут ли результаты кластеризации какой-то содержательный смысл, отражают ли они те аспекты данных, которые нас интересуют. Давайте вернемся к примеру с изображениями лиц. Мы надеемся выделить группы схожих между собою лиц, скажем, мужчин и женщин, либо пожилых и молодых, или людей с бородой и без бороды. Допустим, мы сгруппировали данные в два кластера, и все алгоритмы единодушны о том, какие точки данных должны быть объединены в кластеры. Мы по-прежнему не знаем, соответствуют ли найденные кластеры интересующим нас гипотезам. Вполне возможно, что они выделили лица в профиль и лица в анфас или снимки, сделанные в ночное время, и снимки, сделанные днем, фото, сделанные с айфонов и фото, сделанные с телефонов с операционной системой Android. Единственный способ узнать, соответствует ли кластеризация интересующей нас информации, проанализировать кластеры вручную.

    На следующем шаге мы рассмотрим сравнение работы алгоритмов на наборе изображений лиц.




Предыдущий шаг Содержание Следующий шаг