ClustMetaLearn — автоматизация выбора кластеризации через мета-признаки и эволюционный поиск по табличным данным

от автора

Перед исследователем данных, работающим без размеченных ответов, регулярно встаёт задача кластеризации: разбить множество объектов на группы так, чтобы схожие оказались вместе. На первый взгляд всё просто — запустил k‑means, подобрал число кластеров по силуэту, получил результат. Однако практика показывает, что разные алгоритмы (k‑means, GMM, агломеративная кластеризация) дают несхожие разбиения на одних и тех же данных, а внутренние метрики качества (Cluster Validity Indices, CVI) противоречат друг другу. Более того, как показано в масштабных бенчмарках, ни одна из нескольких десятков CVI не является универсально лучшей. Следовательно, для каждого нового датасета приходится вручную перебирать алгоритмы, метрики и гиперпараметры — процесс, который легко занимает часы и не гарантирует оптимального результата.

В данной работе представлена открытая система ClustMetaLearn, реализующая автоматический выбор алгоритма кластеризации, внутренней метрики качества и сужения пространства гиперпараметров на основе мета-обучения (meta-learning). Система вычисляет 20 мета-признаков датасета, включая статистические, информационно-теоретические, проекционные и топологические характеристики (числа Бетти, персистентная энтропия). Двухуровневая мета-модель (CVIsel + AlgRank) ранжирует четыре алгоритма (k‑means, GMM, агломеративная, MiniBatchKMeans) и предсказывает подходящую CVI. Экспериментальная валидация на коллекции из 96 табличных датасетов показала, что правильный алгоритм попадает в топ‑3 рекомендаций в 81% случаев, а сужение диапазонов гиперпараметров сокращает время настройки в среднем на 70% при потере качества менее 1.5%. Система доступна в виде CLI-утилиты и веб-приложения (Django, Celery, MLflow).

1. Проблематика автоматизации кластеризации

Кластеризация относится к классу задач «обучения без учителя». Её ключевая особенность — полное отсутствие эталонных меток, которые могли бы служить объективным критерием качества. Алгоритм вынужден самостоятельно обнаруживать скрытые группы, опираясь исключительно на попарные сходства объектов. Однако каждая модель кластеризации неявно закладывает собственное представление о том, что считать «хорошим» кластером: один алгоритм стремится к шарообразным группам одинакового размера, другой допускает вытянутые эллипсоиды, третий — иерархические вложения. В результате на одном и том же наборе данных разные методы дают кардинально различные разбиения, и ни одно из них не может быть признано «истинным» без привлечения внешней экспертной информации.

На практике это приводит к ситуации, которую можно назвать слепым выбором. Исследователь, не имея априорных знаний о структуре данных, вынужден последовательно перебирать несколько алгоритмов, для каждого подбирать гиперпараметры (число кластеров, пороги, типы связей), затем сравнивать результаты по нескольким внутренним метрикам — силуэту, индексу Калиньски-Харабаса, индексу Дэвиса-Болдина. Но эти метрики часто противоречат друг другу: одна хвалит разбиение, другая его же отвергает. В такой ситуации выбор финального варианта становится субъективным и слабо формализуемым. Время, затрачиваемое на этот рутинный перебор, может исчисляться часами для датасетов среднего размера и днями — для больших массивов.

Особенно остро проблема проявляется в двух случаях.

Первый — высокая размерность и разреженность. Когда число признаков велико, а объектов относительно мало, классические алгоритмы начинают вести себя непредсказуемо. Популярная метрика «силуэт» перестаёт различать хорошие и плохие разбиения, а стандартные эвристики для выбора числа кластеров (метод локтя, индекс разрыва) дают размытые или множественные кандидаты. Ручной подбор становится ещё более мучительным.

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

Существующие попытки автоматизировать кластеризацию можно разделить на две группы. Первая — эвристические правила, встроенные в библиотеки (например, автоматический выбор k по силуэту). Они работают только на синтетически простых данных и полностью проваливаются на реальных. Вторая — байесовская оптимизация гиперпараметров, перенесённая из задач классификации. Однако без целевой функции, аналогичной MSE или log-loss, такие методы превращаются в поиск по внутренней метрике, которая, как уже сказано, не является ни универсальной, ни согласованной с истинной кластерной структурой.

