Эта статья является частью серии «Наука о данных с помощью Python». Другие истории из этой серии вы можете найти ниже:



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

Сегодня мы рассмотрим, как выполнять кластерный анализ в Python.

Что такое кластерный анализ?

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

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

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

Алгоритмы кластеризации

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

  • Кластеризация K-средних. K-средних – это популярный алгоритм кластеризации на основе разделов, целью которого является разбиение набора данных на K кластеров. Алгоритм работает путем случайного выбора K точек данных в качестве центроидов, а затем назначает каждую точку данных ближайшему центроиду на основе метрики расстояния, такой как евклидово расстояние. Затем центроиды обновляются путем вычисления среднего значения всех точек данных, назначенных каждому кластеру. Процесс назначения точек данных и обновления центроидов повторяется до тех пор, пока центроиды не перестанут двигаться или не будет достигнуто максимальное количество итераций.
  • Иерархическая кластеризация. Иерархическая кластеризация — это древовидный алгоритм кластеризации, который рекурсивно делит набор данных на подмножества все более мелких кластеров. Различают два основных типа иерархической кластеризации: агломеративную и разделительную. Агломеративная кластеризация начинается с обработки каждой точки данных как отдельного кластера, а затем итеративно объединяет ближайшие пары кластеров до тех пор, пока все точки данных не будут принадлежать одному кластеру. Разделительная кластеризация начинается со всех точек данных в одном кластере, а затем рекурсивно делит кластеры на более мелкие подмножества, пока каждый кластер не будет содержать только одну точку данных.
  • Кластеризация DBSCAN: DBSCAN (Пространственная кластеризация приложений с шумом на основе плотности) — это алгоритм кластеризации на основе плотности, который идентифицирует плотные области точек данных, разделенные областями с меньшей плотностью. Алгоритм работает, определяя окрестности вокруг каждой точки данных на основе метрики расстояния и заданного пользователем параметра радиуса. Точки данных, которые находятся в пределах минимального числа точек данных, рассматриваются как основные точки и используются для формирования кластера. Точки данных, которые не находятся в окрестности базовой точки, считаются шумом.
  • Смешанные модели Гаусса (GMM). GMM – это алгоритм кластеризации на основе моделей, который предполагает, что точки данных генерируются из смеси распределений Гаусса. Алгоритм оценивает параметры распределений Гаусса, максимизируя вероятность точек данных. Каждая точка данных затем назначается распределению Гаусса, которое имеет наибольшую вероятность создания этой точки данных.

Построение моделей кластеризации в Python

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

Чтобы выполнить кластеризацию с помощью scikit-learn, нам сначала нужно импортировать необходимые модули:

from sklearn.cluster import KMeans, AgglomerativeClustering, DBSCAN
from sklearn.preprocessing import StandardScaler
from sklearn.decomposition import PCA

Затем мы можем загрузить данные в Pandas DataFrame и выполнить подготовку данных, включая очистку данных, масштабирование и выбор функций. Как только данные подготовлены, мы можем создать экземпляр алгоритма кластеризации и подогнать его к данным. Например, используя KMeans:

kmeans = KMeans(n_clusters=3)
kmeans.fit(data)

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

labels = kmeans.predict(new_data)

Пример

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

Предположим, у нас есть набор данных с двумя функциями, ростом и весом, и мы хотим сгруппировать данные в три группы на основе этих функций. Мы можем начать с загрузки данных в Pandas DataFrame:

import pandas as pd

data = pd.DataFrame({
    'height': [170, 168, 180, 175, 174, 172, 169, 177, 181, 178],
    'weight': [70, 65, 80, 73, 72, 68, 66, 76, 82, 79]
})

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

scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)

Затем мы можем создать экземпляр алгоритма кластеризации KMeans и подогнать его к данным:

kmeans = KMeans(n_clusters=3)
kmeans.fit(scaled_data)

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

new_data = pd.DataFrame({
    'height': [173, 179, 171],
    'weight': [71, 81, 67]
})

scaled_new_data = scaler.transform(new_data)

labels = kmeans.predict(scaled_new_data)

print(labels)  # Output: [0 2 0]

Тонкая настройка

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

  • Выбор оптимального количества кластеров. Количество кластеров является ключевым гиперпараметром в алгоритмах кластеризации. В кластеризации K-средних мы можем использовать метод локтя или оценку силуэта, чтобы определить оптимальное количество кластеров. При иерархической кластеризации мы можем использовать дендрограмму для определения оптимального количества кластеров.
  • Выбор функций. В некоторых случаях не все функции подходят для кластеризации. Мы можем использовать методы выбора функций, чтобы определить наиболее важные функции и удалить ненужные или избыточные функции.
  • Уменьшение размерности. Многомерные данные сложно кластеризовать, поэтому мы можем использовать методы уменьшения размерности, такие как PCA или t-SNE, чтобы уменьшить количество признаков.
  • Выбор алгоритма. Различные алгоритмы кластеризации имеют разные сильные и слабые стороны, поэтому мы можем попробовать разные алгоритмы, чтобы найти тот, который лучше всего подходит для наших данных.
  • Настройка гиперпараметров. Алгоритмы кластеризации имеют несколько гиперпараметров, которые можно настроить для повышения производительности, таких как метрика расстояния, метод связи и эпсилон DBSCAN.

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

Заключительное примечание

Теперь вы знаете, как решать проблемы кластеризации в Python.

В следующей статье мы увидим конкретный вариант использования. Не стесняйтесь следовать за мной, если вы не хотите пропустить это!

Чтобы ознакомиться с другими историями из этой серии, нажмите ниже!



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

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

Если вы еще не подписаны на среду и хотите поддержать меня или получить доступ ко всем моим историям, вы можете использовать мою ссылку: