Как определять предложения отелей - с помощью машинного обучения

Лас-Вегас - одно из лучших мест отдыха на планете. Это центр мировой индустрии развлечений. В этом отрывке я хочу изучить теорию прогнозирования цен на отели в Лас-Вегасе с помощью машинного обучения, чтобы в конечном итоге определить, предлагается ли вам сделка. Поехали!

Благодаря современной технологии динамического ценообразования цены на отели могут колебаться каждую минуту. Это связано с множеством причин, таких как спрос и предложение, конкуренция, сезонность, местоположение и день недели. Для простоты этого проекта я хочу выяснить, можем ли мы предсказать цену отеля в Лас-Вегасе, используя два основных фактора: местоположение и день недели. Конечно, мы будем использовать другие атрибуты в дополнение к этим основным факторам, но мы поговорим об этом позже. Я надеюсь использовать этот блог, чтобы объяснить свой рабочий процесс для этого проекта и подробно рассказать о некоторых решениях, которые в него вошли. Наслаждаться!

Вот мой подход:

  1. Удалите информацию о гостиницах с сайта Hotels.com
  2. Предварительно обработать данные
  3. Обучите модель машинного обучения
  4. Оцените производительность модели
  5. Выводы и рекомендации

Веб-парсинг

Я использовал BeautifulSoup и Selenium параллельно, чтобы очистить 3 месяца информации о списке отелей с Hotel.com. В частности, я собрал информацию о датах заезда и выезда, количестве взрослых и детей, расстоянии до города и конференц-центров, адресах отелей, обзорах и рейтингах отелей, рейтингах и обзорах TripAdvisor, удобствах в отелях и стоимости размещения. Я хочу, чтобы этот отрывок был больше посвящен машинному обучению, чтобы не утомлять вас деталями соскабливания. Если вам интересно, как я использовал BeautifulSoup и Selenium, вы можете найти дополнительную информацию на моем GitHub.

Предварительная обработка данных и EDA

Полученные необработанные данные были чрезвычайно беспорядочными. С ноября 2019 года по январь 2020 года мне удалось собрать в общей сложности 20 000 списков отелей. Если вам интересны данные, вы можете найти набор данных на моем GitHub. После предварительной обработки и извлечения всей полезной информации мы получили следующие возможности:

  • Даты заезда и выезда
  • Количество взрослых и детей
  • Расстояние от центра города и конференц-центра
  • Почтовый Индекс
  • Рейтинги и обзоры отелей
  • Количество отзывов гостей
  • Рейтинги и отзывы TripAdvisor
  • Цена листинга
  • Удобства в отеле

Несмотря на то, что цены на отели в значительной степени зависят от спроса и предложения, сезонности, конкуренции, местоположения и дня недели, как я упоминал выше, я хочу посмотреть, сможем ли мы создать надежную модель машинного обучения, просто используя только те функции, которые я скопировал. Вот средние цены на отели в Лас-Вегасе с ноября 2019 г. по январь 2020 г.

Непосредственно наблюдаются скачки цен 11.06, 30.12 и 01.08. Я также посмотрел на распределение цен, оно сильно искажено, поэтому обычный этап обработки - его преобразование. В этом случае я использовал логарифмическое преобразование, чтобы сделать распределение цен более нормальным.

Затем я использовал метод горячего кодирования, чтобы превратить все категориальные функции в единицы или нули. Я также отфильтровал некоторые объявления, которые превышают цену в 450 долларов за ночь. Наконец, у нас есть в общей сложности около 16 000 наблюдений и 104 функции после предварительной обработки.

Моделирование

Излишне говорить, что это проблема линейной регрессии. Напомним, вот пять допущений для линейного регрессионного анализа:

  • Связь между нашими входными функциями и выходной переменной линейна.
  • Функции нормально распределены
  • Между функциями практически отсутствует мультиколлинеарность
  • Между функциями практически отсутствует автокорреляция.
  • Остатки равномерно распределяются около нуля.

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

В соответствии со стандартной процедурой мы разделяем наши данные на набор для обучения, проверки и тестирования. Мы предоставим тестовый набор для нашей окончательной оценки. Я использовал пакет Statsmodel для создания предварительной модели обыкновенных наименьших квадратов (OSL). Statsmodel удобно генерирует сводную таблицу, в которой отображаются R² и скорректированное значение R². Что еще более важно, он также выводит список p-значений для всех наших функций. Значение p является мерой значимости признаков. Я удалил все функции с p-значением 0,05 или выше. Значение p 0,05 означает, что наблюдаемые данные могут быть получены случайно в 5% случаев. Значение R² - это то, насколько вариативность объясняет модель. В нашем случае значение R² равно 0,602, что означает, что наша модель объясняет около 60% дисперсии.

