Обзор

Проект прогнозирования оттока Sparkify — мой последний завершающий проект для Udacity Data Scientist Nano Degree. Основная цель этого проекта — манипулировать большими и реалистичными наборами данных с помощью Spark для выбора и разработки соответствующих функций для прогнозирования скорости оттока для музыкального приложения Sparkify. Миллионы пользователей ежедневно транслируют свои любимые песни, и это создает большие наборы данных; Здесь мы решили использовать Spark MLlib для создания «простых» моделей машинного обучения с большими наборами данных, что выходит далеко за рамки того, что можно было бы сделать с помощью нераспределенных технологий, таких как scikit-learn.

Цель

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

Три шага:

  1. Исследовательский анализ данных (EDA):очистка, маркировка данных и изучение данных.
  2. Разработка функций: создавайте функции для повышения производительности модели.
  3. Моделирование. Преобразование разработанных данных, разделение обучения и тестирования, создание моделей машинного обучения и их сравнение.

1. ЭДА

1.1 Набор данных

Пользовательские данные генерируются действиями пользователя в любой момент времени. По действиям мы можем определить и проанализировать конкретные действия пользователей (например, количество сыгранных песен, количество лайков и т. д.). Полный набор данных составляет 12 ГБ, но здесь мы проанализируем мини-подмножество размером 128 МБ. Данные содержат 18 признаков и 286 500 записей, как показано на рисунке 1.

1.2 Проверка пользователей и очистка данных

Было обнаружено, что из 286 500 записей всего 278 154 верны. Это означает, что около 3% записей были пользователями без активности (не входящими в систему), поэтому эти записи были удалены.

1.3 Определение удаленных пользователей

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

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

1.3 Распределение взаимодействий со страницей: отток и активные пользователи

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

Как показано на рисунке 3, действия ушедших и активных пользователей различаются. Более высокая доля активности «палец вниз» у уволенных пользователей свидетельствует о том, что им не понравился контент (музыка) в приложении. Измененное население имеет более высокую долю активности «обновления» и немного более высокую долю активности «понижения» по сравнению с активными пользователями; это предполагает, что ушедшие пользователи платят за услугу, а затем понижают ее. Наибольшая разница между оттоком и активной пользовательской активностью приходится на «рекламные ролики». Мы можем интерпретировать это как то, что пользователи взаимодействуют с рулонной рекламой, щелкая, чтобы пропустить рекламу, тогда как активные участники не возражают против рекламы, поэтому они не взаимодействуют с ней. Более высокая доля ушедших пользователей, использующих настройки, чаще говорит о том, что у них возникают проблемы с настройкой своего опыта, что, возможно, приводит к их оттоку. Активные пользователи, как правило, более интерактивны, поскольку они чаще добавляют друзей и нажимают «палец вверх» на контент, тогда как ушедшие пользователи чаще нажимают «палец вниз».

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

2. Выбор функций и разработка функций

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

  1. Использование гендерных строк: было обнаружено, что пользователей-мужчин было больше, чем женщин, но в целом пользователей-мужчин было больше; тем не менее, это было закодировано как двоичная категория из 1 и 0.
  2. Использование строк песен: количество воспроизведенных песен.
  3. Использование страниц: количество взаимодействий с роликами, количество посещений настроек, количество запросов на добавление в друзья, количество положительных и отрицательных отзывов.

Всего было спроектировано и объединено 7 функций; см. рис. 4. Готовы к моделированию с помощью машинного обучения!

3. Моделирование

3.1 Разделение данных на обучающий и тестовый наборы

Я предпринял несколько шагов, чтобы убедиться, что данные сбалансированы. Может возникнуть соблазн просто использовать легкодоступную функцию .randomSplit() в Spark. Однако я заметил, что количество оттока пользователей было неравномерно разделено на обучающий и тестовый наборы данных; 40 пользователей переходят на набор поездов и 10 пользователей переходят на тестовый набор. Один из способов решить проблему несбалансированного разделения набора данных — использовать функцию .sampleBy() в PySpark. Эта функция возвращает стратифицированную выборку без замены; это идеально подходит для этого случая.

Теперь у нас есть идеально сбалансированный набор для обучения и тестирования (я назвал проверку); 90% активных первоначальных пользователей перешли на обучающую выборку и 10% на тестовую выборку, а 50% ушедших пользователей перешли на каждую выборку.

3.2 Обучение моделей машинного обучения

Чтобы показать, что можно обойтись без скучных моделей машинного обучения и при этом добиться разумного прогнозирования оттока путем качественного проектирования функций, я решил построить свою модель с классификацией логистической регрессии и моделями классификации случайного леса (с ограниченной настройкой), которые легко доступны в искра.мл. Данные были масштабированы, поиск по сетке для небольшой настройки (только скорость обучения и n_trees). Поскольку данные были ограничены (всего 37 ушедших пользователей и 129 активных пользователей), для обучения данных использовалась k-кратная перекрестная проверка. Перекрестная проверка — это процедура повторной выборки, используемая для обучения моделей машинного обучения на ограниченной выборке данных (такой как представленный здесь мини-набор). Процедура имеет единственный параметр, называемый k, который относится к количеству групп, на которые данная выборка данных должна быть разделена случайным образом и обучена/оценена; Я использовал k из 5. Для большего набора (12 Гб) это может быть слишком много, но для этих меньших данных это подходит.

Модель логистической регрессии обучалась с использованием поиска по сетке по скорости обучения (1 и 0,1), а модель случайного леса обучалась с использованием поиска по сетке по количеству деревьев (25) и мерам примесей (джини и энтропия). Я знаю, довольно высокие скорости и не очень хороший поиск по сетке в случайном лесу. Но я хотел показать, что выбор функций и проектирование функций могут быть более важными, чем выбор модели. NN прекрасно подходят для предсказаний (использования нелинейных взаимодействий), но понимание особенностей и того, как они взаимодействуют линейно, делает модель более интерпретируемой. Вы сможете предсказать уровень оттока и ответить на вопрос ПОЧЕМУ? вопрос.

4. Результаты

Оказывается, нам нужно всего 7 функций, чтобы получить достойную модель, которая будет предсказывать уровень оттока; модель логистической регрессии была точной на 91% с F1-показателем 0,87, а модель случайного леса, конечно же, получила более низкие оценки. Неплохо! Учитывая, что практически не нужно было настраивать, а обучение было относительно быстрым (по сравнению с другими сложными моделями).

5. Улучшения

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

Исходный код:

https://github.com/geovani-montoya/Churn_Prediction_of_Sparkify