Визуализация категориального столбца на диаграмме рассеяния Python во время кластеризацииPython

Программы на Python
Ответить
Anonymous
 Визуализация категориального столбца на диаграмме рассеяния Python во время кластеризации

Сообщение Anonymous »

В рамках исследования для магистерского проекта я в настоящее время запускаю HDBSCAN на огромном наборе геопространственных данных о местах проверки на грызунов в Нью-Йорке (с сайта открытых данных Нью-Йорка). Помимо запуска алгоритма определения координат широты и долготы каждого сайта, я добавляю третий столбец — категориальный столбец «INSPECTION_TYPE» с тремя возможными значениями: «Исходное», «BAIT» и «Соответствие». Я пытаюсь изменить форму маркера на диаграмме рассеяния для каждой точки в зависимости от того, какой тип проверки произошел на объекте, сопоставляя каждое значение с другой формой после горячего кодирования столбца.
Вот проблема: введение INSPECTION_TYPE приводит к беспорядочной кластеризации: точки, которые должны быть членами кластера, рассматриваются как шум (отмечены серым цветом), а некоторые кластеры перекрываются с другими (точки в кластере ненасыщены на основе по близости к ядру). Кроме того, каждая точка помечается всеми тремя категориями INSPECTION_TYPE, в результате чего точки одновременно оформляются в виде кругов, квадратов и треугольников.
Для справки, вот код:

Код: Выделить всё

import pandas as pd
import hdbscan
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler

if __name__ == '__main__':

plot_kwds = {'alpha' : 0.5, 's' : 50, 'linewidth' : 0}

df = pd.read_csv('Rodent_Inspection_20251121.csv')
pd.set_option('display.max_columns', None)

df.dropna(inplace=True)
df = df.head(n=10000)

X = df[['LONGITUDE', 'LATITUDE', 'INSPECTION_TYPE']]

X = pd.get_dummies(X, columns=['INSPECTION_TYPE'], dtype=int)

X_scaled = StandardScaler().fit_transform(X)

hdb = hdbscan.HDBSCAN(min_cluster_size=20)
hdb.fit(X_scaled)

palette = sns.color_palette('bright', len(set(hdb.labels_)) - (1 if -1 in hdb.labels_ else 0))
cluster_colors = [sns.desaturate(palette[col], 0.5) if col >= 0 else (0.5, 0.5, 0.5) for col in hdb.labels_]

marker_map = {
'INSPECTION_TYPE_Initial': 'o',
'INSPECTION_TYPE_BAIT': 's',
'INSPECTION_TYPE_Compliance': '^'
}

for col_name, marker_type in marker_map.items():
plt.scatter(x=X_scaled.T[0], y=X_scaled.T[1], marker=marker_type, c=cluster_colors, **plot_kwds)

print(f'Number of clusters: {len(set(hdb.labels_)) - 1}')

plt.show()
Вот как выглядит диаграмма рассеяния для приведенного выше кода:
Результирующая диаграмма рассеяния
Увеличена, чтобы показать детали
Вот как диаграмма рассеяния выглядит с исключенным столбцом INSPECTION_TYPE, все остальное остается прежним:
Результирующая диаграмма рассеяния
Увеличено, чтобы показать детали

Подробнее здесь: https://stackoverflow.com/questions/798 ... clustering
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»