Практическое знакомство с безнадзорным обучением кластеризация методом K-средних

Практическое знакомство с безнадзорным обучением кластеризацией K-средних

 

Кластеризация K-Means является одним из наиболее часто используемых алгоритмов машинного обучения без учителя в области науки о данных. Он используется для автоматического сегментирования наборов данных на кластеры или группы на основе сходства между точками данных.

В этом кратком руководстве мы узнаем, как работает алгоритм кластеризации K-Means и применим его к реальным данным с использованием scikit-learn. Кроме того, мы визуализируем результаты, чтобы понять распределение данных.

 

Что такое кластеризация K-Means?

 

Кластеризация K-Means – это алгоритм машинного обучения без учителя, который используется для решения задач кластеризации. Цель этого алгоритма – найти группы или кластеры в данных, количество которых представлено переменной K.

Алгоритм K-Means работает следующим образом:

  1. Укажите количество кластеров K, на которые вы хотите разбить данные.
  2. Случайным образом инициализируйте K центров кластеров или центроидов. Это можно сделать, случайным образом выбирая K точек данных в качестве начальных центроидов.
  3. Назначьте каждую точку данных ближайшему центроиду кластера на основе евклидового расстояния. Точки данных, находящиеся ближе всего к данному центроиду, считаются частью этого кластера.
  4. Пересчитайте центроиды кластеров, взяв среднее значение всех точек данных, назначенных этому кластеру.
  5. Повторите шаги 3 и 4, пока центроиды перестанут двигаться или количество итераций не достигнет указанного предела. Это делается, когда алгоритм сошелся.

   

Цель K-Means – минимизировать сумму квадратов расстояний между точками данных и их назначенным центроидом кластера. Это достигается путем итеративного переназначения точек данных ближайшему центроиду и перемещения центроидов в центр их назначенных точек, что приводит к более компактным и отделенным кластерам.

 

Реальный пример кластеризации K-Means

 

В этих примерах мы будем использовать данные о сегментации клиентов торгового центра из Kaggle и применять алгоритм K-Means. Мы также найдем оптимальное количество K (кластеров), используя метод локтя, и визуализируем кластеры.

 

Загрузка данных

 

Мы загрузим файл CSV с помощью библиотеки pandas и сделаем “CustomerID” индексом.

import pandas as pd

df_mall = pd.read_csv("Mall_Customers.csv",index_col="CustomerID")
df_mall.head(3)

 

Набор данных содержит 4 столбца, и нас интересуют только три: возраст, годовой доход и оценка расходов клиентов.

 

 

Визуализация

 

Чтобы визуализировать все четыре столбца, мы воспользуемся функцией `scatterplot` из библиотеки seaborn.

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(1 , figsize = (10 , 5) )
sns.scatterplot(
    data=df_mall,
    x="Spending Score (1-100)",
    y="Annual Income (k$)",
    hue="Gender",
    size="Age",
    palette="Set2"
);

 

Даже без кластеризации K-Means мы можем ясно увидеть кластер в диапазоне оценки расходов от 40 до 60 и годового дохода от 40 тыс. до 70 тыс. Чтобы найти больше кластеров, мы будем использовать алгоритм кластеризации в следующей части.

 

 

Нормализация

 

Перед применением алгоритма кластеризации крайне важно нормализовать данные для устранения выбросов или аномалий. Мы удаляем столбцы “Gender” и “Age” и будем использовать остальные для поиска кластеров.

из sklearn импортируем предварительную обработку

X = df_mall.drop(["Пол","Возраст"],axis=1)
X_norm = предварительная_обработка.нормализация(X)

 

Метод локтя

 

Оптимальное значение К в алгоритме K-средних можно найти с помощью метода локтя. Это включает определение значения инерции для каждого числа кластеров от 1 до 10 и его визуализацию.

import numpy as np
из sklearn.cluster импортируем KMeans