Мета-обучение предлагает альтернативный путь: вместо того чтобы перебирать алгоритмы вслепую, можно обучить модель, которая по свойствам самого датасета предсказывает, какой алгоритм и с какими гиперпараметрами, скорее всего, сработает. Однако и здесь есть подводные камни. Во-первых, набор мета-признаков в большинстве существующих решений ограничен статистиками первого-второго порядка и не учитывает топологию данных — например, наличие «дырок» или колец, которые коренным образом меняют выбор алгоритма. Во-вторых, мета-модели обычно обучаются на небольшом числе датасетов и плохо обобщаются на новые, особенно если они из другой предметной области. В-третьих, даже получив рекомендацию по алгоритму, исследователь всё равно остаётся перед необходимостью перебирать гиперпараметры — а их диапазоны часто задаются слишком широкими, что сводит на нет выигрыш во времени.

Таким образом, ключевые вызовы, которые мы решаем в этой работе:

  1. Слепой старт — отсутствие каких-либо ориентиров для выбора первого алгоритма и его гиперпараметров.

  2. Противоречивость внутренних метрик — невозможность доверять какой-либо одной CVI без дополнительной информации.

  3. Неучёт топологии — игнорирование формы данных, не сводимой к статистикам и PCA.

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

  5. Проблема переносимости — мета-модель, обученная на одних датасетах, может не работать на других, если не учитывать скрытые свойства (например, согласованность меток).

Наша система ClustMetaLearn нацелена на комплексное решение этих проблем. Она вычисляет расширенный набор мета-признаков (включая топологические), использует двухуровневую архитектуру для выбора и метрики, и алгоритма, сужает пространство гиперпараметров на основе эмпирических распределений и, при необходимости, запускает эволюционный поиск с быстрыми аппроксимациями целевых функций. Всё это реализовано в виде открытого инструмента с CLI и веб-интерфейсом, что позволяет практику получить работающую рекомендацию за секунды вместо часов ручного труда.

2. Мета-признаки: от статистики к топологии

Для построения мета-моделей необходимо описать датасет числовым вектором, который был бы вычислительно эффективен и информативен. В ClustMetaLearn используется 20 признаков, разделённых на четыре категории.

2.1. Статистические признаки (8)

  • n_samplesn_featuresratio = n_samples / n_features — характеризуют масштаб и плотность данных.

  • meanstdvar — моменты первого и второго порядка.

  • skewness (коэффициент асимметрии) и kurtosis (эксцесс) — оценивают отклонение от нормального распределения.

Все статистические признаки вычисляются за O(n·d) после стандартизации (StandardScaler).

Примеры статистических признаков: гистограммы нормального (слева) и логнормального (справа) распределений с указанием коэффициентов асимметрии (skewness) и эксцесса (kurtosis).

Примеры статистических признаков: гистограммы нормального (слева) и логнормального (справа) распределений с указанием коэффициентов асимметрии (skewness) и эксцесса (kurtosis).

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

2.2. Информационно-теоретические признаки (2)

  • entropy — энтропия Шеннона, вычисленная по гистограмме попарных расстояний (10 бинов). Позволяет оценить степень структурированности данных.

  • avg_mutual_info — средняя взаимная информация между парами признаков, показывает избыточность.

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

    Визуализация датасетов с разной степенью структурированности и соответствующие значения энтропии Шеннона, вычисленной по гистограмме попарных расстояний (10 бинов). Слева — три сферических кластера, справа — равномерный шум.

    Визуализация датасетов с разной степенью структурированности и соответствующие значения энтропии Шеннона, вычисленной по гистограмме попарных расстояний (10 бинов). Слева — три сферических кластера, справа — равномерный шум.

На рис. 2 сопоставлены два датасета: три хорошо разделимых гауссовых кластера и равномерный шум. Высокая энтропия указывает на отсутствие явной кластерной структуры.

