IIS_2023_1/kurmyza_pavel_lab_6/main.py

105 lines
4.6 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
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))