Перейти к содержимому

Конвейер кластеризации

Конвейер кластеризации готовит признаки и передаёт их алгоритму кластеризации.

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

Поэтому конвейер кластеризации обычно выглядит так:

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

Так проще не забыть применить те же преобразования перед получением кластеров.