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

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

Алгоритм в основном в →

  1. Выявление фейковых новостей.
  2. Спам-фильтр
  3. маркетинговые продажи
  4. Классифицируйте сетевой трафик.
  5. Выявление мошенничества или преступной деятельности

Вот темы, которые мы рассмотрим в этой методике кластеризации.

* Разложение PCA (уменьшение размерности)
* Кластеризация K-средних (на основе центроидов) Кластеризация
* Иерархическая (разделяющая и агломеративная) кластеризация
* Кластеризация DBSCAN (на основе плотности)

# Импорт данных

импортировать панды как pd
data = pd.read_csv (‘../ input / unsupervised-learning-on-country-data / Country-data.csv’)

Давайте проверим содержание данных

data.head ()

# описание набора данных

data.describe ()

Что означают заголовки столбцов? Давайте проверим словарь данных.

импортировать панды как pd
data_dict = pd.read_csv (‘../ input / unsupervised-learning-on-country-data / data-dictionary.csv’)
data_dict.head (10)

# Анализ данных

# Базовая библиотека анализа данных
! Pip install dabl

Здесь мы используем базовую библиотеку анализа данных. Это поможет нам проанализировать данные относительно целевого столбца.

import dabl
импортировать предупреждения
import matplotlib.pyplot as plt
warnings.filterwarnings ('ignore')
plt.style.use ('ggplot')
plt. rcParams ['figure.figsize'] = (12, 6)
dabl.plot (data, target_col = 'gdpp')

Мы можем наблюдать очень тесную положительную корреляцию между «доходами» и «ВВП». Кроме того, «Экспорт», «Импорт», «Здоровье» имеют некоторую положительную корреляцию с «GDPP».

Однако теперь мы отбросим столбец «Страна» не потому, что это единственный категориальный параметр (тип объекта), а потому, что он не является решающим параметром, чтобы сохранить / не хранить конкретную запись в кластере. Короче говоря, «Страна» - это функция, которая здесь не требуется для обучения без учителя.

# Исключить столбец «Страна»
data = data.drop («country», axis = 1)

Мы будем использовать простые профильные отчеты, где мы сможем легко получить обзор переменных, и мы сможем исследовать взаимодействия (парные диаграммы разброса), корреляции (Пирсона, Спирмена, Кендалла, Фика), информацию об отсутствующих значениях - все в одном месте. Вывод, который он производит, довольно длинный, и нам нужно прокручивать вниз и переключать разные вкладки, чтобы просмотреть все результаты, но время, которое вы потратите на это, того стоит.

Суть обзора:

  • Средняя смертность детей в возрасте до 5 лет на каждые 100 человек: 38,27
  • Средняя продолжительность жизни: 70,56 (крайне отрицательно искаженное распределение)
  • Здоровье имеет идеально симметричное распределение со средним значением 6,82.
  • Средний экспорт товаров и услуг на душу населения: 41,11
  • Средний объем импорта товаров и услуг на душу населения: 46,89 (что ›средний экспорт).
  • Средний чистый доход на человека: 17144,69 (распределение сильно искажено)
  • Средняя инфляция: 7,78 (имеет широкий разброс от мин -4,21 до +104)
  • Средний ВВП на душу населения: 12964,15 (распределение с сильно отрицательным перекосом).

Суть взаимодействий:

  • Детская смертность имеет прямую отрицательную корреляцию с ожидаемой продолжительностью жизни.
  • Общая фертильность имеет несколько положительную корреляцию с детской смертностью.
  • Экспорт и импорт имеют грубую положительную корреляцию.
  • Доходы и ВВП имеют достаточно положительную корреляцию.

Сводка отсутствующих значений:

  • В данных нет пропущенного значения

Подробнее о коэффициентах корреляции мы поговорим позже.

# Более заметный график корреляции
import numpy as np
import seaborn as sns
corr = data.corr ()
mask = np.triu (np.ones_like (corr, dtype = np.bool))
f, ax = plt.subplots (figsize = (12, 12))
cmap = sns.light_palette ('black', as_cmap = True)
sns.heatmap (corr, mask = mask, cmap = cmap, vmax = None, center = 0, square = True, annot = True, linewidths = .5, cbar_kws = {«shrink»: .9})

