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

Фон

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

Набор данных

Наш набор данных содержит базовую информацию и поведение 771 000 пользователей в приложении за первую неделю, зарегистрированных за 2 месяца. Поскольку одной из основных функций нашего приложения является функция журнала жизни, ее запись интересно включить в этот набор данных. Набор данных содержит 8 переменных (4 категориальных, 4 числовых).

  • пол (Женский, Мужской, Не определено)
  • age_class (10, 20, 30, 40, 50, 60 и более, не определено)
  • onbo_completed (Да, Нет): завершил ли пользователь процесс адаптации (в основном запрашивает основную информацию пользователя, такую ​​как имя, пол, возраст, вес, рост, проблемы со здоровьем. , так далее)
  • active_days: сколько дней пользователи вошли в систему
  • weight_logs: сколько раз пользователи записывали свой вес.
  • sleep_logs: сколько раз пользователи записывали время своего сна.
  • food_logs: сколько раз пользователи записывали еду, которую они съели.
  • отток (Да, Нет): прекратил ли пользователь использовать приложение с 30-го дня.

Базовый исследовательский анализ данных

Большинство наших пользователей - женщины, от подростков до тридцатилетних. Неопределенные данные, скорее всего, поступили от пользователей, которые не завершили процесс адаптации.

Поскольку у нас, очевидно, есть проблема с выбросами в данных журнала жизни (например, очень редко пользователи записывают время своего сна 50 раз или записывают вес 100 раз за первые 7 дней), на этот раз мы бы просто выполните опрометчивый шаг, чтобы удалить выбросы с помощью классического метода Z-оценки.

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

Подготовка данных

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

Затем мы применяем масштабирование функции ко всем недвоичным функциям, чтобы получить нулевое среднее значение и стандартное отклонение, равное 1, а также для ускорения вычислений. Мы бы использовали PowerTransformer с методом Йео-Джонсона вместо StandardScaler, поскольку наши данные имеют относительно негауссовское распределение.

Создание модели и оптимизация гиперпараметров

Теперь самое интересное: набор данных готов, и мы можем приступить к созданию нейронной сети. Мы бы разделили данные на 90% обучающий набор и 10% набор для проверки. Поскольку это относительно простой набор данных, мы просто создаем стандартную архитектуру, как показано ниже:

  • 2 плотно связанных скрытых слоя
  • Регуляризация L2 (10³) (для предотвращения переобучения)
  • Потеря бинарной кросс-энтропии
  • Функция активации выходного слоя: сигмовидная
  • Размер партии: 1024
  • Эпох: 10

Последовательный позволяет нам складывать многоуровневую сеть, в которую мы добавляем слои Плотные позже. Внутри слоя мы можем добавить дополнительные параметры, такие как инициализатор ядра / смещения / активности и ограничение, но в этом случае мы помещаем только регуляризатор и функцию активации на каждый уровень. Затем мы настраиваем (компилируем) модель, передавая 3 параметра (оптимизаторы, функцию потерь для минимизации и метрики для оценки) перед обучением модели с помощью функции fit и вводом наших обучающий набор и набор для проверки.

Из приведенного выше кода вы могли заметить, что мы добавили дополнительный параметр с именем params. Что мы делаем здесь, так это то, что вместо того, чтобы произвольно помещать какое-то значение гиперпараметра в нашу архитектуру, мы хотим найти значение, которое с большей вероятностью даст нам лучший результат (в данном случае точность), оптимизация с помощью библиотеки Talos; Вы можете найти более подробную информацию о Талосе здесь. Проще говоря, Talos запускает модель со всеми комбинациями гиперпараметров, которые мы ранее назначили, а затем выводит сравнение производительности. Мы считаем это полезным, поскольку нам не нужно вручную перезапускать модель каждый раз, когда мы пытаемся настроить гиперпараметры.

Мы можем настроить любые гиперпараметры на любое количество значений. Но для простоты мы просто помещаем по 2 значения для каждого гиперпараметра; первый нейрон (5 или 10), второй_нейрон (3 или 5), активация (выпрямленная линейная единица или гиперболический касательный) и оптимизатор (Adam или RMSprop), как показано в приведенном ниже коде. Модель будет работать с 16 возможными сценариями.

На моем компьютере выполнение модели со всеми 16 комбинациями гиперпараметров заняло примерно 22 минуты. Вы можете сделать его короче или длиннее, поиграв с размером пакета, эпохами, количеством гиперпараметров, их значением и т. Д. (Однако это также может повлиять на производительность модели). Наконец, Talos выведет что-то вроде этого:

Основываясь на отчете выше, кажется, что чем больше узлов у нас на первом уровне, тем выше производительность; это может быть подсказкой для дальнейшей настройки. Сеть с 10 первыми нейронами, 5 вторыми нейронами, функцией активации ReLU и оптимизатором Adam дает лучший результат с точностью 79,2%.

Теперь мы можем сделать прогноз с помощью только что созданной модели, вызвав model.predict () и model.predict_classes (), чтобы увидеть вероятность и прогноз оттока, соответственно. Окончательный результат (показанный ниже), мы надеемся, поможет команде понять, на кого нацеливаться и когда запускать функции, чтобы удержать пользователей.

TL; DR и дальнейший подход

В этой статье мы сделали:

  • Стандартный EDA (визуализация необработанных данных, избавление от выбросов, проверка корреляции)
  • Подготовка данных (преобразование категориальных переменных в числовые, масштабирование данных)
  • Построение полносвязной нейронной сети с использованием функционального API Keras
  • Поиск оптимального значения гиперпараметров с помощью Talos
  • Получение вероятности оттока и прогнозов

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



FiNC Technologies нанимает аналитиков бизнес-аналитики и специалистов по данным. Просмотрите эту ссылку, чтобы узнать подробности, или свяжитесь со мной в LinkedIn, чтобы узнать больше.