2.3. Проекционные признаки на основе PCA (6)

  • Доли объяснённой дисперсии первых пяти главных компонент (pca_var_1 … pca_var_5) и их сумма (pca_sum_var).
    Признаки характеризуют внутреннюю размерность данных и степень линейной разделимости кластеров. Если первые две компоненты покрывают >90% дисперсии, то k‑means, как правило, работает хорошо.

    Доли объяснённой дисперсии для первых 10 главных компонент. Слева: датасет с низкой внутренней размерностью (явно доминируют несколько компонент). Справа: случайная матрица, где дисперсия распределена более равномерно.

    Доли объяснённой дисперсии для первых 10 главных компонент. Слева: датасет с низкой внутренней размерностью (явно доминируют несколько компонент). Справа: случайная матрица, где дисперсия распределена более равномерно.

    На рис. 3 приведены доли объяснённой дисперсии для датасета с низкой внутренней размерностью (первые 5 главных компонент покрывают >90% дисперсии) и для датасета с высокой внутренней размерностью (случайная матрица, где каждая компонента вносит малый вклад). Такие признаки позволяют оценить, насколько данные «сплющены» в подпространстве меньшей размерности.

2.4. Топологические признаки (4) — новизна подхода

В отличие от большинства существующих мета-обучаемых систем, ClustMetaLearn использует признаки, основанные на персистентной гомологии — инструменте топологического анализа данных (TDA). Для построения персистентных диаграмм применяется библиотека ripser. При n_samples > 200 выполняется случайная подвыборка до 200 точек (достаточно для оценки топологии).

Из диаграмм извлекаются:

  • betti_0 — число связных компонент на пороге, равном среднему расстоянию до 3-го ближайшего соседа. Грубая оценка количества кластеров.

  • betti_1 — число независимых петель (одномерных дырок). Ненулевое значение указывает на наличие круговых или кольцевых структур, где k‑means неэффективен, а спектральные методы или DBSCAN предпочтительны.

  • persistent_entropy_h0persistent_entropy_h1 — энтропия персистентных диаграмм. Высокие значения говорят о богатой топологической структуре.

    Топологический анализ данных: два концентрических кольца (слева) и их персистентная диаграмма (справа). H0-рождения (синие точки) показывают компоненты связности, H1-рождения (красные) — петли. Долгоживущая красная точка выше диагонали соответствует betti_1 = 1, что указывает на кольцевую структуру.

    Топологический анализ данных: два концентрических кольца (слева) и их персистентная диаграмма (справа). H0-рождения (синие точки) показывают компоненты связности, H1-рождения (красные) — петли. Долгоживущая красная точка выше диагонали соответствует betti_1 = 1, что указывает на кольцевую структуру.

Пример: два концентрических кольца (рис. 4, левая панель). Статистические признаки не отличают их от гауссова облака, а персистентная диаграмма (рис. 4, правая панель) явно показывает одну долгоживущую петлю в 1-мерной гомологии (красные точки выше диагонали), что соответствует betti_1 = 1. Это сигнализирует о наличии кольцевой структуры, для которой k‑means не подходит.

3. Двухуровневая мета-модель: CVIsel → AlgRank

Общая схема работы:

  1. Пользователь загружает датасет.

  2. Система вычисляет 20 мета-признаков.

  3. Первый классификатор CVIsel предсказывает, какую из трёх метрик использовать: Silhouette, Calinski‑Harabasz, Davies‑Bouldin.

  4. Второй классификатор AlgRank выдаёт вероятности для четырёх алгоритмов и возвращает топ-3.

  5. Для каждого алгоритма из топ-3 система рекомендует суженные интервалы гиперпараметров (k от 2 до 10, linkage=ward).

  6. При желании запускается эволюционный поиск полного пайплайна.

    На рис. 5 представлена последовательность работы двухуровневой мета-модели в виде диаграммы взаимодействия. Рис. 6 детализирует компонентную архитектуру, показывая поток данных от исходного датасета до финальных рекомендаций.

