Определение проекта

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

В рамках курса Udacity Data Science Nano Degree мы будем использовать Apache Spark и PySpark ML для прогнозирования оттока зарегистрированных пользователей службы потоковой передачи музыки Sparkify.

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

Проект поставляется с небольшим подмножеством 128 МБ полного набора данных журнала событий Sparkify объемом 12 ГБ и рабочим пространством Jupyter Notebook для обработки данных, анализа данных и прогнозирования оттока. На протяжении всего проекта мы будем использовать небольшое подмножество данных в качестве «необработанных данных» и будем работать с локальным рабочим пространством проекта.

Постановка задачи

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

Показатели

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

Репозиторий Github

Весь исходный код проекта можно найти здесь: https://github.com/lugalbandaw/dsnd-4

Анализ

Исследование и визуализация данных

Необработанные данные состоят из 286 500 строк и 18 столбцов, их схема показана на рисунке 1.

Поскольку наш дальнейший анализ будет основываться на зарегистрированных пользователях с действительными сеансами, мы удаляем все строки с недопустимым userId или sessionId, что приводит к 278 154 (около 97,1%) оставшихся действительных строк с 225 уникальных userId.

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

В результате мы наблюдаем 52 (23,1%) ушедших и 173 (76,9%) не ушедших пользователей. Следовательно, набор данных довольно несбалансирован между двумя соответствующими группами пользователей, и всегда прогнозирование «отсутствия оттока» приведет к точности ок. 77%, то есть все модели должны будут превзойти этот показатель.

Для каждого пользователя мы рассчитываем количество сеансов (no_sessions) и общий промежуток времени (time_span) между первым и последним взаимодействием с сервисом Sparkify, т. е. оцениваем как часто пользователь входит в систему в течение какого периода времени. При среднем количестве сеансов 15,2 неотчуждаемые пользователи входят в систему почти на 50 % чаще, чем ушедшие пользователи (в среднем 10,3 сеанса), а разница в среднем промежутке времени еще больше: 46,99 дня (неотработанные пользователи) против 23,51 дня ( ушедшие пользователи). На рисунках 2 (без оттока) и 3 (оттока) показано распределение количества сеансов и временного интервала.

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

Далее мы анализируем способы взаимодействия двух групп со службой Sparkify. В наборе данных много разных типов страниц, т.е. теоретически каждый пользователь может взаимодействовать с нашим сервисом разными способами с разным распределением событий страницы. Распределение событий страниц для перешедших и неперешедших групп пользователей («рейтинг страниц») показано в виде таблицы на рисунке 4 и в виде визуализации на рисунках 5 (все страницы) и 6 (без доминирующей страницы «Следующая песня').

График различий в рейтинге страниц на странице (см. рис. 7) позволяет сделать некоторые интересные и убедительные выводы: группа пользователей, которые не ушли, нажимает больше «NextSongs», больше ставит «Мне нравится», добавляет больше друзей и больше интересуется «О программе». , в то время как группа ушедших пользователей ставит больше лайков и показывает рекламу.

Методология

Предварительная обработка данных

С помощью статистических вычислений мы можем оценить статистическую значимость различий, чтобы решить, какая скорость страницы показывает некоторое характерное поведение группы пользователей, ушедших или не ушедших. Для каждого пользователя мы рассчитываем вероятность (количество событий страницы в среднем) для каждого типа страницы, т. е. часть типа страницы по сравнению со всеми событиями страницы этого пользователя. Для каждой страницы мы вычисляем доверительный интервал [p-, p+]различия вероятности между двумя группами пользователей (альфа = 5 %) и находим результат в картинка 8:

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

['About', 'Add Friend', 'NextSong', 'Roll Advert', 'Thumbs Down', 'Thumbs Up', 'Upgrade']

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

Реализация

Поскольку количество сеансов и промежуток времени имеют свою собственную шкалу, мы независимо масштабируем обе функции с помощью MinMaxScaler в диапазоне [0, 1]. Из-за того, что они рассчитываются как порции, функции скорости страницы уже масштабированы до [0, 1].

Затем мы собираем все 9 признаков в один вектор признаков с помощью VectorAssembler и нормализуем полученный вектор с помощью Normalizer.

масштабирование = нормализатор (inputCol = «FeatureVec», outputCol = «FeatureVecNorm»)
df_model_vec = scaler.transform (df_model_vec)

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

Row(label=0.0, features=DenseVector([0.6337, 0.0434, 0.0023, 0.0137, 0.7711, 0.0011, 0.0046, 0.0424, 0.0]))

Уточнение

Как выяснилось выше, данные несбалансированы между группами и, следовательно, не могут быть просто разделены на данные обучения/тестирования. Выполняя простое случайное разделение, мы могли бы получить обучающие или тестовые данные, содержащие только одну метку, и, следовательно, не позволили бы обучить модель ML для обнаружения обеих меток. Таким образом, мы позаботились о том, чтобы при разделении данных была получена одинаковая пропорция меток с помощью стратифицированной выборки с разделением 0,8/0,2 для обеих меток на обучающие/тестовые данные.

Полученные результаты

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

Мы обучаем и сравниваем 5 различных методов классификации:

  • Логистическая регрессия
  • k-средние
  • Древо решений
  • Случайный лес
  • Многослойный персептрон

Все методы встроены в CrossValidation с использованием 3 fold и MulticlassClassificationEvaluator с f1-measure в качестве оценки по умолчанию для оптимизации. Кроме того, некоторые настройки параметров применяются с помощью конвейера и ParamGridBuilder.

Результат по тестовым данным оценивается с помощью MulticlassMetrics и показан в следующей таблице:

Обоснование

Как указано выше, эталон точности всегда просто прогнозирует класс 0 примерно. 77 %.

Логистическая регрессия (regParam 0, maxIter 10) и дерево решений (maxDepth 2) имеют f1/точность ок. 86% и делают свою работу лучше всего: логистическая регрессия имеет лучшее значение полноты, а дерево решений имеет лучшую точность.

Многослойный персептрон (2 скрытых слоя, макс. 50) превосходит эталонный показатель с почти 82 % f1/точность, в то время как k-Means и Random Forest остаются ниже 80 % f1/точность.

Случайный лес с 2 деревьями (около 73 % f1/точность) даже остается ниже контрольного показателя с худшей общей производительностью.

Заключение

Отражение

При наличии всего 225 пользователей объем данных в используемом небольшом наборе данных довольно мал. Кроме того, поскольку в наборе данных содержится только 52 удаленных пользователя, в данных обучения остается только около 40 удаленных пользователей после стратифицированного разделения обучения/тестирования. В этой ситуации с небольшим количеством данных неудивительно, что все сравниваемые модели ML имеют довольно низкие значения точности и полноты. Наоборот, даже при таком дефиците данных метод процентов страниц, основанный на выборе страниц со статистически значимыми различиями в рейтингах ушедших и не ушедших пользователей, работает достаточно хорошо. С точностью более 86 % на тестовых данных логистическая регрессия явно превосходит простой тест abt. 77 %.
Таким образом, доказательство концепции подхода на основе показателей количества страниц успешно предоставлено и может быть легко адаптировано к полному набору данных в качестве следующего шага. Цель достигнута.

Улучшение

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

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