Конвейер кластеризации
Конвейер кластеризации готовит признаки и передаёт их алгоритму кластеризации.
В классификации и регрессии есть целевая переменная: класс или число, которое модель должна предсказать. В кластеризации целевой переменной нет. Алгоритм сам ищет группы похожих объектов.
Поэтому конвейер кластеризации обычно выглядит так:
DataFrame → выбор признаков → преобразования → KMeans → номера кластеровПример с городами России
Заголовок раздела «Пример с городами России»Возьмём датасет RussianCities. В нём есть данные о городах России: население, площадь, координаты и другие признаки.
Для кластеризации добавим два новых признака:
density— плотность населения;log_population— логарифм населения.
Плотность помогает сравнивать города по компактности, а логарифм населения сглаживает большой разброс между малыми городами и миллионниками.
uses MLABC;
begin var ds := Datasets.RussianCities; var df := ds.Data;
df := df.WithColumnFloat( 'density', row -> row.Float('population') / row.Float('area') );
df := df.WithColumnFloat( 'log_population', row -> Ln(row.Float('population')) );
var features := ['log_population', 'density'];
var pipe := DataPipeline.BuildClustering( features, new StandardScaler, new KMeans(3, seed := 42) );
pipe.Fit(df);
var labels := pipe.Predict(df); df := df.WithColumnInt('cluster', labels);
df.Select(['city', 'population', 'density', 'cluster']) .Head(10) .Print;end.Разбор программы
Заголовок раздела «Разбор программы»Сначала исходный DataFrame дополняется двумя признаками.
Затем создаётся конвейер:
DataPipeline.BuildClustering( features, new StandardScaler, new KMeans(3, seed := 42))StandardScaler приводит признаки к сопоставимому масштабу. Это важно для KMeans, потому что алгоритм использует расстояния между объектами.
KMeans(3) делит города на три кластера.
После вызова
var labels := pipe.Predict(df);в переменной labels находятся номера найденных кластеров для всех городов.
Смысл результата
Заголовок раздела «Смысл результата»Столбец cluster содержит номер группы, к которой алгоритм отнёс город.
Эти номера не имеют заранее заданного смысла. Кластер 0 не означает “малые города”, а кластер 1 не означает “крупные города” автоматически. Смысл кластеров появляется после просмотра городов, которые попали в одну группу.
В этом и состоит особенность кластеризации: алгоритм не получает правильные ответы заранее, а помогает увидеть возможную структуру в данных.
Главное
Заголовок раздела «Главное»Конвейер кластеризации нужен, чтобы объединить подготовку признаков и алгоритм кластеризации в одну цепочку:
DataFrame → признаки → StandardScaler → KMeans → clusterТак проще не забыть применить те же преобразования перед получением кластеров.