Привет! С вами Кристина Желтова, ментор курса «ML-инженер».
В персонализации клиентского сервиса и маркетинге важно правильно сегментировать клиентов — разделять клиентскую базу на группы (сегменты) на основе их характеристик.
Эту задачу можно решать разными способами, в том числе с помощью машинного обучения. Если нужно обработать большой набор данных или получить модель, которая может быть гибкой и адаптивной в реальном времени, на помощь придёт кластеризация — набор методов без учителя для группировки данных по определённым критериям.
В качестве датасета возьмем небольшой набор данных Mall Customer Segmentation с Kaggle:
path = kagglehub.dataset_download("vjchoudhary7/customer-segmentation-tutorial-in-python")
df = pd.read_csv('/kaggle/input/customer-segmentation-tutorial-in-python/Mall_Customers.csv')Один из самых простых и известных методов кластеризации — KMeans. Он разделяет данные на K кластеров, находя центроиды (центры) каждого кластера и группируя точки данных вокруг ближайших центроидов.
❗️ Важно: KMeans не предназначен для работы с категориальными признаками. Их нужно либо анализировать отдельно, либо применять другие алгоритмы кластеризации, поддерживающие смешанные датасеты.
clustering_features = ['Age', 'Annual Income (k$)', 'Spending Score (1-100)']
X = df[clustering_features].copy()
Перед применением алгоритма KMeans важно провести масштабирование признаков, иначе признаки с большими единицами измерения будут «перетягивать на себя» расстояния и смещать всё решение.
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
X_scaled_df = pd.DataFrame(X_scaled, columns=clustering_features, index=X.index)
При использовании KMeans всегда есть некоторая неопределенность — этому алгоритму нужно заранее задать, на сколько кластеров/групп мы будем разделять данные. Иногда это предположение можно сделать экспертно, но можно попробовать и подобрать оптимальное количество групп, используя «метод локтя» — перебираем количество кластеров, визуализируя на графике сумму квадратов расстояний от каждой точки до центра её кластера. Точка перегиба, где график «сгибается» как локоть руки, и будет оптимальным количеством кластеров.
inertias = []
k_values = range(2, 11)
for k in k_values:
# Обучаем K-means с конкретным k
kmeans = KMeans(n_clusters=k, random_state=42, n_init=10)
cluster_labels = kmeans.fit_predict(X)
inertia = kmeans.inertia_
inertias.append(inertia)
После такого подбора можно переобучить модель с подобранным k, определить каждого клиента в свой кластер и приступить к визуальному анализу. В задаче кластеризации есть довольно много общих метрик качества, но лучше всего всегда посмотреть глазами на то, что получилось.
➡️ Более подробный пример можно посмотреть в colab notebook.
📊 Simulative