Диаграмма последовательности (sequence diagram) двухуровневой мета-модели ClustMetaLearn. Пользователь загружает датасет, система вычисляет 20 мета-признаков, затем CVIsel выбирает внутреннюю метрику качества, AlgRank ранжирует алгоритмы, и модуль сужения гиперпараметров выдаёт рекомендации.

Диаграмма последовательности (sequence diagram) двухуровневой мета-модели ClustMetaLearn. Пользователь загружает датасет, система вычисляет 20 мета-признаков, затем CVIsel выбирает внутреннюю метрику качества, AlgRank ранжирует алгоритмы, и модуль сужения гиперпараметров выдаёт рекомендации.
Компонентная архитектура ClustMetaLearn. Четыре категории мета-признаков (статистические, информационные, проекционные PCA, топологические) подаются на вход CVIsel, который передаёт выбранную CVI в AlgRank. AlgRank возвращает топ-3 алгоритма, а модуль гиперпараметров сужает интервалы (k∈[2,10], linkage='ward', обязательная стандартизация).

Компонентная архитектура ClustMetaLearn. Четыре категории мета-признаков (статистические, информационные, проекционные PCA, топологические) подаются на вход CVIsel, который передаёт выбранную CVI в AlgRank. AlgRank возвращает топ-3 алгоритма, а модуль гиперпараметров сужает интервалы (k∈[2,10], linkage=’ward’, обязательная стандартизация).

Детали моделей:
Оба классификатора — Random Forest (200 деревьев). Обучались на 32 датасетах из нашей CLM-коллекции, валидировались на 33, тест — 31 независимый датасет (разбиение фиксировано, random_state=42). Метки для AlgRank получены grid‑search’ом по лучшей CVI на трейне.

Почему не один классификатор «алгоритм + метрика»?
Потому что метрика — это инструмент оценки, а алгоритм — исполнитель. Иногда силуэт лучше подходит для GMM, а Calinski‑Harabasz — для k‑means. Разделение даёт интерпретируемость: мы можем объяснить пользователю, почему выбрана та или иная метрика.

4. Сужение гиперпараметров: от 3 часов до 20 минут

В классическом grid‑search для k‑means часто перебирают k от 2 до 50. Мы эмпирически (на обучающей выборке) вычислили, что оптимальное k почти никогда не выходит за пределы 2–10. Редко — до 15. Поэтому наши рекомендуемые интервалы:

Алгоритм

k_min

k_max

k_median

scaler_rate (доля, где StandardScaler улучшил CVI)

k‑means

2

10

6.5

1.0

GMM

2

10

7.0

1.0

Agglomerative

2

10

7.5

1.0

MiniBatchKMeans

2

10

7.0

1.0

scaler_rate = 1.0 означает, что во всех датасетах обучающей выборки стандартизация улучшала значение выбранной CVI. Так что мы всегда рекомендуем масштабировать данные перед кластеризацией.

Эффект: время подбора гиперпараметров сокращается в среднем на 70% (в 3–5 раз). Например, если полный перебор занимал 3 часа, после сужения — около 45 минут. При этом ухудшение качества (ARI) — менее 1.5%. Проверено на тестовых датасетах.

5. Быстрые внутренние CVI для эволюции

В эволюционном поиске (генетический алгоритм) фитнес-функцию приходится вычислять сотни раз. Стандартные реализации силуэта, Calinski-Harabasz, Davies‑Bouldin имеют сложность O(n²) — для 10k точек это может быть ~0.5 секунды на вызов, а при популяции 50 и 20 поколениях — 500 вызовов, уже 250 секунд, многовато.

Мы реализовали O(n) аппроксимации (см. tpot_clustering/cvi.py):

  • silhouette_centroid_fast — вместо попарных расстояний используем расстояния до центроидов.

  • calinski_harabasz_fast — тоже переписана с использованием предвычисленных сумм.

  • davies_bouldin_fast.

Погрешность — не более 5–10% от точного значения, но скорость в 20–30 раз выше для n=10k. Для эволюции это критично.

6. Веб-приложение: Django, Celery, тёмная тема и импорт с Kaggle

