Читать книгу «Алгоритмы машинного обучения: базовый курс» онлайн полностью📖 — Тайлера Венс — MyBook.

Глава 5. Несувервизорное обучение

– Кластеризация: алгоритмы K-means и DBSCAN

– Снижение размерности: PCA

– Пример: сегментация данных


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

В отличие от супервайзного обучения, где модель обучается на размеченных данных (где есть входные параметры и правильные ответы), несупервайзное обучение работает без заранее определённых меток. Оно помогает выявлять скрытые структуры в данных, группировать похожие объекты и уменьшать размерность данных, чтобы упростить их анализ.

В этой главе мы разберём два ключевых направления несупервайзного обучения:

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

– Снижение размерности, которое помогает упростить анализ данных, убирая лишние признаки. Мы разберём метод PCA (анализ главных компонент), который позволяет визуализировать многомерные данные и находить в них основные закономерности.

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

Кластеризация: алгоритмы K-means и DBSCAN

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

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

Алгоритм K-means

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

Процесс работы алгоритма можно представить как многократное распределение объектов по кластерам и пересчёт центроидов (средних значений) каждого кластера. Начинается всё с того, что случайным образом выбираются начальные центроиды. Затем каждый объект данных назначается к ближайшему центроиду. После этого алгоритм пересчитывает новые центроиды, исходя из данных, которые к ним были отнесены. Этот процесс повторяется до тех пор, пока центроиды не перестанут изменяться, или изменения будут незначительными.

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

Алгоритм DBSCAN

В отличие от K-means, алгоритм DBSCAN (Density-Based Spatial Clustering of Applications with Noise) не требует указания числа кластеров заранее. Этот алгоритм основан на плотности объектов в пространстве. DBSCAN пытается группировать объекты, которые находятся в областях с высокой плотностью, и отделяет их от областей с низкой плотностью, которые могут считаться выбросами.

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

Однако, несмотря на свою гибкость, DBSCAN также имеет некоторые ограничения. Например, он чувствителен к параметрам, которые нужно установить – радиусу окрестности для поиска соседей и минимальному числу объектов, которое должно быть в окрестности, чтобы её можно было считать кластером. Выбор этих параметров может сильно повлиять на результаты работы алгоритма.

Когда использовать какой алгоритм?

Выбор между K-means и DBSCAN зависит от характера данных. Если у вас есть данные, которые можно разделить на кластеры с ясными центроидами и одинаковыми размерами, то K-means может быть лучшим выбором. Этот алгоритм также подойдёт, если вы точно знаете количество кластеров и хотите быстро получить решение.

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

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

Пример использования K-means и DBSCAN

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

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

– Сумма покупок: сколько денег клиент потратил в магазине.

– Частота покупок: как часто клиент делает покупки (например, количество покупок за месяц).

Мы будем использовать два алгоритма для сегментации данных:

1. K-means – для создания чётких кластеров с заранее определённым количеством.

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

Шаг 1: Подготовка данных

Для простоты примера создадим искусственные данные, представляющие 100 клиентов. Признаки: сумма покупок и частота покупок. Мы будем использовать Python и библиотеки `sklearn`, `numpy` и `matplotlib` для визуализации.

```python

import numpy as np

import matplotlib.pyplot as plt

from sklearn.cluster import KMeans

from sklearn.preprocessing import StandardScaler

from sklearn.datasets import make_blobs

from sklearn.cluster import DBSCAN

# Создаем искусственные данные

np.random.seed(42)

# Генерируем данные: 2 кластера с разными суммами покупок и частотами покупок

X, _ = make_blobs(n_samples=100, centers=[[20, 2], [50, 10]], cluster_std=[5, 7], random_state=42)

# Масштабируем данные для лучшего представления в модели

scaler = StandardScaler()

X_scaled = scaler.fit_transform(X)

# Визуализируем данные

plt.scatter(X_scaled[:, 0], X_scaled[:, 1])

plt.title("Изначальные данные")

plt.xlabel("Сумма покупок")

plt.ylabel("Частота покупок")

plt.show()

```

Шаг 2: Применение K-means

Для начала применим алгоритм K-means, указав, что хотим разделить данные на 2 кластера. Мы заранее предполагаем, что в данных есть два типа клиентов – те, кто делает покупки часто, но с меньшими суммами, и те, кто совершает большие покупки реже.

```python

# Применяем алгоритм K-means

kmeans = KMeans(n_clusters=2, random_state=42)

y_kmeans = kmeans.fit_predict(X_scaled)

# Визуализируем результаты

plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_kmeans, cmap='viridis')

plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=200, c='red', marker='X', label='Центроиды')

plt.title("Результаты кластеризации K-means")

plt.xlabel("Сумма покупок")

plt.ylabel("Частота покупок")

plt.legend()

plt.show()

```

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

Шаг 3: Применение DBSCAN

Теперь применим алгоритм DBSCAN. В отличие от K-means, DBSCAN не требует указания количества кластеров и может находить кластеры произвольной формы. Мы также используем параметры для настройки алгоритма:

– eps – максимальное расстояние между объектами, которые могут быть отнесены к одному кластеру.

– min_samples – минимальное количество объектов для формирования кластера.

```python

# Применяем алгоритм DBSCAN

dbscan = DBSCAN(eps=0.5, min_samples=5)

y_dbscan = dbscan.fit_predict(X_scaled)

# Визуализируем результаты DBSCAN

plt.scatter(X_scaled[:, 0], X_scaled[:, 1], c=y_dbscan, cmap='viridis')

plt.title("Результаты кластеризации DBSCAN")

plt.xlabel("Сумма покупок")

plt.ylabel("Частота покупок")

plt.show()

```

В результате работы DBSCAN мы видим, что алгоритм выделил два основных кластера, а некоторые объекты (которые в модели считаются выбросами) не были отнесены ни к одному кластеру и обозначены как -1. Эти объекты можно рассматривать как редкие или аномальные пользователи.

Шаг 4: Сравнение результатов

Теперь давайте сравним результаты кластеризации с помощью K-means и DBSCAN.

– K-means создаёт два чётких, заранее заданных кластера. Это полезно, когда вы точно знаете, что данные могут быть разделены на несколько групп с определённым количеством кластеров.

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

Итог

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

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

Оба алгоритма имеют свои сильные стороны, и выбор между ними зависит от структуры ваших данных. Если вы знаете, сколько кластеров вам нужно, и уверены, что они будут симметричными и не содержат выбросов, то K-means – это хорошее решение. Если же данные имеют более сложную структуру и выбросы, лучше использовать DBSCAN.

Снижение размерности: PCA

Снижение размерности – это важная техника в области машинного обучения и анализа данных, которая позволяет уменьшить количество признаков (или переменных) в наборе данных, сохраняя при этом как можно больше информации. Это особенно полезно в случае, когда данные имеют большое количество признаков, что может привести к проблемам с вычислительными ресурсами, а также ухудшению производительности моделей из-за так называемого проклятия размерности. Одним из самых популярных методов снижения размерности является PCA (Principal Component Analysis), или анализ главных компонент.

Основные идеи PCA

1
...
...
11