Обзор проекта:

У вас есть онлайн-приложение для потоковой передачи видео или музыки, и вы видите снижение количества пользователей или подписчиков. Или, что еще хуже, вы теряете своих платных подписчиков.

Используя науку о данных, мы можем точно знать, почему мы их теряем.

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

Постановка проблемы:

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

Мы используем подмножество данных размером около 120 МБ.

Метрики:

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

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

Формула для оценки F1 выглядит следующим образом:

Анализ — исследование данных:

Схема для этих данных:

 |-- artist: string (nullable = true)
 |-- auth: string (nullable = true)
 |-- firstName: string (nullable = true)
 |-- gender: string (nullable = true)
 |-- itemInSession: long (nullable = true)
 |-- lastName: string (nullable = true)
 |-- length: double (nullable = true)
 |-- level: string (nullable = true)
 |-- location: string (nullable = true)
 |-- method: string (nullable = true)
 |-- page: string (nullable = true)
 |-- registration: long (nullable = true)
 |-- sessionId: long (nullable = true)
 |-- song: string (nullable = true)
 |-- status: long (nullable = true)
 |-- ts: long (nullable = true)
 |-- userAgent: string (nullable = true)
 |-- userId: string (nullable = true)

Столбец «страница» состоит из журнала событий, таких как «Отмена», «Отправить на понижение», «палец вверх», «палец вниз», вход в систему, выход из системы, регистрация, добавление друга, добавление плейлиста, обновление и т. д..

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

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

Анализ — визуализация данных

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

Проверено, сколько пользователей используют какой тип клиентского браузера:

Проверено, какие операционные системы предпочитает пользователь:

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

Анализ оттока на основе типа пользователя, такого как платный или бесплатный:

Данные

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

  • Загрузите данные из «mini_sparkify_event_data.json», который является подмножеством фактических данных.
  • Определите пустые значения и неопределенные значения в наборе данных.
  • проверьте, пусты ли значения «sessionId», «userId» и удалите эти строки.
  • Удалите, если в столбцах sessionId и userId есть дубликаты.
  • Определите отток на основе двух столбцов — «Подтверждение отмены» и «Отправить понижение рейтинга» и объедините значения в один столбец «понижен» для упрощения расчетов.
  • Извлечь пользовательский агент (браузер, используемый клиентом) на основе клиентского браузера.
  • Аналогичным образом выясните, какая операционная система используется пользователем.

Выполнение

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

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

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

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

Изучив и проанализировав набор данных, мы пришли к следующим влияющим функциям:

Категорические характеристики: пол, уровень подписки, операционная система. Категориальные значения были преобразованы в индексы для измерения.

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

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

Уточнение и моделирование:

В нашем случае мы использовали показатель F1 для прогнозирования и анализа наших моделей. Набор данных был разбит на 90% и 10% для обучения и тестирования.

Для построения нашей модели мы выбираем следующие алгоритмы обучения с учителем:

  1. Логистическая регрессия (LR)
  2. Классификатор случайного леса (RF)
  3. Классификатор дерева с градиентным усилением (GBT)

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

Результаты наших моделей и результаты F1 приведены ниже:

Логистическая регрессия:

Accuracy for Logistic Regression Model is:  0.5
F1 score for Logistic Regression model is :  0.5494505494505495

Случайный классификатор леса:

Accuracy for Random Forest Model is:  0.6
F1 score for Random Forest Model is:  0.6333333333333333

Классификатор дерева с градиентным усилением:

Accuracy for Gradient Boosting Tree Model is:  0.8
F1 score for Gradient Boosting Tree classifier is :  0.819047619047619

Наша окончательная модель основана на лучших метриках в дереве Gradient Boost.

Оценка и проверка модели:

Чтобы проверить, насколько эффективной была каждая модель, мы создаем функцию для перекрестной проверки вывода каждой модели. Для этого мы использовали пакет машинного обучения pyspark «CrossValidator».

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

Вывод функции перекрестного валидатора приведен ниже:

Comparing models on fold 1
params: {'maxIter': 5}	f1: 0.577255	avg: 0.577255
params: {'maxIter': 10}	f1: 0.616158	avg: 0.616158
Comparing models on fold 2
params: {'maxIter': 5}	f1: 0.645370	avg: 0.611313
params: {'maxIter': 10}	f1: 0.645370	avg: 0.630764
Comparing models on fold 3
params: {'maxIter': 5}	f1: 0.630077	avg: 0.617567
params: {'maxIter': 10}	f1: 0.630077	avg: 0.630535
Best model:
params: {'maxIter': 10}	f1: 0.630535

Обоснование:

Мы запускали каждую модель независимо, чтобы проверить, какая из них имеет наилучшие показатели точности и f1. вывод каждой модели показал, что Gradient Boosted Tree Classifier был лучшим среди трех методов моделирования в этом случае.

После того, как мы закончили, мы протестировали перекрестный валидатор ml 5 раз и 10 раз, чтобы проанализировать результаты и подтвердить лучшую модель. В этой проверке также модель Gradient Boosted показала лучшие результаты.

Вывод:

Отражение:

Машинное обучение было выполнено на трех моделях классификации: логистической регрессии, классификаторе случайного леса и классификаторе дерева градиентного усиления. Всего для запуска моделей было включено семь параметров. В нашем сравнении мы обнаружили, что Gradient Boost Tree превосходит другие модели с некоторым отрывом. На основе этой модели у нас есть следующие результаты, которые говорят о том, как различные функции/параметры влияют на отток пользователей. Мы видим, что самая важная функция — это палец вверх и добавление друга.

Улучшение и мысли:

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

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

Ссылка на мой проект git hub для полного подхода https://github.com/mpbnka/Udacity_DataScientist_Capstone