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

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

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

Очки:

Есть три разных момента, которые нужно понимать при применении DBSCAN. Это основные точки, граничные точки и выбросы.

а. Основные точки: основные точки — это центроиды кластера. Основные точки — это точки данных, которые имеют достаточное количество соседних точек данных в пределах заданного расстояния, называемого расстоянием «эпсилон».

б. Пограничные точки. Пограничные точки — это точки данных, которые находятся в пределах расстояния эпсилон от центральной точки, но не имеют количества точек, необходимого для того, чтобы считаться центральной точкой. Обычно они находятся на краю скопления.

в. Точки выброса: выбросы иначе называются шумом. Обычно они не принадлежат ни к одному кластеру. Это точки данных, которые не находятся на расстоянии эпсилон от любой базовой точки.

На самом деле, одним из преимуществ DBSCAN является то, что он обнаруживает и обрабатывает выбросы наилучшим образом.

Гиперпараметры:

Есть два очень важных гиперпараметра, которые следует учитывать при работе с DBSCAN, и оба они работают вместе, чтобы обеспечить хорошую сегментацию кластера.

а. Эпсилон: Эпсилон представляет расстояние от точки для поиска минимального количества точек в кластере. Увеличение эпсилон позволяет точкам находиться в диапазоне друг друга, создавая менее уникальные кластеры. Уменьшение эпсилон делает обратное.

Если мы выберем очень маленькое значение эпсилон, мы получим больше уникальных кластеров, потому что расстояние недостаточно для размещения большего количества точек.

б. Минимальное количество точек: представляет собой минимальное количество точек в пределах эпсилон-расстояния до центральной точки. Если минимальное количество баллов очень велико по сравнению с доступным количеством баллов, у нас, скорее всего, будет много выбросов.

Процедура DBSCAN

Теперь, когда у нас есть словарный запас, как же работает DBSCAN? Ниже приведена процедура DBSCAN, и она проста как abcd. Это очень похоже на процедуру кластеризации K-средних, за исключением того факта, что нам не обязательно заранее определять количество кластеров.

а. Выберите расстояние в эпсилон и минимальное количество точек, необходимых для формирования кластера.

б. Неназначенное очко выбирается случайным образом, как при розыгрыше лотереи без перетасовки. После выбора найдите все точки с расстоянием в эпсилон от указанной точки.

в. Определите основную точку. Как только основная точка определена, добавьте в кластер все непосредственно доступные соседние точки.

д. Повторяйте описанные выше процессы, пока все точки не будут назначены кластеру.

Видеть! очень просто.

Давайте закодируем, как я использовал DBSCAN для разделения расходов на товары.

  1. Импортируйте свою библиотеку и прочитайте свои данные
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

df = pd.read_csv(r"C:\Users\olona\Downloads\DATA SCIENCE\jose portilla\24 - DBSCAN - Density-based spatial clustering of applications with noise\33643066-wholesome-customers-data.csv")

2. Используйте Standard Scaler для масштабирования данных.

from sklearn.preprocessing import StandardScaler
scaler= StandardScaler()
Scaled_X= scaler.fit(df)
Scaled_X=scaler.transform(df)

#Turn the scaled data into a dataframe for a better view
Scaled_X= pd.DataFrame(Scaled_X, columns=df.columns)

3. Используйте DBSCAN и цикл for для создания модели, тестирующей различные значения эпсилон. Как правило, мы устанавливаем минимальное значение в 2 * количество функций. Зарегистрируйте процент точек, которые являются выбросами во время цикла

from sklearn.cluster import DBSCAN
outlier_percent = []
number_of_outliers = []

for eps in np.linspace(0.001,3,50):
    
    # Create Model
    dbscan = DBSCAN(eps=eps, min_samples=2*Scaled_X.shape[1])
    dbscan.fit(Scaled_X)
    
    # Log Number of Outliers
    number_of_outliers.append(np.sum(dbscan.labels_ == -1))
    
    # Log percentage of points that are outliers
    perc_outliers = 100 * np.sum(dbscan.labels_ == -1) / len(dbscan.labels_)
    
    outlier_percent.append(perc_outliers)

4. Создайте линейный график процента выбросов точек в зависимости от выбранного значения эпсилон.

sns.lineplot(x=np.linspace(0.001,3,50),y=outlier_percent)
plt.ylabel("Percentage Classified as Outliers")
plt.xlabel("Epsilon Value")

#Say we want our outliers to not be more than 2% of the data, we can trace the epsilon value to arounf 2.0. We can also an inflection between 1.5 and 2.0¶

5. На основе графика, созданного на предыдущем шаге, переобучите модель DBSCAN с разумным значением эпсилон. Мы бы использовали eps=2 здесь

dbscan = DBSCAN(eps=2)
dbscan.fit(scaled_X)

6. Создайте новый столбец в исходном фрейме данных под названием «Ярлыки», состоящий из меток DBSCAN. Это дает нам три кластера-0, 1 и -1, содержащие каждую строку. -1 представляет выбросы

df['Labels'] = dbscan.labels_

7. Сравните среднее статистическое значений кластеров и выбросов для сумм расходов по категориям.

categs= df.drop(['Channel','Region'],axis=1)
categs_mean=categs.groupby('labels').mean()
categs_mean

8. Нормализуйте фрейм данных из предыдущего шага с помощью MinMaxScaler, чтобы средние расходы изменялись от 0 до 1, и создайте тепловую карту значений.

from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
data = scaler.fit_transform(cat_means)
scaled_means = pd.DataFrame(data,cat_means.index,cat_means.columns)
sns.heatmap(scaled_means)

#From the heatmap and data above, we can see that the outliers(represented by -1) represent way more spending than the rest and this is why we classify them as outliers.
#There is also significant less spending in category 1 than

9. Создайте еще одну тепловую карту, аналогичную приведенной выше, но с удаленными выбросами.

sns.heatmap(scaled_means.iloc[[1,2]],annot=True)

Выводы

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

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