Выводы графика коэффициента корреляции Пирсона:

  • Импорт имеет высокую положительную корреляцию с экспортом (+0,74)
  • Доход имеет довольно высокую положительную корреляцию с экспортом (+0,52).
  • Ожидаемая продолжительность жизни имеет довольно высокую положительную корреляцию с доходом (+0,61).
  • Общая рождаемость имеет очень высокую положительную корреляцию с детской смертностью (+0,85).
  • GDPP имеет очень высокую положительную корреляцию с доходом (+0,90)
  • GDPP имеет довольно высокую положительную корреляцию с ожидаемой продолжительностью жизни (+0,60)
  • Общая фертильность имеет довольно высокую отрицательную корреляцию с ожидаемой продолжительностью жизни (-0,76). Что ж, я нашел этот конкретный факт интересным, но давайте не будем забывать «Корреляция не подразумевает причинно-следственную связь»!

(1) Анализ главных компонентов

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

из sklearn.preprocessing import StandardScaler
sc = StandardScaler ()
data_scaled = sc.fit_transform (data)

Здесь я использовал решатель разложения по сингулярным числам «авто», чтобы получить ответ «нет». основных компонентов. Вы также можете использовать «рандомизированный» решатель, вводя начальное значение случайного состояния, например «0» или «12345».

from sklearn.decomposition import PCA
pc = PCA (svd_solver = ’auto’)
pc.fit (data_scaled)
print (‘Общее количество основных компонентов =’, pc.n_components_)

#Print Основные компоненты
print («Матрица основных компонентов: \ n», pc.components_)

Давайте проверим здесь величину дисперсии, объясняемую каждым главным компонентом. Они будут расположены в порядке убывания объясненного коэффициента дисперсии.

# Количество отклонений, которое объясняет каждый компьютер
var = pc.explained_variance_ratio_
print (var)

# Постройте объясненный коэффициент дисперсии для каждого ПК
plt.bar ([i for i, _ in enumerate (var)], var, color = 'black')
plt.title ('PCs и их Explained Variance Ratio ', fontsize = 15)
plt.xlabel (' Number of components ', fontsize = 12)
plt.ylabel (' Explained Variance Ratio ', fontsize = 12)

Используя эти совокупные коэффициенты дисперсии для всех ПК, мы нарисуем график осыпи. Он используется для определения количества основных компонентов, которые необходимо сохранить в этом анализе основных компонентов.

# График осыпи
plt.plot (cum_var, marker = 'o')
plt.title ('График осыпи: ПК и их суммарный коэффициент объясненной дисперсии', fontsize = 15)
plt. xlabel ('Количество компонентов', fontsize = 12)
plt.ylabel ('Cumulative Explained Variance Ratio', fontsize = 12)

График показывает, что порог в 90% пересекается при PC = 4. В идеале мы можем оставить здесь 4 (или максимум 5) компонентов. До PC = 5 график следует восходящей тенденции. После перехода 5 он почти устойчив. Однако мы продали здесь все 9 ПК, чтобы получить полные данные о результатах. И для целей визуализации на двумерном рисунке мы построили только ПК1 и ПК2.

#Principal Component Data Decomposition
colnames = list (data.columns)
pca_data = pd.DataFrame ({'Features': colnames, 'PC1': pc.components_ [0], 'PC2': pc .components_ [1], 'PC3': pc.components_ [2],
'PC4': pc.components_ [3], 'PC5': pc.components_ [4], 'PC6': pc.components_ [5], 'PC7': pc.components_ [6],
'PC8': pc.components_ [7], 'PC9': pc.components_ [8]})
pca_data

тогда мы увидим

# Визуализировать 2 основных компьютера
fig = plt.figure (figsize = (12,6))
sns.scatterplot (pca_data.PC1, pca_data.PC2, hue = pca_data.Features, marker = 'o' , s = 500)
plt.title ('PC1 vs PC2', fontsize = 15)
plt.xlabel ('Principal Component 1', fontsize = 12)
plt.ylabel (' Основной компонент 2 ', fontsize = 12)
plt.show ()

Мы видим, что 1-й главный компонент (ось X) тяготеет в основном к таким характеристикам, как ожидаемая продолжительность жизни, ВВП, доход. 2-й главный компонент (ось Y) в основном тяготеет к таким функциям, как импорт, экспорт.

# Экспортировать результаты PCA в файл
pca_data.to_csv («PCA_results.csv», index = False)

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

