Кластеризация — это метод машинного обучения без учителя, который делит набор объектов на группы (кластеры) так, чтобы объекты внутри группы были похожи друг на друга, а объекты из разных групп различались максимально. Для кластеризации не нужны размеченные данные — алгоритм сам находит структуру в выборке, в отличие от классификации. Разберем разницу между кластеризацией и классификацией, сравним k-means, иерархическую кластеризацию и DBSCAN, посмотрим, как оценить качество разбиения через силуэт, и разберем пример на Python.
Содержание
Кластеризация и классификация: в чем разница
Кластеризация (unsupervised learning, обучение без учителя) не использует размеченные примеры: алгоритм получает только признаки объектов и сам находит группы. Число и состав кластеров заранее не заданы — их определяет структура данных.
Классификация (supervised learning, обучение с учителем) — другая задача. Модель обучается на данных с уже известными метками классов и учится предсказывать метку для новых объектов.
Разница на примере: если сначала алгоритм сам выделяет сегменты клиентов интернет-магазина без меток — это кластеризация. Если после того, как сегменты размечены и названы, отдельная модель учится относить нового клиента к одному из этих сегментов — это уже классификация.
Кластеризацию выбирают, когда групп в данных заранее не знают: сегментация рынка, поиск аномалий, сжатие данных. Классификацию — когда классы известны заранее и есть обучающая выборка с метками: спам/не спам, одобрить/отклонить заявку.
Как алгоритм оценивает похожесть объектов
Большинство алгоритмов кластеризации сравнивают объекты через расстояние в пространстве признаков. Чаще всего используют евклидово расстояние — обычную геометрическую дистанцию между точками, где координаты — это значения признаков объекта.
Расстояние сильно зависит от масштаба признаков. Если один признак измеряется в тысячах (доход в рублях), а другой — в единицах (возраст), доход «перевесит» при расчете расстояния просто из-за масштаба, а не из-за реальной значимости признака.
Поэтому перед кластеризацией признаки почти всегда стандартизируют — приводят к среднему 0 и дисперсии 1. Без этого шага результат кластеризации будет отражать масштаб признаков, а не структуру данных.
Методы кластеризации: k-means, иерархическая, DBSCAN
Единой общепринятой классификации методов кластеризации нет — в разных источниках группы пересекаются и называются по-разному. На практике для большинства задач достаточно трех базовых подходов.
k-means ищет k центров кластеров (центроидов) и относит каждый объект к ближайшему центру. Число кластеров k нужно задать заранее — его подбирают, например, методом локтя по графику суммы внутрикластерных расстояний при разных k.
Алгоритм k-means по шагам:
1. Случайно выбрать k точек как начальные центроиды.
2. Каждый объект отнести к ближайшему центроиду.
3. Пересчитать центроид как среднее всех объектов своего кластера.
4. Повторять шаги 2-3, пока назначения объектов не перестанут меняться (или пока не будет достигнут лимит итераций).
Иерархическая кластеризация (агломеративный вариант, снизу вверх) начинает с того, что каждый объект — отдельный кластер, и на каждом шаге объединяет два ближайших кластера, пока все объекты не окажутся в одном общем кластере. Результат — дендрограмма, дерево объединений; нужное число кластеров получают, «разрезав» дерево на определенной высоте.
DBSCAN группирует точки по плотности. Если у точки в радиусе eps есть не менее min_samples соседей, она становится ядром кластера, и в этот кластер попадают все точки, до которых можно дойти через цепочку таких ядер. Точки, не попавшие ни в один кластер, помечаются как шум — это единственный из трех методов, который явно выделяет выбросы, а не распределяет их по кластерам.
| Метод | Число кластеров задается заранее | Форма кластеров | Устойчивость к выбросам | Когда применять |
|---|---|---|---|---|
| k-means | да (k) | выпуклая, кластеры примерно одного размера | низкая — выброс сильно тянет центроид | известно число сегментов, данных много, форма групп простая |
| Иерархическая (агломеративная) | нет, выбирают после построения дерева | зависит от метрики связи между кластерами | средняя | небольшая выборка (сотни-тысячи объектов), нужна визуализация вложенности |
| DBSCAN | нет, складывается по плотности | произвольная | высокая, шум выделяется отдельно | кластеры разной формы, есть выбросы, число кластеров заранее неизвестно |
У иерархической кластеризации вычислительная сложность растет быстрее линейной с числом объектов, поэтому на выборках от десятков тысяч строк ее обычно не применяют напрямую. DBSCAN требует подбора eps и min_samples и плохо разделяет кластеры, если их плотность сильно различается — редкий и плотный кластер алгоритм может не развести.
Как оценить качество кластеризации: силуэт
В кластеризации нет «правильного ответа» в виде готовых меток, поэтому качество разбиения оценивают по структуре самих данных. Самая распространенная метрика — коэффициент силуэта (silhouette score).
Для каждого объекта считают две величины: a — среднее расстояние до других объектов своего кластера, b — среднее расстояние до объектов ближайшего чужого кластера. Силуэт объекта равен (b — a) деленному на максимум из a и b.
Значение силуэта лежит в диапазоне от -1 до 1. Ближе к 1 — объект хорошо отделен от соседних кластеров. Около 0 — объект на границе между двумя кластерами. Отрицательное значение — объект, вероятно, попал не в свой кластер.
Средний силуэт по всем объектам используют, чтобы сравнить разные значения k или разные алгоритмы между собой. Это упрощенная численная оценка: высокий силуэт не гарантирует, что кластеры имеют смысл для конкретной задачи бизнеса — результат стоит проверять вместе с содержательным анализом кластеров, а не использовать как единственный критерий.
Пример на Python (scikit-learn)
Ниже — воспроизводимый пример: генерируем синтетические данные с известной структурой, кластеризуем методом k-means и считаем силуэт. Код проверен на scikit-learn 1.6.1; при другой версии библиотеки числа могут немного отличаться, логика примера не меняется.
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
# 300 точек, 4 реальных центра, фиксированный random_state для воспроизводимости
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.8, random_state=42)
kmeans = KMeans(n_clusters=4, random_state=42, n_init=10)
labels = kmeans.fit_predict(X)
score = silhouette_score(X, labels)
print(f"Силуэт при k=4: {score:.3f}")
Фактический вывод на этих данных: Силуэт при k=4: 0.834 — значение близко к 1, потому что синтетические кластеры специально сгенерированы хорошо разделимыми.
Если задать заведомо неверное число кластеров — k=2 вместо реальных 4 — на тех же данных с тем же random_state=42 силуэт получается 0.603. Число ниже, потому что k-means вынужден объединять два разных реальных кластера в один, и разброс расстояний внутри такого объединенного кластера растет. Направление эффекта (меньше k — хуже отделены объекты) устойчиво, а конкретные значения силуэта зависят от параметров генерации данных (cluster_std, random_state) и версии scikit-learn.
Выводы
- Кластеризация — обучение без учителя: группы данных выделяются без готовых меток, в отличие от классификации, где метки известны заранее.
- Перед кластеризацией признаки нужно стандартизировать — иначе результат зависит от масштаба, а не от структуры данных.
- k-means требует заранее заданного числа кластеров и подходит для выпуклых групп примерно одного размера; иерархическая кластеризация удобна для небольших выборок с визуализацией дерева; DBSCAN находит кластеры произвольной формы и явно выделяет выбросы.
- Силуэт — основная метрика качества кластеризации без разметки, но это вспомогательный числовой ориентир, а не замена содержательной проверке кластеров.
Где применяется / связь с практикой
Освойте тему на практике
Кластеризацию используют в сегментации клиентов и товаров, поиске аномалий в транзакциях, сжатии данных перед дальнейшим анализом и в предобработке для рекомендательных систем. Работа с этими методами и метриками качества — часть практики на курсе Промышленный ML на больших данных, где разбирают кластеризацию и другие методы машинного обучения на реальных данных.
Освойте тему на практике
Если нужно сначала посмотреть на формат занятий и разбор задач вживую — можно записаться на ближайшие открытые уроки Otus.
FAQ
Можно ли использовать кластеризацию, если число групп заранее неизвестно?
Да, для этого лучше подходят иерархическая кластеризация (число групп выбирают после построения дерева) или DBSCAN (число кластеров складывается по плотности данных), а не k-means, где k нужно задать заранее.
Нужно ли нормализовать данные для DBSCAN и иерархической кластеризации так же, как для k-means?
Да, все три метода опираются на расстояние между объектами, поэтому масштаб признаков важен одинаково для всех — стандартизация нужна перед любым из них.
Силуэт около 0 означает, что кластеризация не удалась?
Не обязательно — это означает, что часть объектов находится на границе между кластерами, то есть разделение недостаточно четкое при выбранном k или методе. Стоит попробовать другое число кластеров или другой алгоритм и сравнить силуэт и результат по смыслу.



