Собираетесь в отпуск в ближайшее время? (Я бы хотел, чтобы я был)

Если вы недавно забронировали номер в отеле, скорее всего, у вас есть возможность отменить бронирование. Каналы онлайн-бронирования отелей радикально изменили как поведение клиентов, так и способы бронирования. Растущее число бронирований отелей приводит к отмене или незаезду, в результате чего остаются свободные гостиничные номера, которые в противном случае могли бы быть заполнены. В то время как возможность отменить бронирование бесплатно или по низкой цене может быть выгодной для гостей, она невыгодна для отелей, поскольку может привести к упущенной выгоде.

В этом проекте для моего курса по машинному обучению в UBC я рассмотрел, как владельцы отелей могут лучше понять и предсказать, собирается ли клиент отменить бронирование или выполнить его.

Данные

Данные, используемые для этого проекта, были получены из https://www.kaggle.com/datasets/gauravduttakiit/reservation-acancellation-prediction?select=train__dataset.csv. Необработанные данные состояли из 18 000 бронирований, каждое из которых содержало 18 столбцов данных, с целью прогнозирования статуса_бронирования.

На первый взгляд, есть 18 функций, включая id, некоторые из которых являются числовыми, а другие содержат нечисловые (категориальные) значения.

Очистка данных

Я удалил строки с датой прибытия 29 февраля, поскольку ни один из годов, за которые были собраны данные (2017–2018), не был високосным.

Изучение данных

Во-первых, взглянув на столбец booking_status, можно увидеть дисбаланс в классах (то есть было ли бронирование отменено или нет).

Мы видим, что две трети бронирований не были отменены, и одна треть из них была отменена. Таким образом, классы являются несбалансированными.

Я создал тепловую карту со всеми отдельными функциями. Хотя на этой тепловой карте много всего происходит, мы можем посмотреть на нижнюю строку, чтобы увидеть корреляцию между статусом_бронирования и всеми другими функциями. Это показывает нам, что lead_time имеет наибольшую корреляцию или наибольшее влияние на booking_status.

Разработка функций

Я объединил функции arrival_month_and_year и arrival_year в одну функцию arrival_month_and_year для использования в анализе.

Предварительная обработка и преобразование

Поскольку числовые признаки в данных имеют разную величину, я масштабировал эти признаки так, чтобы они имели одинаковую величину.

Что касается нечисловых (категориальных) признаков, я преобразовал их в числовое представление, поскольку нашей модели для работы нужны числовые значения. Я сделал это, создав новые столбцы для каждого другого значения категориальных признаков, и каждая строка имела 0 или 1 для столбца, который соответствовал исходному категориальному значению.

Модель

Метод оценки

Мы хотим быть максимально уверены, что бронирование будет отменено до того, как мы сделаем этот прогноз. В противном случае мы рискуем дважды забронировать номер в отеле. По этим причинам вместо того, чтобы рассматривать точность, мы рассмотрим метод подсчета очков, называемый «точность», который определяется количеством истинных положительных результатов (фактических отмен) среди всех прогнозируемых положительных результатов (прогнозируемых отмен).

Выбор модели

Я протестировал пять разных моделей, в том числе сочетание линейных и древовидных моделей. Из всех них RandomForestClassifier продемонстрировал наилучшую производительность с показателем точности 85% на тестовых данных.

Оптимизация гиперпараметров

Двигаясь вперед с победителем, RandomForestClassifier, я стремился максимизировать результат теста, регулируя степень, в которой модель была «обучена» на данных. Например, на какое количество функций лучше всего обратить внимание при обучении модели? Я выбрал три переменные (или гиперпараметры) для оптимизации и использовал метод рандомизированного поиска ((RandomizedSearchCV), чтобы найти наилучшие значения для этих переменных.

Благодаря оптимизации и настройке этих гиперпараметров мне удалось улучшить оценку примерно на 4% (с 85% до 89%)! Хорошая работа RandomForestClassifier + RandomizedSearchCV!

Результаты

Модель набрала 88,3%. Учитывая размер набора данных, на котором мы обучали модель, я очень доверяю модели и считаю маловероятным, что модель была подвержена влиянию какой-либо значительной случайности в процессе обучения.

Более того, согласованность и высокие оценки, которые мы наблюдаем для нашей модели, наводят нас на мысль, что наша модель с большей вероятностью будет устойчива к невидимым данным.

Предостережения

Результаты этой модели можно улучшить, изучив и настроив другие гиперпараметры используемого RandomForestClassifier, поскольку эта модель настраивает только три гиперпараметра.

Кроме того, можно исследовать, тестировать и оптимизировать другие классификаторы ансамбля посредством настройки гиперпараметров. В своем тестировании я включил только DummyClassifier, LogisticRegression, DecisionTreeClassifier и SVC от scikit-learn. Некоторые другие модели, которые можно было бы протестировать, — это CatBoost, XGBoost и LGBM.

Производительность также потенциально может быть повышена за счет более порогового тестирования, где «порог» — это то, что классифицирует «0» или «1» для booking_status данного бронирования. Это можно было бы сделать с помощью кривой ROC, которая отображает производительность модели при всех порогах классификации.