Новый прогноз бронирования пользователей AirBnB - использование машинного обучения

Одна из самых ценных сведений для любой компании - знать поведение ее пользователей. Хорошее стратегическое решение часто принимается на основе знания моделей и тенденций покупателя. Кроме того, Интернет связал мир, и наши данные используются для каждой маркетинговой кампании в Интернете. Данные стали самым ценным товаром в 21 веке.

В этом отрывке я хочу использовать машинное обучение для прогнозирования поведения нового пользователя AirBnb, чтобы определить, совершит ли пользователь бронирование в течение 5 дней после регистрации учетной записи. В этом блоге объясняется рабочий процесс этого проекта и некоторые принятые в нем решения. Наслаждаться!

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

Я также разместил приложение Flask на Heroku, не стесняйтесь проверить его здесь.

Формулировка проблемы:

Можем ли мы использовать машинное обучение, чтобы узнать о новых пользователях AirBnB?

Как мы можем использовать прогнозирование поведения пользователей, чтобы максимизировать доход от гипотетических маркетинговых кампаний?

TL;DR

Мы начали с несбалансированного набора данных, который мы нашли на Kaggle. Мы использовали ADASYN для избыточной выборки нашего обучающего набора, чтобы ввести его в базовую модель логистической регрессии. Мы решили использовать показатель AUC в качестве метрики оценки, потому что мы хотим оптимизировать порог вероятности в соответствии с нашим гипотетическим бизнес-ограничением. В заключение, используя нашу наиболее эффективную модель (CatBoost), мы должны размещать рекламу среди пользователей, у которых вероятность совершения бронирования составляет не менее 16%, чтобы максимизировать чистую прибыль. Попутно мы обнаружили, что пользователи, регистрирующиеся через веб-приложение и определенные потоки регистрации, в целом дают гораздо более высокую конверсию.

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

  1. Предварительная обработка данных
  2. Выбор модели
  3. Оценка модели и показатели
  4. Выводы и рекомендации
  5. Приложение Flask

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

Для этого проекта я использовал старый набор данных на Kaggle. Вы можете найти набор данных здесь. Первоначальная постановка задачи от Kaggle предсказывала первое путешествие во времени нового пользователя. Меня больше интересовало, сделает ли первый пользователь AirBnb бронирование или нет.

Вот некоторые из функций, которые я использовал:

  • date_account_created: дата создания учетной записи
  • timestamp_first_active: отметка времени первого действия, обратите внимание, что это может быть раньше, чем date_account_created или date_first_booking, потому что пользователь может искать до регистрации
  • date_first_booking: дата первого бронирования
  • Пол
  • возраст
  • signup_method
  • signup_flow: страница, с которой пользователь пришел для регистрации
  • язык: предпочтение международного языка
  • affiliate_channel: какой платный маркетинг
  • affiliate_provider: где находится маркетинг, например google, craigslist, другое
  • first_affiliate_tracked: с каким первым маркетингом взаимодействовал пользователь перед регистрацией
  • signup_app
  • first_device_type
  • first_browser

Поскольку мы отклоняемся от исходной постановки задачи Kaggle, мы должны создать собственную метку вывода. Я решил, что нашим положительным классом будут те, кто сделает бронирование в течение 5 дней после регистрации учетной записи AirBnB, в противном случае они будут считаться находящимися в отрицательном классе. Количество пользователей, которые создают учетную запись, но также делают бронирование, значительно уменьшается через 5 дней, поэтому я использовал 5 дней в качестве порога разделения классов.

Пользователь, который делает бронирование в течение 5 дней с момента регистрации, помечается как 1.

Пользователь, который не сделал бронирования в течение 5 дней с момента регистрации, помечается как 0.

Используя это определение, мы имеем около 40 000 положительных классов (1) и 111 500 отрицательных классов (0). На практике наш позитивный класс довольно часто бывает недопредставлен. Это называется несбалансированным набором данных. Это особенно касается таких проблем, как обнаружение мошенничества или других аномалий. Распространенным методом преодоления несбалансированных данных является избыточная выборка обучающего набора данных. Мы никогда не хотим делать избыточную выборку в нашем наборе для проверки или тестирования. В этом проекте я использовал ADASYN, что является сокращением от Adaptive Synthetic Sampling Method. После разделения данных на обучающий, проверочный и тестовый набор я применил ADASYN к обучающему набору. Сейчас мы работаем с 66 880 положительными и 69 685 отрицательными ярлыками. Наконец, приступим к моделированию ...

Модельное обучение

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

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

Я перешел к использованию других алгоритмов классификации, таких как Naive Bayes, KNN, Decision Tree, RandomForest, XGBoost и CatBoost. Я выбрал 3 самые эффективные модели на основе оценки AUC и выполнил настройку параметров для всех этих моделей. Подробности о том, как эффективно использовать GridSearchCV для настройки параметров несбалансированного набора данных, я оставлю в другом посте. Ниже приведены результаты для трех лучших моделей с наивысшими показателями AUC после настройки параметров.

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

Оценка модели и показатели

