Подробное пошаговое руководство по применению агломеративной кластеризации к вашим данным

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

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

Введение

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

Агломеративная кластеризация или восходящая кластеризация по существу начинается с отдельного кластера (каждая точка данных рассматривается как отдельный кластер, также называемый листом), затем каждый кластер вычисляет свои расстояние друг с другом. Два кластера с наименьшим расстоянием друг от друга сливаются, образуя то, что мы назвали узлом. Вновь сформированные кластеры снова вычисляют член своего кластера, расстояние до другого кластера вне их кластера. Процесс повторяется до тех пор, пока все точки данных не будут назначены одному кластеру под названием root. Результатом является представление объектов в виде дерева, которое называется дендрограммой.

Просто для напоминания, хотя нам представлен результат того, как данные должны быть сгруппированы; Агломеративная кластеризация не дает точного количества способов кластеризации наших данных. Нам решать, где находится точка отсечения.

Давайте попробуем разбить каждый шаг более подробно. Для простоты я бы объяснил, как работает агломеративный кластер, только с помощью наиболее распространенного параметра.

Измерения расстояний

Мы начинаем процесс агломерационной кластеризации с измерения расстояния между точками данных. Как именно рассчитывается? Приведу пример с фиктивными данными.

#creating dummy data
import pandas as pd
dummy = pd.DataFrame([[30,100,5],
              [18, 200, 2],
              [35, 150, 7],
             [48, 300, 4],
             [50, 200, 6]], index = ['Anne', 'Ben', 'Chad', 'Dave', 'Eric'], columns =['Age', 'Expense($)', 'Distance(KM)'])

Допустим, у нас есть 5 разных людей с 3 разными непрерывными функциями, и мы хотим посмотреть, как мы могли бы сгруппировать этих людей. Первым делом нам нужно выбрать измерение расстояния кластеризации.

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

Евклидово расстояние в более простом выражении - это прямая линия от точки x до точки y. Я бы привел пример, используя пример расстояния между Анной и Беном из наших фиктивных данных.

В фиктивных данных у нас есть 3 объекта (или измерения), представляющие 3 различных непрерывных объекта. В этом случае мы могли бы вычислить евклидово расстояние между Анной и Беном, используя формулу ниже.

Если поставить все цифры, то будет.

Используя измерение евклидова расстояния, мы получаем 100,76 для евклидова расстояния между Анной и Беном. Точно так же применение измерения ко всем точкам данных должно привести к следующей матрице расстояний.

import numpy as np
from scipy.spatial import distance_matrix
#distance_matrix from scipy.spatial would calculate the distance between data point based on euclidean distance, and I round it to 2 decimal
pd.DataFrame(np.round(distance_matrix(dummy.values, dummy.values), 2), index = dummy.index, columns = dummy.index)

После этого мы объединяем наименьшее ненулевое расстояние в матрице, чтобы создать наш первый узел. В данном случае это Бен и Эрик.

С новым узлом или кластером нам нужно обновить нашу матрицу расстояний.

Теперь у нас есть новый кластер Бена и Эрика, но мы все еще не знаем расстояние между кластером (Бен, Эрик) и другой точкой данных. Как даже рассчитать новое расстояние между кластерами? Для этого нам нужно сначала настроить критерий связи.

Критерий связи

Критерием сцепления является то, где именно измеряется расстояние. Это правило, которое мы устанавливаем для определения расстояния между кластерами.

Существует множество критериев привязки, но на этот раз я бы использовал только простейшую привязку под названием Одинарная связь. Как это работает? Я бы показал это на картинке ниже.

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

Где расстояние между кластером X и кластером Y определяется минимальным расстоянием между x и y, которое является членом кластера X и Y соответственно.

Возьмем пример. Если мы применим критерий единственной связи к нашим фиктивным данным, скажем, между Анной и кластером (Бен, Эрик), это будет описано, как на картинке ниже.

С помощью единственного критерия связи мы получаем евклидово расстояние между Анной и кластером (Бен, Эрик), равное 100,76. Применение критерия единственной связи к нашим фиктивным данным приведет к следующей матрице расстояний.

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

Мы сохраняем событие слияния до тех пор, пока все данные не будут кластеризованы в один кластер. В итоге мы получили бы дендрограмму со всеми данными, которые были объединены в один кластер.

#importing linkage and denrogram from scipy
from scipy.cluster.hierarchy import linkage, dendrogram
import matplotlib.pyplot as plt
#creating dendrogram based on the dummy data with single linkage criterion
den = dendrogram(linkage(dummy, method='single'), 
labels = dummy.index)
plt.ylabel('Euclidean Distance', fontsize = 14)
plt.title('Dendrogram of the Dummy Data')
plt.show()

Определение количества кластеров

У нас уже есть дендрограмма, что нам с ней делать? Мы бы использовали его, чтобы выбрать номер кластера для наших данных. Помните, дендрограмма показывает нам только иерархию наших данных; это не совсем дает нам наиболее оптимальное количество кластеров.

Лучший способ определить количество кластеров - взглянуть на нашу дендрограмму и выбрать определенное значение в качестве точки отсечения (ручной способ). Обычно мы выбираем точку отсечения, которая пересекает самую высокую вертикальную линию. Я бы показал пример с картинками ниже.

Количество пересечений с вертикальной линией, сделанных горизонтальной линией, даст номер кластера.

Выбор точки отсечки на 60 даст нам 2 разных кластера (Дэйв и (Бен, Эрик, Энн, Чад)). Выбор другой точки отсечения также даст нам другой номер кластера. Например, если мы сдвинем точку отсечения на 52.

На этот раз с отсечкой на 52 мы получим 3 разных кластера (Дэйв, (Бен, Эрик) и (Энн, Чад)).

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

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

Модель агломеративной кластеризации

Допустим, я бы выбрал значение 52 в качестве точки отсечения. Значит, у меня получится 3 кластера. Обладая этими знаниями, мы могли бы реализовать это в модели машинного обучения.

from sklearn.cluster import AgglomerativeClustering
aglo = AgglomerativeClustering(n_clusters=3, affinity='euclidean', linkage='single')
aglo.fit_predict(dummy)

Модель агломеративной кластеризации выдала бы [0, 2, 0, 1, 2] в качестве результата кластеризации. Затем мы могли бы вернуть результат кластеризации фиктивным данным. В моем случае я назвал его «Агло-лейбл».

dummy['Aglo-label'] = aglo.fit_predict(dummy)

Теперь мои данные сгруппированы и готовы для дальнейшего анализа. Необходимо проанализировать результат, так как обучение без учителя позволяет сделать вывод только о шаблоне данных, но то, какой тип шаблона оно производит, требует более глубокого анализа.

Вывод

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

Шаги, которые предпринимает агломеративная кластеризация:

  1. Каждая точка данных назначается как отдельный кластер.
  2. Определите измерение расстояния и вычислите матрицу расстояний
  3. Определите критерии связывания для объединения кластеров.
  4. Обновите матрицу расстояний
  5. Повторяйте процесс, пока каждая точка данных не станет одним кластером.

Затем с помощью дендрограммы мы выбираем значение отсечения, чтобы получить номер кластера.

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

Я предоставляю GitHub ссылку на записную книжку здесь в качестве дополнительной ссылки.

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

Если вы не подписаны как Средний участник, рассмотрите возможность подписки через мой реферал.