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

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

Вот данные, которые у нас есть:

  1. Около 1 миллиона активных пользователей с некоторыми метаданными, такими как часовой пояс, регион, платформа и т. Д.
  2. Около 4 млн событий - приложение куплено, пользователь начал оформление заказа, пользователь увидел «Купить Pro-версию» и т. Д.

Для разных платформ доступны разные цены - от 5 до 15 для Android и от 5 до 30 для iOS.

Давайте посмотрим на данные, вот коэффициент конверсии в зависимости от цены:

Версия за 5 долларов конвертируется чаще всего, но как насчет того, чтобы внести свой вклад в общий доход?

Давайте определим нашу цель как - для каждого пользователя установить цену (взятую из предопределенного набора), которая максимизирует ожидаемую прибыль:

Возврат = Вероятность конверсии (указанная цена) * Цена

Это позволяет использовать стандартные бинарные классификаторы, которые выводят вероятность события, например xgboost.

Проверка установлена ​​

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

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

Расширение обучающей выборки

Чтобы увеличить объем имеющихся обучающих данных, мы можем сделать два предположения:

  1. Пользователи, купившие приложение по цене N, купят его по всем ценам меньше, чем N. Например, пользователь купил приложение за 20 долларов, тогда мы можем добавить положительные события для того же пользователя по ценам 15, 10 и 5 долларов.
  2. Пользователи, которые отказались покупать приложение по цене N, также не стали бы покупать его по более высокой цене.

Создание функций

Хотя мы можем использовать числовые функции как есть, категориальные функции, такие как locale, должны быть закодированы в двоичные переменные, что известно как горячая кодировка.

Я также извлек дополнительные функции, такие как количество раз, когда пользователь видел сообщение BuyPro, день недели, час дня, указанный экран и другие.

Модель здания и оценка

Модели градиентного повышения очень хорошо работают с такого рода задачами, способны улавливать нелинейные зависимости и не требуют особого надзора и корректировок - я использовал модель xgboost с целью оптимизации logloss.

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

Интересно, что прогнозируемая доходность практически совпадала с фактической выручкой - в пределах 2%.

И расчетное увеличение дохода в случае выбора наилучшей возможной цены составляет + 40%.

Вот распределение оригинальных и лучших утилит