Так что же такое кластеризация?

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

Существуют различные типы концепций кластеризации, но для простоты мы обсудим два из них:

Кластеризация на основе разделов

И

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

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

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

Начиная с загрузки наших любимых библиотек.

импортировать numpy как np

из sklearn.datasets импортировать load_breast_cancer

импортировать matplotlib.pyplot как plt

%matplotlib встроенный

И загружаем набор данных:

данные = load_breast_cancer()

X = данные.данные

у = данные.цель

Основная кластеризация разделов:

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

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

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

После каждого переназначения он пересчитывает центр этого кластера, и этот процесс повторяется до тех пор, пока переназначение точек данных не изменит центры кластеров.

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

из sklearn.cluster импортировать KMeans

км = KMeans (n_clusters = 2)

км.фит(Х)

метки = км.метки_

центры = km.cluster_centers_

Обратите внимание, что здесь мы выбрали количество кластеров равным 2, что ж, нам немного повезло, поскольку мы знаем количество классов, с которыми имеем дело. Что не так в сценарии реального мира. В этом случае мы должны использовать такие методы, как метод локтя и оценка силуэта.

Полученные метки выглядят как

[0 0 0 1 0 1 0 1 1 1]

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

Итак, вот полученные кластеры PCA

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

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

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

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

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

В scikit-learn у нас есть множество интерфейсов, таких как класс AgglomerativeClustering, для выполнения иерархической кластеризации. Агломеративная кластеризация — это иерархическая кластеризация с использованием подхода «снизу вверх», т. е. каждое наблюдение начинается в своем собственном кластере, и кластеры последовательно объединяются. Критерии слияния могут использоваться из набора возможных связей; выбор связи определяет стратегию слияния. Некоторыми примерами критериев связи являются Уорд, Полная связь, Средняя связь и так далее.

из scipy.cluster.hierarchy импортировать дендрограмму, связь

импортировать numpy как np

np.set_printoptions (подавить = Истина)

Z = связь (X, «опека»)

Если у вас есть n точек данных, матрица связи Z будет иметь форму (n — 1) x 4, где Z [i] сообщит нам, какие кластеры были объединены на i-й итерации.

Каждая строка состоит из четырех элементов, первые два элемента являются либо идентификаторами точек данных, либо метками кластеров (в более поздних частях матрицы после объединения нескольких точек данных), третий элемент представляет собой кластерное расстояние между первыми двумя элементами (любые точки данных или кластеры), а последний элемент — это общее количество элементов\точек данных в кластере после завершения слияния.

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

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

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

из scipy.cluster.hierarchy импортировать fcluster

макс_расстояние = 10000

hc_labels = fcluster (Z, max_dist, критерий = «расстояние»)

Вывод:

Мы определенно видим два разных кластера, но между двумя кластерами больше совпадений по сравнению с методом K-средних, и у нас больше неправильно помеченных экземпляров. Тем не менее, обратите внимание на номера на этикетках; здесь у нас есть 1 и 2 в качестве значений метки. Это просто для того, чтобы подчеркнуть тот факт, что значения меток предназначены только для различения кластеров и ничего не значат. Преимущество этого метода в том, что вам не нужно заранее вводить количество кластеров, и модель пытается найти его из базовых данных.

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