Сделали не только CLI, но и полноценный веб-сервис (код — в папке clustmetalearn_web). Стек: Django 4.2, Celery (асинхронная обработка), Redis (брокер), PostgreSQL (production), SQLite (dev).

Главный лендинг веб-приложения

Главный лендинг веб-приложения

Фишки, которые нам самим нравятся:

6.1. Импорт датасетов

  • Загрузка CSV (автоопределение разделителя) или бинарного .bin (быстро для больших матриц).

  • Импорт по имени с Kaggle: вводите uciml/iris — система через kagglehub скачивает и автоматически находит CSV.

  • Импорт с Hugging Face: scikit-learn/iris или полная ссылка — используем datasets с стримингом, ограничение 100k строк.

6.2. Страница рекомендаций (главный экран)

После загрузки через несколько секунд появляются:

  • 20 мета-признаков в виде карточек с прогресс-барами (например, betti_0 = 3.2).

  • Рекомендованная CVI — крупная плашка с пояснением.

  • Топ-3 алгоритма с вероятностями от AlgRank.

  • Ожидаемый ARI (суррогат, пока неточный — RMSE ~0.12, но даёт общее представление).

  • Таблица гиперпараметров с суженными диапазонами.

Кнопки: «Запустить эволюционный поиск» и «Экспортировать отчёт» (TXT/PDF).

Анализ: карточки с мета-признаками

Анализ: карточки с мета-признаками

6.3. Эволюционный поиск в фоне

Нажимаете «Запустить эволюцию» — Celery‑воркер подхватывает задачу. На странице появляется прогресс-бар (AJAX-опрос /api/evolve/<task_id>/status/). Можно задать:

  • число поколений (по умолчанию 15)

  • размер популяции (40)

  • фитнес-функцию (одна из трёх CVI или ARI, если есть метки)

  • стратегию бандита (UCB1 / Softmax) — для смещения выбора алгоритма в сторону более успешных.

После завершения — лучший пайплайн (например, StandardScaler → PCA(0.95) → GMM(k=5)) и график сходимости.

6.4. Страница анализа

Интерактивные графики Plotly:

  • PCA‑проекция с цветом по предсказанному алгоритму (или по истинным меткам, если они есть).

  • Тепловая карта корреляций мета-признаков (можно увидеть, что топология слабо коррелирует с PCA — значит, даёт новую информацию).

  • Гистограммы распределений признаков.

6.5. Тёмная тема и русский язык

Переключение темы — через JavaScript, сохраняется в профиле. Локализация на русский — через Django i18n. Всё переведено: кнопки, подсказки, сообщения об ошибках. Для русскоязычных пользователей это приятная мелочь.

6.6. Экспорт отчётов

PDF формируется через weasyprint с HTML‑шаблоном (поддержка кириллицы — шрифт Noto Sans). В отчёт вшиваются миниатюры графиков (если были построены). Отдельно можно экспортировать TXT — для автоматизации.

7. Эксперименты: что получилось, а что — не очень

Мы взяли собранную коллекцию из 96 размеченных табличных датасетов (iris, wine, ecoli, glass, banknote…). Каждый — в виде пары data.npy / label.npy. Предварительно отфильтровали по метрике CLM, чтобы избежать заведомо «плохих» датасетов, где разметка не соответствует кластерам. Сплиты: train (32), val (33), test (31).

Основная метрика — Top‑k accuracy: для каждого тестового датасета смотрим, попал ли лучший алгоритм (по максимальному ARI среди всех четырёх) в топ‑k рекомендаций AlgRank.

Результаты на test (31 датасет):

Метод

Top‑1

Top‑2

Top‑3

Случайный выбор (равномерно)

0.250

0.500

0.750

always_gmm

0.406

ClustMetaLearn (CVIsel + AlgRank)

0.281

0.531

0.812