Следуя предварительной модели, я использовал регрессию Лассо и Ридж из пакета Scikit-learn. Алгоритм Лассо и Ридж позволил нам применить регуляризацию, чтобы помочь с переобучением.

  • Регрессия лассо поможет при выборе признаков, наказывая признаки, которые менее важны для модели, путем присвоения нулей его коэффициенту (бета). Коэффициент регуляризации оказался равным 0,0001. Это говорит нам о том, что модель регрессии Лассо по сути такая же, как наша простая модель линейной регрессии, и никакие особенности не были исключены.
  • С другой стороны, гребенчатая регрессия поможет справиться с мультиколлинеарностью признаков. Он ослабляет влияние характеристик с высокой мультиколлинеарностью, присваивая очень низкое значение коэффициента бета. Коэффициент регуляризации составил 13,970. Это означает, что в наших данных присутствует мультиколлинеарность, но регрессия Риджа может уменьшить этот эффект.
  • Эффективный способ найти оптимальные гиперпараметры, такие как коэффициенты регуляризации, - использовать GridSearchCV. Это метод перекрестной проверки, используемый для поиска по диапазону параметров при оптимизации для оценки, указанной пользователем.

Оценка

Есть много оценочных показателей, которые мы можем использовать для решения нашей проблемы. На ум сразу приходят две: Средняя абсолютная ошибка (MAE) и Среднеквадратичная ошибка (RMSE). RMSE - хороший показатель, если мы хотим наказать модели, которые плохо предсказывают выбросы. Поскольку мы отфильтровали наш набор данных до цены 450 долларов за ночь или меньше, использования MAE будет достаточно. Наконец, вот результаты:

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

Из кривой обучения мы видим, что как оценка обучения, так и оценка проверки приближаются к асимптотическому значению 32 доллара. Модель не страдает высокой систематической ошибкой или высокой дисперсией. Чтобы улучшить оценку, нам потребуются дополнительные функции или более сложный алгоритм.

И последнее, но не менее важное: ниже указана прогнозируемая цена в сравнении с фактической ценой. Мы видим, что модель лучше предсказывает отели более низкого уровня до 150 долларов. Это имеет смысл, потому что по мере того, как отели становятся дороже, появляются другие особенности, такие как размер комнаты, качество обслуживания или другие удобства, которые наша модель не учитывала.

Выводы и рекомендации

Самая важная часть работы над проблемой машинного обучения - это поиск основного сообщения на основе наших результатов. Мы часто можем спросить - Почему нам важны эти результаты? Имеют ли эти результаты смысл? Или эти результаты раскрывают информативную информацию о нашей проблеме?

Давайте посмотрим на коэффициенты нашей функции (бета).

Отели являются наименее дорогими, если они забронированы в указанные даты и / или расположены по этим почтовым индексам.

Напомним еще раз: цены на отели сильно зависят от спроса и предложения, сезонности, конкуренции, местоположения и дня недели. Мы использовали только две из пяти переменных (местоположение и день недели) для построения модели. И, наконец, эта модель в среднем лучше работает при прогнозировании цен на листинг более дешевых отелей.

И если вы зашли так далеко, давайте вернемся к нашему первоначальному вопросу (как следует из названия) - «Как определять предложения отелей?»

  1. Вы хотите забронировать номер в Лас-Вегасе, и вам предложат 150 долларов за ночь.
  2. Модель прогнозирует цену в 182 доллара.
  3. В среднем, поскольку MAE составляет 32 доллара, отель должен стоить от 214 долларов или до 150 долларов.
  4. Если прогнозируемая цена как минимум на 32 доллара выше цены листинга, вы заключили сделку!

Этот метод далеко не идеален. Мы предположили, что цены на отели статичны, а мы знаем, что это не так. Мы также предположили, что вы делаете бронирование на несколько месяцев вперед, так как данные были извлечены на будущее относительно того, когда они были извлечены.

Таким образом, прогнозировать цены на отели сложно без данных о сезонности, спросе и предложении, а также конкуренции. Еще сложнее заставить машину определять, предлагается ли вам сделка или нет, используя статический набор данных.

Спасибо за чтение!

Репозиторий проекта можно найти здесь.

Вы также можете найти этот пост в моем LinkedIn.