Предотвратить потерю клиентов

Как машинное обучение может помочь

Этот пост посвящен большим данным от гипотетического сервиса потоковой передачи музыки — Sparkify. Вопрос, на который необходимо ответить: как можно использовать эти данные для прогнозирования потенциального оттока отдельных клиентов? Эта информация наиболее актуальна. Его можно использовать для запуска мер, которые, в свою очередь, могут помешать клиентам отвернуться.

Этот пост проливает свет на технический процесс получения этой информации… включая вопрос о том, как облачные вычисления могут помочь справиться с 12 ГБ данных, предоставленных для этой цели.

Содержание

  1. Данные и общая настройка
  2. Очистка данных
  3. Разработка функций
  4. Модели для прогнозирования оттока
  5. Возможности для дальнейшего улучшения

1. Данные и общая настройка

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

Я использовал и сравнивал две разные установки для работы с этими данными:

  • Большой масштаб: полный набор данных размером 12 ГБ (26 259 199 строк/транзакций, 18 функций) выполняется в кластере m5.2xlarge Amazon EMR с 1 главным узлом и 2 основными узлами.
  • Небольшой масштаб: подмножество данных размером 128 МБ (286 500 строк/транзакций, 18 функций) выполняется на локальном компьютере.

Все преобразования данных и машинное обучение выполнялись с помощью PySpark.

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

Очистка данных включала, прежде всего, следующие шаги:

  • Удаление ненужных (в основном технических и/или избыточных) функций.
  • Удаление типов транзакций, в которых отсутствовала информация о пользователе.
  • Преобразование типов данных, например. для информации о временной метке.

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

Как видно, в наборе данных не было NaN, за исключением атрибутов песни, которые имеют отношение только к транзакции «NextSong». Эти атрибуты не использовались на последующих этапах проектирования и моделирования.

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

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

4. Модели для прогнозирования оттока

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

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

Вот сводка результатов для 3 протестированных моделей:

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

5. Возможности для дальнейшего улучшения

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

  • Настройте дополнительные гиперпараметры классификаторов.
  • Проанализируйте важность функций и соответственно сократите набор функций.
  • Оптимизируйте вычисления в кластере, например. за счет сокращения коллекций результатов.

Мой код — версия для малых и больших данных — доступен на Github: https://github.com/CSauka/Sparkify

Спасибо FancyCrave за то, что поделились этой фотографией через Pixabay!