Что видим:

  • Top‑1 у нас хуже, чем тупой GMM. Обидно, но честно. Причина: в обучающей выборке GMM часто был лучшим (гауссовские кластеры), модель переобучилась на эту частоту.

  • Зато Top‑3 = 0.812 — это уже хорошо. То есть в 81% случаев правильный алгоритм оказывается среди трёх рекомендованных.

  • По сравнению со случайным (0.75) выигрыш небольшой, но значимый (p < 0.05 по критерию Макнемара).

7.1. Сужение гиперпараметров

При сужении k с [2,50] до [2,10] и фиксации linkage='ward' время поиска сокращается в 3–5 раз. Потеря ARI — менее 1.5% на тесте. То есть почти даром.

7.2. Проблема с raw ARI (сквозная оценка)

Мы также попытались оценить, какой ARI получится, если взять рекомендации системы и реально запустить кластеризацию. Провели предварительный эксперимент на 3 тестовых датасетах (подвыборка до 1200 объектов). Результат оказался разочаровывающим:

Метод

Средний ARI (по 3 датасетам)

always_agglomerative

0.227

all_algorithms_internal (grid‑search по k с внутренней CVI)

0.169

always_gmm

0.165

meta_top1_internal

0.163

meta_top3_internal

0.156

То есть прямая оптимизация по внутренней CVI не гарантирует высокого ARI. Это известный факт: внутренние и внешние метрики слабо коррелируют, особенно при низком CLM. Наши рекомендации по CVIsel оптимизируют внутреннюю метрику, а не ARI. Для прикладных задач, где нет эталонных меток, это нормально — вы всё равно не узнаете ARI. Но для сравнения с бенчмарками это недостаток.

Мы планируем расширить сквозную оценку на все 31 тестовый датасет и, возможно, внедрить скорректированные внутренние метрики (Adjusted IVMs), которые лучше коррелируют с ARI. Пока же предупреждаем: система хороша для быстрого выбора алгоритма и сужения гиперпараметров в реальной неразмеченной задаче, но не для точного предсказания ARI.

7.3. Невыпуклые кластеры — наше слабое место

В обучающей выборке датасетов с кольцевой структурой почти нет. Хотя топологические признаки мы добавили, модель не научилась их эффективно использовать (анализ SHAP показал, что вклад betti_1 в решение AlgRank мал). Нужно расширить коллекцию датасетов с явной топологией — например, синтетические круги, полумесяцы, датасет «два кольца».

8. Что дальше? (план развития)

Мы не считаем ClustMetaLearn законченной системой. Скорее, это исследовательский прототип, который уже полезен, но имеет очевидные дыры. В планах:

  1. Расширить обучающую выборку до 300–400 датасетов, добавить невыпуклые и высокоразмерные.

  2. Улучшить Top‑1 — заменить Random Forest на градиентный бустинг (LightGBM/XGBoost), добавить мета-признаки лендмаркинга (быстрые дешёвые алгоритмы для оценки сложности).

  3. Интегрировать скорректированные CVI (Adjusted Calinski‑Harabasz, Adjusted Silhouette) по методике Jeon et al. — они лучше согласуются с ARI.

  4. Довести raw ARI‑оценку до всех тестовых датасетов и опубликовать результаты.

  5. Сделать REST API (FastAPI) с документацией Swagger.

  6. Выложить пакет на PyPI, чтобы можно было pip install clustmetalearn.

  7. Добавить DBSCAN и спектральную кластеризацию (особенно актуально с топологическими признаками).

Всё это открыто на GitHub: https://github.com/DanilkaCrazy/ClustMetaLearn. Принимаем пул-реквесты, issues и просто звёздочки.

Заключение

Мы сделали ClustMetaLearn — систему, которая автоматизирует один из самых неудобных этапов работы с табличными данными: выбор алгоритма кластеризации и настройку гиперпараметров. Она использует 20 мета-признаков (включая топологию), двухуровневую модель (CVIsel → AlgRank), быстрые аппроксимации CVI и эволюционный поиск. Она не идеальна (Top‑1 хромает, raw ARI не радует), но топ-3 рекомендации работают в 81% случаев, а сужение гиперпараметров экономит 70% времени.

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

ссылка на оригинал статьи https://habr.com/ru/articles/1046974/