Как упоминалось выше, мы в первую очередь ориентированы на максимальное увеличение показателя AUC. AUC расшифровывается как Area Under the Curve. Это измерение производительности модели при различных порогах вероятности. Порог вероятности по умолчанию для алгоритма классификации установлен на уровне 0,50. Это означает, что если модель выдает вероятность 0,50 или больше, она предсказывает положительный класс (1). Напротив, если модель выдает вероятность 0,50 или меньше, она предсказывает отрицательный класс (0). То, где мы устанавливаем наш порог, является ограничением, специфичным для бизнес-модели. Прежде чем мы определим гипотетическое экономическое обоснование, давайте взглянем на другие вещи, которые мы могли бы учесть при выборе модели.

Интерпретируемость модели - одна из самых важных вещей, которые следует учитывать при выборе модели. В конечном итоге мы хотим иметь возможность интерпретировать результаты нашей модели и давать подробные рекомендации по проблеме. Из трех моделей (Logistics, XGBoost, CatBoost) логистическая регрессия является наиболее интерпретируемой.

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

Опять же, логистическая регрессия выигрывает в скорости, но CatBoost тоже не очень медленный.

И последнее, но самое важное, давайте рассмотрим нашу гипотетическую бизнес-проблему AirBnB.

Как мы можем использовать прогнозирование поведения пользователей, чтобы максимизировать доход от гипотетических маркетинговых кампаний?

Наша цель - максимизировать доход от гипотетической маркетинговой кампании. Давайте добавим контекст этой проблеме. После некоторого исследования я пришел к некоторым оценкам (они ни в коем случае не точны на 100%):

По прогнозам, около 2,2 миллиона новых пользователей будут использовать AirBnB в 2020 году. Ожидается, что 23% всех пользователей впервые совершат бронирование - это образец положительного класса в нашем наборе данных. AirBnB генерирует около 32 долларов дохода от каждого бронирования, когда средняя цена бронирования составляет 160 долларов за ночь (17% сборы поступают от заказчиков и 3% от хозяев). Я также оценил в среднем 5 долларов стоимости рекламы на пользователя. Не зацикливайтесь на том, откуда взялись эти цифры, но важно иметь эти бизнес-ограничения, чтобы прийти к разумному выводу. Используя эту информацию, мы можем определить стоимость и преимущества наших прогнозов для каждого пользователя.

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

Ясно, что модель CatBoost приносит наибольший доход для нашей гипотетической маркетинговой кампании. Это хорошо согласуется с нашей гипотезой о том, что наибольший показатель AUC даст наилучшие результаты. Несмотря на то, что CatBoost является более медленным алгоритмом с точки зрения времени обучения по сравнению с логистической регрессией, он превосходит логистическую регрессию на 150 000 долларов с точки зрения общей выручки. В следующем разделе я рассмотрю важность установки нашего порога вероятности равным 0,16 и его значение.

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

Как упоминалось выше, нам нужно установить порог вероятности 0,16, чтобы достичь максимального дохода для нашей гипотетической кампании. Это означает, что если наша модель предсказывает, что у нового пользователя будет 16% или выше шанс сделать бронирование, стоит нацелить этого пользователя в нашей кампании.

Давайте посмотрим на важность функций из выбранной нами модели CatBoost.

Обратной стороной использования древовидной модели является потеря интерпретируемости. В зависимости от того, в какой отрасли вы работаете, иногда важнее знать интерпретацию вашей модели, чем ее характеристики. Исходя из важности функций, все, что мы знаем, это то, что signup_flow, signup_method и signup_app являются важными факторами при прогнозировании поведения при бронировании.

Чтобы погрузиться глубже, давайте посмотрим на коэффициент модели логистической регрессии для обеспечения высокой интерпретируемости. Похоже, он хорошо согласуется с важностью функций модели CatBoost. Благодаря этому мы можем иметь некоторую уверенность в том, как каждая функция влияет на поведение пользователя.

Возьмем, к примеру, "signup_app_Web". Новые пользователи, регистрирующиеся через Интернет, имеют 6: 1 шансов сделать бронирование через 5 дней после регистрации учетной записи по сравнению с пользователями, которые не регистрируются через веб-приложение, при этом другие функции остаются неизменными. В веб-интерфейсе AirBnB должно быть что-то такое, что дает более высокий коэффициент конверсии. Точно так же можно сказать о потоках регистрации. Потоки регистрации - это, по сути, поток страниц, которые пользователь увидит от первого знакомства с продуктом до страницы регистрации. Потоки регистрации 24, 3 и 12, как правило, идут хорошо.

Приложение Flask

Если вы зашли так далеко, я горжусь вами! Ниже приведен фрагмент того, как выглядит приложение Flask. Если вам интересно, вы можете убедиться в этом сами! Подробности о том, как создать Flask App, я оставлю на другой день. Я развернул приложение через Heroku, на платформе бесплатного хостинга!

Еще одно замечание, которое я должен сделать о CatBoost, заключается в том, что, в отличие от других алгоритмов, CatBoost будет иметь функции в своей буквальной форме. Нам не нужно «горячо кодировать» категориальные функции, которые помогают упростить внутренний скрипт python приложения Flask.

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

Вы можете найти репозиторий этого проекта здесь.

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