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))