Кластеризация DBSCAN в машинном обучении
Алгоритм кластеризации DBSCAN в машинном обучении с использованием Python
DBSCAN означает пространственную кластеризацию на основе плотности для приложений с шумом. Это – неконтролируемый алгоритм кластеризации, который используется для поиска базовых выборок с высокой плотностью для расширения кластеров. В этой статье я познакомлю вас с кластеризацией DBSCAN в машинном обучении с использованием Python.
Что такое кластеризация?
В машинном обучении кластеризация – это задача машинного обучения без учителя. Кластеризация означает объединение похожих экземпляров. Параметры подобия зависят от решаемой задачи, например, в некоторых случаях две близкие выборки считаются похожими, а в некоторых случаях они будут полностью различны даже если ранее находились в одном кластере.
В машинном обучении самые популярные следующие алгоритмы кластеризации:
- К-средние
- DBSCAN
- Агломеративная кластеризация
- BIRCH
- Средний сдвиг
- Распространение аффинности
- Спектральная кластеризация.
В следующем разделе я сначала познакомлю вас с концепциями алгоритма кластеризации DBSCAN, а затем мы увидим, как реализовать его с помощью Python.
Кластеризация DBSCAN в машинном обучении
Алгоритм кластеризации DBSCAN основан на концепции образцов ядра, неосновных образцов и выбросов:
- Образцы ядра: образцы, представленные в области с высокой плотностью, имеют минимальное количество точек выборки с радиусом eps.
- Образцы не ядра: образцы близкие к образцам ядра, но не являющиеся образцами ядра, а находящиеся очень близко к образцам ядра. Образцы не ядра лежат в радиусе eps от образцов ядра, но у них нет минимальных точек отбора проб.
- Выбросы: образцы, которые не являются частью образцов ядра и образцов не ядра, и находящиеся далеко от всех образцов.
Алгоритм кластеризации DBSCAN работает хорошо, если все кластеры достаточно плотны и хорошо представлены областями с низкой плотностью.
Кластеризация DBSCAN с использованием Python
В этом разделе я расскажу, как реализовать алгоритм DBSCAN с помощью Python. Набор данных, который я здесь использую, представляет собой набор данных кредитной карты. Теперь давайте импортируем необходимые библиотеки Python и набор данных:
import numpy as np import pandas as pd from sklearn.cluster import DBSCAN from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA import matplotlib.pyplot as plt data = pd.read_csv("general.csv") data.head()
Набор данных содержит больше столбцов
Прежде чем двигаться дальше, давайте взглянем на нулевые значения в наборе данных:
data.isnull().sum() CUST_ID 0 BALANCE 0 BALANCE_FREQUENCY 0 PURCHASES 0 ONEOFF_PURCHASES 0 INSTALLMENTS_PURCHASES 0 CASH_ADVANCE 0 PURCHASES_FREQUENCY 0 ONEOFF_PURCHASES_FREQUENCY 0 PURCHASES_INSTALLMENTS_FREQUENCY 0 CASH_ADVANCE_FREQUENCY 0 CASH_ADVANCE_TRX 0 PURCHASES_TRX 0 CREDIT_LIMIT 1 PAYMENTS 0 MINIMUM_PAYMENTS 313 PRC_FULL_PAYMENT 0 TENURE 0 dtype: int64
Итак, у нас есть несколько нулевых значений в столбце «Максимальные выплаты». Я заполню эти значения средними значениями, и здесь я также удалю столбец идентификатора клиента, поскольку он тут бесполезен:
data = data.drop('CUST_ID', axis=1) data.fillna(data.mean(), inplace=True)
Теперь давайте промасштабируем и нормализуем набор данных:
# scaling and normalizing the dataset scaler = StandardScaler() x_scaled = scaler.fit_transform(data) from sklearn.preprocessing import normalize x_normal = normalize(x_scaled) x_normal = pd.DataFrame(x_normal)
Теперь я реализую алгоритм анализа главных компонентов (PCA) в машинном обучении, чтобы уменьшить размерность данных для визуализации:
# reduce the dimensionality of the dataset pca = PCA(n_components=2) x_principal = pca.fit_transform(x_normal) x_principal = pd.DataFrame(x_principal) x_principal.columns = ['V1', 'V2'] print(x_principal.head())
V1 V2 0 -0.489825 -0.679678 1 -0.518791 0.545012 2 0.330885 0.268978 3 -0.482374 -0.092110 4 -0.563289 -0.481915
А сейчас давайте реализуем алгоритм DBSCAN и посмотрим на данные и кластеры после его реализации:
dbscan = DBSCAN(eps=0.036, min_samples=4).fit(x_principal) labels = dbscan.labels_ data['cluster'] = dbscan.labels_ print(data.tail())
Результат:
|
BALANCE |
BALANCE_FREQUENCY |
... |
TENURE |
cluster |
8945 |
28.493517 |
1.000000 |
... |
6 |
0 |
8946 |
19.183215 |
1.000000 |
... |
6 |
0 |
8947 |
23.398673 |
0.833333 |
... |
6 |
0 |
8948 |
13.457564 |
0.833333 |
... |
6 |
0 |
8949 |
372.708075 |
0.666667 |
... |
6 |
0 |
[5 rows x 18 columns] |
clusterColor = {0: u'yellow', 1: u'green', 2: 'blue', -1: u'red'} colors = [clusterColor[label] for label in labels] plt.figure(figsize=(12, 10)) plt.scatter(x_principal['V1'], x_principal['V2'], c=colors) plt.title("Implementation of DBSCAN Clustering", fontname="Times New Roman",fontweight="bold") plt.show()
Резюме
Алгоритм кластеризации DBSCAN – это очень простой и мощный алгоритм кластеризации в машинном обучении. Он может идентифицировать любой кластер любой формы. Он устойчив к выбросам и имеет только два гиперпараметра. Ему может быть трудно правильно захватить кластеры, если плотность кластеров значительно возрастет.
Надеюсь, вам понравилась эта статья об алгоритме кластеризации DBSCAN в машинном обучении и его реализации с использованием Python.