Это самый популярный метод кластеризации. Он использует евклидово расстояние между кластерами на каждой итерации, чтобы решить, какая точка данных должна принадлежать какому кластеру, и действовать соответствующим образом. Решить сколько нет. кластеров мы можем использовать несколько методов. Основным и наиболее широко используемым методом является ** Кривая локтя **.

** Метод-1: построение кривой локтя **

На этой кривой везде, где мы наблюдаем изгиб, похожий на «колено», мы можем принять это число за идеальное «нет». кластеров для рассмотрения в алгоритме K-средних.

из yellowbrick.cluster импортировать KElbowVisualizer

#Plotting Elbow Curve
из sklearn.cluster import KMeans
from yellowbrick.cluster import KElbowVisualizer
из метрик импорта sklearn

model = KMeans ()
visualizer = KElbowVisualizer (model, k = (1,10))
visualizer.fit (data_scaled)
visualizer.show ()

Здесь по оси Y «искажение» определяется как «сумма квадратов разностей между наблюдениями и соответствующим центроидом». Это то же самое, что и WCSS (внутрикластерная сумма квадратов).

Давайте посмотрим на центроиды кластеров. После этого мы подгоним наши масштабированные данные в модель K-средних, имеющую 3 кластера, а затем пометим каждую точку данных (каждую запись) в один из этих 3 кластеров.

# Подгонка данных в модель K-средних с 3 кластерами
km_3 = KMeans (n_clusters = 3, random_state = 12345)
km_3.fit (data_scaled)
print (km_3.cluster_centers_)

Мы видим, что каждая запись имеет метку 0,1,2. Эта метка соответствует каждому из их cluster_id, то есть какому кластеру они принадлежат. Теперь мы можем подсчитать записи в каждом кластере.

pd.Series (km_3.labels _). value_counts ()

Видно, наивысшего нет. записей принадлежит первому кластеру.

Теперь нам интересно проверить, насколько хороша наша модель кластеризации K-средних. Коэффициент силуэта - один из таких показателей, чтобы это проверить. ** Коэффициент силуэта ** рассчитывается с использованием:
* среднего внутрикластерного расстояния (a) для каждого образца;
* среднего расстояния до ближайшего кластера (b) для каждого образца
* Коэффициент силуэта для образца равен (b - a) / max (a, b)

# вычислить коэффициент силуэта для K = 3
из показателей импорта sklearn
metrics.sil Silhouette_score (data_scaled, km_3.labels_)

# вычислить SC для K = 2 - K = 10
k_range = range (2, 10)
scores = []
для k в k_range:
km = KMeans (n_clusters = k, random_state = 12345)
km.fit (data_scaled)
scores.append (metrics.silaught_score (data_scaled, km.labels_))

Мы наблюдаем самую высокую оценку силуэта - нет. кластеров 3 и 4. Однако из кривой локтя мы увидели «колено», как согнутое в точке №. кластеров 3. Итак, мы проведем дальнейший анализ, чтобы выбрать идеальное количество. кластеров от 3 до 4.

Для дальнейшего анализа мы рассмотрим ** показатель Дэвиса-Болдина ** отдельно от балла по силуэту. ** Оценка Дэвиса-Боулдина ** определяется как средняя мера сходства каждого кластера с его наиболее похожим кластером, где сходство - это отношение расстояний внутри кластера к расстояниям между кластерами. Таким образом, кластеры, которые находятся дальше друг от друга и менее рассредоточены, дают лучший результат.

Мы также проанализируем ** SSE (сумму квадратов ошибок) **. SSE - это сумма квадратов разностей между каждым наблюдением и его средним значением по кластеру. Его можно использовать как меру вариации внутри кластера. Если все случаи в кластере идентичны, SSE тогда будет равно 0. Формула для SSE: 1

Метод 2: построение графиков SSE, оценок Дэвиса-Боулдина, силуэтных оценок для определения идеального количества кластеров

из sklearn.metrics импортировать davies_bouldin_score, silhouette_score, silhouette_samples
sse, db, slc = {}, {}, {}
для k в диапазоне (2, 10):
kmeans = KMeans ( n_clusters = k, max_iter = 1000, random_state = 12345) .fit (data_scaled)
если k == 4: labels = kmeans.labels_
cluster = kmeans.labels_
sse [k] = kmeans.inertia_ # Инерция: сумма расстояний от выборок до ближайшего центра кластера
db [k] = davies_bouldin_score (data_scaled, cluster)
slc [k] = silhouette_score (data_scaled, кластеры)

