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