Предыдущий ‹‹ Обучение и оценка моделей кластеризации (1/2)

Существует несколько алгоритмов, которые можно использовать для кластеризации. Одним из наиболее часто используемых алгоритмов является Кластеризация K-средних, который в своей простейшей форме состоит из следующих шагов:

  1. Значения объектов векторизуются для определения n-мерных координат (где n — количество объектов). В примере с цветком у нас есть две характеристики: количество лепестков и количество листьев. Итак, вектор признаков имеет две координаты, которые мы можем использовать для концептуального построения точек данных в двумерном пространстве.
  2. Вы решаете, сколько кластеров вы хотите использовать для группировки цветов, и называете это значение k. Например, чтобы создать три кластера, вы должны использовать значение k, равное 3. Тогда точки k будут отображаться в случайных координатах. Эти точки становятся центральными точками каждого кластера, поэтому их называют центроидами.
  3. Каждой точке данных (в данном случае цветку) присваивается ближайший к ней центроид.
  4. Каждый центроид перемещается в центр назначенных ему точек данных на основе среднего расстояния между точками.
  5. После перемещения центроида точки данных теперь могут оказаться ближе к другому центроиду, поэтому точки данных переназначаются кластерам на основе нового ближайшего центроида.
  6. Шаги перемещения центроида и перераспределения кластеров повторяются до тех пор, пока кластеры не станут стабильными или не будет достигнуто заданное максимальное количество итераций.

Следующая анимация демонстрирует этот процесс:

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

Например, если применить кластеризацию к значениям слов, мы можем получить группу, содержащую прилагательные, специфичные для эмоций («злой», «счастливый» и т. д.). Эта группа принадлежит к группе, содержащей все прилагательные, относящиеся к человеку («счастливый», «красивый», «молодой»), которая принадлежит к еще более высокой группе, содержащей все прилагательные («счастливый», «зеленый», «красивый», тяжело» и т. д.).

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

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

Для начала запустите ячейку ниже, чтобы загрузить наши данные:

import pandas as pd

# load the training dataset
!wget https://raw.githubusercontent.com/MicrosoftDocs/mslearn-introduction-to-machine-learning/main/Data/ml-basics/seeds.csv
data = pd.read_csv('seeds.csv')

# Display a random sample of 10 observations (just the features)
features = data[data.columns[0:6]]
features.sample(10)

from sklearn.preprocessing import MinMaxScaler
from sklearn.decomposition import PCA

# Normalize the numeric features so they're on the same scale
scaled_features = MinMaxScaler().fit_transform(features[data.columns[0:6]])

# Get two principal components
pca = PCA(n_components=2).fit(scaled_features)
features_2d = pca.transform(scaled_features)
features_2d[0:10]
array([[ 0.11883593, -0.09382469],
       [ 0.0696878 , -0.31077233],
       [-0.03499184, -0.37044705],
       [-0.06582089, -0.36365235],
       [ 0.32594892, -0.37695797],
       [-0.02455447, -0.31060184],
       [-0.00769646, -0.07594931],
       [-0.05646955, -0.26696284],
       [ 0.38196305, -0.05149471],
       [ 0.35701044, -0.17697998]])

Кластеризация K-средних

Для создания тестовых кластеров мы использовали алгоритм K-Means. Это широко используемый алгоритм кластеризации, который разделяет набор данных на K кластеров с одинаковой дисперсией. Количество кластеров K определяется пользователем. Базовый алгоритм состоит из следующих шагов:

  1. Набор K центроидов выбирается случайным образом.
  2. Кластеры формируются путем присвоения точек данных их ближайшему центроиду.
  3. Вычисляются средние значения каждого кластера, а центроид перемещается к среднему значению.
  4. Шаги 2 и 3 повторяются до тех пор, пока не будет выполнен критерий остановки. Обычно алгоритм завершает работу, когда каждая новая итерация приводит к незначительному перемещению центроидов и кластеры становятся статичными.
  5. Когда кластеры перестают изменяться, алгоритм сходится, определяя расположение кластеров. Обратите внимание, что случайная начальная точка для центроидов означает, что повторный запуск алгоритма может привести к несколько другим кластерам, поэтому обучение обычно включает в себя несколько итераций, каждый раз заново инициализируя центроиды, и выбирается модель с лучшим WCSS.

Давайте попробуем использовать K-средние для наших исходных данных со значением K, равным 3.

from sklearn.cluster import KMeans

# Create a model based on 3 centroids
model = KMeans(n_clusters=3, init='k-means++', n_init=100, max_iter=1000)
# Fit to the data and predict the cluster assignments for each data point
km_clusters = model.fit_predict(features.values)
# View the cluster assignments
km_clusters
array([2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 2, 2, 1, 2, 2,
       2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 1, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 1, 1, 1, 1, 2, 2,
       2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0,
       2, 2, 2, 2, 0, 2, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1], dtype=int32)