# Построение SSE
plt.figure (figsize = (12,6))
plt.plot (list (sse.keys ()), list (sse.values ​​()))
plt .xlabel («Число кластеров», fontsize = 12)
plt.ylabel («SSE (Сумма ошибок в квадрате)», fontsize = 12)
plt.title («Сумма ошибок в квадрате против числа . of Clusters », fontsize = 15)
plt.show ()

Мы можем видеть «колено» как согнутое как в 3-м, так и в 4-м месте, но все еще не считая «нет». of cluster = 4 кажется лучшим выбором, потому что после 4 больше не наблюдается «изгиба», подобного наблюдаемому. Тем не менее, мы проанализируем дальше, чтобы выбрать между 3 и 4.

#Plotting Davies-Bouldin Score
plt.figure (figsize = (12,6))
plt.plot (list (db.keys ()), list (db.values ​​()))
plt.xlabel («Число кластеров», fontsize = 12)
plt.ylabel («Значения Дэвиса-Болдина», fontsize = 12)
plt.title («Баллы Дэвиса-Болдина по сравнению с« Нет » . of Clusters », fontsize = 15)
plt.show ()

явно нет выбора для = 3 в лучшем выборе.

plt.figure (figsize = (12,6))
plt.plot (list (slc.keys ()), list (slc.values ​​()))
plt.xlabel («Номер кластера ”, Fontsize = 12)
plt.ylabel (« Silhouette Score », fontsize = 12)
plt.title (« Silhouette Score vs Number of Clusters », fontsize = 15)
plt .Показать()

Количество кластеров = 3 также кажется лучшим выбором. Оценка силуэта варьируется от -1 до +1, где высокое значение указывает, что объект хорошо соответствует своему собственному кластеру и плохо соответствует соседним кластерам. Оценка около 0,28 кажется хорошей.

Силуэтные графики для разного количества кластеров: **
Теперь мы нарисуем силуэтные графики для разного количества кластеров. кластеров, чтобы получить больше информации. Рядом мы будем наблюдать форму кластеров на 2-мерном рисунке.

# Силуэты для разного количества кластеров
import matplotlib.cm as cm
import numpy as np
для n_clusters в диапазоне (2, 10):
fig, (ax1, ax2) = plt.subplots (1, 2)
fig.set_size_inches (18, 8)
# 1-й подзаголовок - график силуэта
# Коэффициент силуэта может варьироваться от -1, 1 но здесь диапазон от -0,2 до 1
ax1.set_xlim ([- 0,2, 1])
# (n_clusters + 1) * 10 предназначен для вставки пробела между графиками силуэтов отдельных кластеров, чтобы четко их разграничить.
ax1.set_ylim ([0, len (data_scaled) + (n_clusters + 1) * 10])
# Инициализировать кластеризатор со значением n_clusters и начальным числом случайного генератора 12345 для воспроизводимости .
cluster_labels = KMeans (n_clusters = n_clusters, max_iter = 1000, random_state = 12345)
cluster_labels = clusterer.fit_predict (data_scaled)
# Silhouette_score дает среднее значение для всех выборок
# Это дает представление о плотности и разделении t он сформировал кластеры
silhouette_avg = silhouette_score (data_scaled, cluster_labels)
print («Для n_clusters =», n_clusters, «Среднее значение silhouette_score:», silhouette_avg)
# Вычислить оценки силуэта для каждого sample
sample_sil Silhouette_values ​​= silhouette_samples (data_scaled, cluster_labels)
y_lower = 10
для i в диапазоне (n_clusters):
# Сгруппируйте оценки силуэтов для образцов, принадлежащих кластеру i, и отсортируйте их .nipy_spectral (float (i) / n_clusters)
ax1.fill_betweenx (np.arange (y_lower, y_upper),
0, ith_cluster_sil Silhouette_values,
facecolor = color, edgecolor = color, alpha = 0.7 )

# Обозначьте силуэты их номерами кластеров посередине
ax1.text (-0.05, y_lower + 0.5 * size_cluster_i, str (i))

# Вычислить новый y_lower для следующего графика
y_lower = y_upper + 10

ax1.set_title («График силуэта для различных кластеров»)
ax1.set_xlabel («Значения коэффициента силуэта»)
ax1.set_ylabel («Метка кластера»)

