kurmyza_pavel_lab_6 is ready #143

Merged
Alexey merged 1 commits from kurmyza_pavel_lab_6 into main 2023-11-06 21:44:25 +04:00
5 changed files with 119546 additions and 0 deletions

View File

@ -0,0 +1,51 @@
# Лабораторная работа №6
## ПИбд-41, Курмыза Павел
Датасет по варианту: https://www.kaggle.com/datasets/jessemostipak/hotel-booking-demand.
Данный набор данных содержит информацию о бронировании городской и курортной гостиниц и включает в себя такие
сведения, как время бронирования, продолжительность пребывания, количество взрослых, детей и/или младенцев, количество
свободных парковочных мест и т.д.
## Как запустить ЛР
- Запустить файл main.py
## Используемые технологии
- Язык программирования Python
- Библиотеки: sklearn, numpy, pandas, xgboost, matplotlib, seaborn
## Что делает программа
Программа решает задачу классификации на выбранном датасете: определение гостиничного класса отеля (городской отель или
курортный отель). Решение достигается в несколько этапов:
- Предобработка данных
- Балансировка данных
- Стандартизация данных и приведение их к виду, удобном для работы с моделью ML
- Использование модели классификации MLPClassifier
- Оценка точности и специфичности данной модели классификации
## Тестирование
Для решения задачи классификации были выбрана модель MLPClassifier.
Оценка точности модели: 0.9778297119757453
![Отчет классификации](classification_report.jpg)
Оценка способности модели MLPClassifier предсказывать истинные положительные результаты (TP / (TP + FN)), также
известные как коэффициент чувствительности, и истинные отрицательные результаты (TN / (TN + FP)), также известный как
коэффициент специфичности через матрицу неточностей:
![Матрица неточностей](confusion_matrix.jpg)
Матрица неточностей подтверждает приведенную ранее оценку модели MLPClassifier. Кроме того, она указывает на
то, что помимо высокой точности, модель также имеет высокую специфичность.
## Вывод
По итогу тестирования было выявлено, что модель MLPClassifier подходит для решения поставленной задачи, на что указывают
высокая оценка точности (97%) и специфичности данной модели.

Binary file not shown.

After

Width:  |  Height:  |  Size: 33 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 27 KiB

File diff suppressed because it is too large Load Diff

104
kurmyza_pavel_lab_6/main.py Normal file
View File

@ -0,0 +1,104 @@
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.preprocessing import LabelEncoder
from sklearn.feature_selection import VarianceThreshold
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix, classification_report
import seaborn as sns
from sklearn.neural_network import MLPClassifier
# Считываем датасет
ds = pd.read_csv('hotel_bookings.csv')
# Удаляем из датасета строки с пропущенными значениями столбцов country, children.
# Выбраны именно данные столбцы, так как, по информации из kaggle, только они могут содержать пропущеные значения
ds.dropna(axis=0, subset=['country', 'children'], inplace=True)
# Усредняем значения столбца agent, чтобы убрать его влияние на результат, так как столбец содержит неважные данные
moa = ds['agent'].mean()
ds['agent'].fillna(value=moa, axis=0, inplace=True)
# Заполняем пропущенные значения ячеек, чтобы исключить незаполненные
ds.fillna(method='pad', inplace=True)
ds.dropna(inplace=True, subset=['company'])
# Переводим столбцы, содержащие текстовые данные в числовое представление
hotel = LabelEncoder()
meal = LabelEncoder()
country = LabelEncoder()
market_segment = LabelEncoder()
distribution_channel = LabelEncoder()
reserved_room_type = LabelEncoder()
assigned_room_type = LabelEncoder()
deposit_type = LabelEncoder()
customer_type = LabelEncoder()
reservation_status = LabelEncoder()
reservation_status_date = LabelEncoder()
ds['hotel_n'] = hotel.fit_transform(ds['hotel'])
ds['arrival_date_month_n'] = hotel.fit_transform(ds['arrival_date_month'])
ds['meal_n'] = hotel.fit_transform(ds['meal'])
ds['country_n'] = hotel.fit_transform(ds['country'])
ds['market_segment_n'] = hotel.fit_transform(ds['market_segment'])
ds['distribution_channel_n'] = hotel.fit_transform(ds['distribution_channel'])
ds['reserved_room_type_n'] = hotel.fit_transform(ds['reserved_room_type'])
ds['assigned_room_type_n'] = hotel.fit_transform(ds['assigned_room_type'])
ds['deposit_type_n'] = hotel.fit_transform(ds['deposit_type'])
ds['customer_type_n'] = hotel.fit_transform(ds['customer_type'])
ds['reservation_status_n'] = hotel.fit_transform(ds['reservation_status'])
ds['reservation_status_date_n'] = hotel.fit_transform(ds['reservation_status_date'])
# Удаляем приведенные к числовым данным столбцы, они больше не нужны
ds.drop(
['hotel', 'arrival_date_month', 'meal', 'country', 'market_segment', 'distribution_channel', 'reserved_room_type',
'assigned_room_type', 'deposit_type', 'customer_type', 'reservation_status', 'reservation_status_date'], axis=1,
inplace=True)
# Производим балансировку данных таким образом, чтобы было одинаковое количество отелей всех классов
ds_0 = ds[ds['hotel_n'] == 0]
ds_1 = ds[ds['hotel_n'] == 1]
ds_0 = ds_0.sample(ds_1.shape[0])
ds = ds_0._append(ds_1, ignore_index=True)
# Полдготовка данных для выполнения модели
x = ds.drop('hotel_n', axis=1)
y = ds['hotel_n']
threshold = VarianceThreshold()
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)
x_train = threshold.fit_transform(x_train)
x_test = threshold.transform(x_test)
# Производим стандартизацию данных и приводим их к виду, с которым работают модель классификации MLPClassifier
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.fit_transform(x_test)
y_train = y_train.to_numpy()
y_test = y_test.to_numpy()
# Инициализируем модель MLPClassifier и обучаем её
mlp = MLPClassifier()
mlp.fit(x_train, y_train)
# Оценка точности моделей классификации
mlp_accuracy = mlp.score(x_test, y_test)
print(f"Оценка точности модели: {mlp_accuracy}")
# Оценка коэффициента специфичности через матрицу неточностей
y_pred = mlp.predict(x_test)
cm = confusion_matrix(y_test, y_pred)
plt.figure(figsize=(7, 5))
sns.heatmap(cm, annot=True)
plt.xlabel('Prediction')
plt.ylabel('Actual')
plt.show()
print(classification_report(y_test, y_pred))