Давайте посмотрим на эти назначения кластеров с двумерными точками данных.

import matplotlib.pyplot as plt
%matplotlib inline

def plot_clusters(samples, clusters):
    col_dic = {0:'blue',1:'green',2:'orange'}
    mrk_dic = {0:'*',1:'x',2:'+'}
    colors = [col_dic[x] for x in clusters]
    markers = [mrk_dic[x] for x in clusters]
    for sample in range(len(clusters)):
        plt.scatter(samples[sample][0], samples[sample][1], color = colors[sample], marker=markers[sample], s=100)
    plt.xlabel('Dimension 1')
    plt.ylabel('Dimension 2')
    plt.title('Assignments')
    plt.show()

plot_clusters(features_2d, km_clusters)

Будем надеяться, что данные были разделены на три отдельных кластера.

Так в чем же практическая польза кластеризации? В некоторых случаях у вас могут быть данные, которые необходимо сгруппировать в отдельные кластеры, не зная, сколько кластеров существует и что они обозначают. Иногда кластеризация используется как начальный шаг к созданию модели классификации. Вы начинаете с определения отдельных групп точек данных, а затем присваиваете этим кластерам метки классов. Затем вы можете использовать эти помеченные данные для обучения модели классификации.

В случае данных о семенах различные виды семян уже известны и закодированы как 0 (Кама), 1 (Роза) или 2 (Канадская ), поэтому мы можем использовать эти идентификаторы для сравнения классификаций видов с кластерами, определенными нашим неконтролируемым алгоритмом.

seed_species = data[data.columns[7]]
plot_clusters(features_2d, seed_species.values)

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

Иерархическая кластеризация

Методы иерархической кластеризации делают меньше предположений о распределении по сравнению с методами K-средних. Однако методы K-средних, как правило, более масштабируемы, а иногда и очень масштабируемы.

Иерархическая кластеризация создает кластеры либо методом разделения, либо агломеративнымметодом. Метод разделения представляет собой подход «сверху вниз», начиная со всего набора данных, а затем поэтапно находя разделы. Агломеративная кластеризация представляет собой подход «снизу вверх». В этом блокноте вы будете работать с агломеративной кластеризацией, которая работает примерно следующим образом:

  1. Расстояния связи между каждой из точек данных вычисляются.
  2. Точки группируются попарно со своим ближайшим соседом.
  3. Расстояния связей между кластерами вычисляются.
  4. Кластеры попарно объединяются в более крупные кластеры.
  5. Шаги 3 и 4 повторяются до тех пор, пока все точки данных не окажутся в одном кластере.

Функция связи может быть вычислена несколькими способами:

  • Связь между районами измеряет увеличение дисперсии для связанных кластеров.
  • Средняя связь использует среднее попарное расстояние между членами двух кластеров.
  • Полная или максимальная связь использует максимальное расстояние между членами двух кластеров.

Для вычисления функций связи используются несколько различных метрик расстояния:

  • Евклидово расстояние или расстояние l2 является наиболее широко используемым. Эта метрика является выбором только для метода связи Уорда.
  • Манхэттенское расстояние или расстояние l1 устойчиво к выбросам и обладает другими интересными свойствами.
  • Косинусное сходство - это скалярное произведение векторов местоположения, деленное на величины векторов. Обратите внимание, что эта метрика является мерой сходства, тогда как две другие метрики являются мерой различия. Сходство может быть весьма полезным при работе с такими данными, как изображения или текстовые документы.

Агломеративная кластеризация

from sklearn.cluster import AgglomerativeClustering

agg_model = AgglomerativeClustering(n_clusters=3)
agg_clusters = agg_model.fit_predict(features.values)
agg_clusters
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0,
       0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0,
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0,
       0, 0, 0, 2, 0, 0, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 0, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 0, 1, 1, 1, 1, 0, 1, 1,
       0, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0,
       2, 0, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2])

Так как же выглядят назначения агломеративных кластеров?

import matplotlib.pyplot as plt

%matplotlib inline

def plot_clusters(samples, clusters):
    col_dic = {0:'blue',1:'green',2:'orange'}
    mrk_dic = {0:'*',1:'x',2:'+'}
    colors = [col_dic[x] for x in clusters]
    markers = [mrk_dic[x] for x in clusters]
    for sample in range(len(clusters)):
        plt.scatter(samples[sample][0], samples[sample][1], color = colors[sample], marker=markers[sample], s=100)
    plt.xlabel('Dimension 1')
    plt.ylabel('Dimension 2')
    plt.title('Assignments')
    plt.show()

plot_clusters(features_2d, agg_clusters)

Приятного обучения!