# Вертикальная линия для средней оценки силуэта для всех значений
ax1.axvline (x = silhouette_avg, color = "red", linestyle = "-")

ax1.set_yticks ([]) # Очистить метки оси y
ax1.set_xticks ([- 0.2, 0, 0.2, 0.4, 0.6, 0.8, 1])

# 2-й график, показывающий фактические сформированные кластеры
colors = cm.nipy_spectral (cluster_labels.astype (float) / n_clusters)
ax2.scatter (data_scaled [:, 0], data_scaled [:, 1], маркер = '.', s = 30, lw = 0, alpha = 0.7, c = colors, edgecolor = 'k')

# Обозначение кластеров
center = clusterterer.cluster_centers_
# Нарисуйте белые круги в центрах кластеров
ax2.scatter (центры [:, 0], центры [:, 1], marker = 'o ', c = "белый", альфа = 1, s = 200, edgecolor =' k ')

для i, c в перечислении (центры):
ax2.scatter (c [0], c [1], marker = '$% d $'% i, alpha = 1, s = 50, edgecolor = ' k ')

ax2.set_title («Визуализация кластеризованных данных».)
ax2.set_xlabel («Пространство для 1-го элемента»)
ax2.set_ylabel («Пространство для 2-го элемента»)

plt.suptitle ((«Анализ силуэта для кластеризации KMeans на примере данных с n_clusters =% d»% n_clusters), fontsize = 14, fontweight = ’bold’)

plt.show ()

preds = km_3.labels_
data_df = pd.DataFrame (data)
data_df [‘KM_Clusters’] = preds
data_df.head (10)

Теперь мы визуализируем 3 кластера для различных пар функций. Изначально я выбирал пары случайным образом. Позже я выбрал пары, включающие «ВВП», «доход», «инфляцию» и т. Д. Важные характеристики. Поскольку мы озабочены анализом профилей стран, а «ВВП» является основным показателем, отражающим статус страны, мы в основном озабочены этим.

#Visualize cluster: Feature Pair-1
import matplotlib.pyplot as plt_1
plt_1.rcParams ['axes.facecolor'] = 'lightblue'
plt_1.figure (figsize = (12,6 ))
plt_1.scatter (data_scaled [:, 0], data_scaled [:, 1], c = cluster_labels) # детская смертность по сравнению с экспортом
plt_1.title («Детская смертность по сравнению с экспортом (визуализировать кластеры KMeans ) », Fontsize = 15)
plt_1.xlabel (« Детская смертность », fontsize = 12)
plt_1.ylabel (« Exports », fontsize = 12)
plt_1.rcParams ['оси .facecolor '] =' голубой '
plt_1.show ()

Иерархическая кластеризация

Существует два типа иерархической кластеризации: ** Divisive ** и ** Agglomerative **. В методе делительной (нисходящей) кластеризации все наблюдения назначаются одному кластеру, а затем этот кластер разбивается на два наименее похожих кластера, а затем эти два кластера снова разбиваются на несколько кластеров, и, таким образом, процесс продолжается. В агломерации (снизу вверх) применяется противоположный подход. Здесь идеала нет. кластеров определяется ** дендрограммой **.

Метод 1: построение дендрограммы с использованием карты кластеров

импортировать seaborn как sns
cmap = sns.cubehelix_palette (as_cmap = True, rot = -. 3, light = 1)
g = sns.clustermap (data_scaled, cmap = cmap, linewidths = .5)

Из приведенной выше дендрограммы мы можем рассматривать минимум 2 кластера или максимум 6 кластеров. Мы снова проверим дендрограмму, используя ** Метод Варда **. Метод Уорда - альтернатива одноканальной кластеризации. Этот алгоритм работает для поиска раздела с небольшой суммой квадратов (чтобы минимизировать дисперсию внутри кластера).

Метод 2: Построение дендрограммы с использованием метода Уорда

# Использование дендрограммы для поиска оптимального количества кластеров
import scipy.cluster.hierarchy как sch

plt.rcParams ['axes.facecolor'] = 'white'
plt.rcParams ['axes.grid'] = False
dendrogram = sch.dendrogram (sch.linkage (data_scaled, method = 'ward '))
plt.title («Дендрограмма с использованием метода Уорда», fontsize = 15)
plt.xlabel (' Clusters ', fontsize = 12)
plt.ylabel (' Евклидовы расстояния ' , fontsize = 12)
plt.rcParams ['axes.facecolor'] = 'white'
plt.rcParams ['axes.grid'] = False
plt.show ()

