IIS_2023_1/sergeev_evgenii_lab_4/lab4.py
sergeevevgen 440a8d78cf done lab4
2023-11-10 03:18:59 +04:00

50 lines
2.4 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import pandas as pd
import numpy as np
from sklearn.cluster import DBSCAN
from sklearn.preprocessing import LabelEncoder
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt
# Загружаю данные
df = pd.read_csv("hotel_bookings_raw.csv", delimiter=',')
# Объявляю объект для преобразования строковых значений в числовые
label_encoder = LabelEncoder()
# Признаки, по которым будет проходить кластеризация
features = ['lead_time', 'stays_in_weekend_nights', 'adults', 'children', 'babies', 'adr']
# Применяю к каждому столбцу признака преобразования
for f in features:
df[f] = label_encoder.fit_transform(df[f])
# Создаю объект для стандартизации данных
scaler = StandardScaler()
# Стандартизую признаки
scaled_features = scaler.fit_transform(df[features])
# Создаю объект для метода кластеризации DBSCAN
# Это алгоритм кластеризации,
# основанной на плотности —
# если дан набор точек в
# некотором пространстве, алгоритм
# группирует вместе точки, которые тесно расположены
# (точки со многими близкими соседями[en]), помечая как выбросы
# точки, которые находятся одиноко в областях с малой плотностью
# (ближайшие соседи которых лежат далеко). DBSCAN является одним
# из наиболее часто используемых алгоритмов кластеризации, и наиболее часто упоминается в научной литературе
dbscan = DBSCAN(eps=0.3, min_samples=5)
# Кластеризую данные по этим признакам
clusters = dbscan.fit_predict(scaled_features)
# Создаю график
plt.scatter(df[features[0]], df[features[1]], c=clusters)
plt.title('Метод кластеризации - DBSCAN')
plt.xlabel('Время до заезда')
plt.ylabel('Забронировано ночей в выходные дни')
# Сохранение графика в файл .png
plt.savefig('clusters.png', dpi=300)