def локтевая_диаграмма(data,clusters):
    инерция = []
    for n in range(1, clusters):
        алгоритм = KMeans(
            n_clusters=n,
            init="k-means++",
            random_state=125,
        )
        алгоритм.fit(data)
        инерция.append(алгоритм.inertia_)
    # Визуализация
    plt.plot(np.arange(1 , clusters) , инерция , 'o')
    plt.plot(np.arange(1 , clusters) , инерция , '-' , alpha = 0.5)
    plt.xlabel('Количество кластеров') , plt.ylabel('Инерция')
    plt.show();

локтевая_диаграмма(X_norm,10)

 

Мы получили оптимальное значение 3.   

 

Кластеризация K-средних

 

Теперь мы будем использовать алгоритм K-средних из scikit-learn и предоставим ему значение K. После этого мы подгоним его нашим обучающим набором данных и получим метки кластеров.  

алгоритм = KMeans(n_clusters=3, init="k-means++", random_state=125)
алгоритм.fit(X_norm)
метки = алгоритм.labels_

 

Мы можем использовать график рассеяния для визуализации трех кластеров. 

sns.scatterplot(data = X, x = 'Оценка расходов (1-100)', y = 'Годовой доход (k$)', hue = метки, palette="Set2");

 

  • “0”: От высоких затрат с низким годовым доходом. 
  • “1”: Средние и высокие затраты с VoAGI на высокий годовой доход.
  • “2”: От низких затрат с высоким годовым доходом. 

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

 

Использование других характеристик

 

Теперь мы будем использовать Возраст и Оценку расходов в качестве характеристик для алгоритма кластеризации. Это даст нам полную картину распределения клиентов. Мы повторим процесс нормализации данных.

X = df_mall.drop(["Пол","Годовой доход (k$)"],axis=1)

X_norm = предварительная_обработка.нормализация(X)

 

Вычислите оптимальное количество кластеров. 

локтевая_диаграмма(X_norm,10)

 

Обучите алгоритм K-средних на K=3 кластерах.     

алгоритм = KMeans(n_clusters=3, init="k-means++", random_state=125)
алгоритм.fit(X_norm)
метки = алгоритм.labels_

 

Используйте график рассеяния для визуализации трех кластеров. 

sns.scatterplot(data = X, x = 'Возраст', y = 'Оценка расходов (1-100)', hue = метки, palette="Set2");

 

  • “0”: Молодые клиенты с высокими затратами.
  • “1”: Клиенты VoAGI от среднего возраста до пожилых. 
  • “2”: Клиенты с низкими затратами. 

Результаты позволяют предприятиям увеличить прибыль, нацеленную на лиц от 20 до 40 лет с наличными деньгами.

   

Мы даже можем углубиться, визуализируя график размаха баллов потребления. Это четко показывает, что кластеры формируются на основе потребительских привычек.

sns.boxplot(x = labels, y = X['Балл потребления (1-100)']);

 

 

Заключение

 

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

Пройдя через рабочий процесс K-Means и реализовав его на Python, мы получили представление о том, как функционирует этот алгоритм для разделения данных на отдельные кластеры. Мы изучили техники, такие как нахождение оптимального числа кластеров с помощью метода локтя и визуализацию кластеризованных данных.

Хотя scikit-learn предоставляет множество других алгоритмов кластеризации, K-Means выделяется своей скоростью, масштабируемостью и простотой интерпретации.     Абид Али Аван (@1abidaliawan) – сертифицированный профессиональный специалист по науке о данных, который любит создавать модели машинного обучения. В настоящее время он сосредоточен на создании контента и написании технических блогов о технологиях машинного обучения и науке о данных. Абид имеет степень магистра в управлении технологиями и степень бакалавра в области телекоммуникационной инженерии. Его цель – создать продукт искусственного интеллекта с использованием графовых нейронных сетей для студентов, страдающих от психических заболеваний.