Кластеризация DBSCAN

DBSCAN - это аббревиатура от «Пространственная кластеризация приложений с шумом на основе плотности». Этот алгоритм группирует точки, которые расположены близко друг к другу, на основе измерения расстояния (обычно евклидова расстояния) и минимального количества точек. Он также отмечает шум как выбросы (шум означает точки, которые находятся в областях с низкой плотностью).

Я обнаружил интересный результат с DBSCAN, когда использовал все возможности данных по стране. Это дало мне один кластер. ** Я полагаю, это было очень очевидно, потому что наши данные почти равномерно распределены, поэтому с точки зрения плотности этот алгоритм не мог разделить точки данных на более чем один кластер. Следовательно, я использовал только те функции, которые имеют высокую корреляцию с «GDPP». Я также сохранил «Детская смертность» и «Общая фертильность» в моем рабочем наборе данных, поскольку они имеют поляризацию - некоторые точки данных имеют чрезвычайно высокие значения, некоторые - чрезвычайно низкие значения (см. Соответствующие диаграммы разброса в разделе профилирования данных в начале).

from sklearn.cluster import DBSCAN
import sklearn.utils
from sklearn.preprocessing import StandardScaler

Clus_dataSet = data [['child_mort', 'экспорт', 'здоровье', 'импорт »,' доход ',' инфляция ',' life_expec ',' total_fer ',' gdpp ']]
Clus_dataSet = np. nan_to_num (Clus_dataSet)
Clus_dataSet = np.array (Clus_dataSet, dtype = np.float64)
Clus_dataSet = StandardScaler (). fit_transform (Clus_dataSet)

# Вычислить DBSCAN
db = DBSCAN (eps = 1, min_samples = 3) .fit (Clus_dataSet)
core_samples_mask = np.zeros_like (db.labels_)
core_samples_mask [db.core_sample_indices_] = True
label = db.labels_
#data ['Clus_Db'] = label

realClusterNum = len (set (метки)) - (1, если -1 в метках, иначе 0)
clusterNum = len (set (метки))

# Пример кластеров
print (data [['child_mort', 'exports', 'health', 'import', 'доход', 'инфляция', 'life_expec', 'total_fer', 'gdpp'] ].голова())

# количество этикеток
print («количество этикеток:», набор (этикеток))

У нас есть 7 кластеров, использующих кластеризацию на основе плотности, что является отличным наблюдением (7 намного больше, чем 3, которые мы получили во всех трех различных алгоритмах кластеризации, которые мы использовали ранее).

# сохраняем метки кластера и сортируем по кластеру
datacopy = data.copy ()
datacopy = datacopy.drop ('KM_Clusters', axis = 1)
datacopy ['DB_cluster'] = db .labels_

#Visualize cluster: Random Feature Pair-1 (доход vs gdpp)
импортировать matplotlib.pyplot как plt_3
plt_3.rcParams ['axes.facecolor'] = 'orange'
plt_3.figure ( figsize = (12,6))
plt_3.scatter (datacopy ['доход'], datacopy ['gdpp'], c = db.labels_)
plt_3.title ('Income vs GDPP (Visualize DBSCAN Clusters) ', fontsize = 15)
plt_3.xlabel («Доход», fontsize = 12)
plt_3.ylabel («GDPP», fontsize = 12)
plt_3.rcParams [' axes.facecolor '] =' оранжевый '
plt_3.show ()

#Visualize cluster: Random Feature Pair-2 (инфляция против gdpp)
импортировать matplotlib.pyplot как plt_3
plt_3.figure (figsize = (12,6))
plt_3.scatter (datacopy [ 'inflation'], datacopy ['gdpp'], c = db.labels_)
plt_3.title ('Inflation vs GDPP (Visualize DBSCAN Clusters)', fontsize = 15)
plt_3.xlabel (" Инфляция », fontsize = 12)
plt_3.ylabel (« GDPP », fontsize = 12)
plt_3.rcParams ['axes.facecolor'] = 'orange'
plt_3.show ()

Если вы хотите реализовать код своими руками, нажмите кнопку и внедрите код от начала до конца с кратким объяснением.

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

Для получения дополнительной информации свяжитесь со мной в моей учетной записи Linkedin !

СПАСИБО !!!!