Ученый Udacity Data Scientist, программа по нанодипломам Capstone Project

Этот проект является заключительным проектом программы Udacity Data Scientist Nanodegree: Data Scientist Capstone. Цель состоит в том, чтобы предсказать, перейдет ли пользователь на вымышленный цифровой музыкальный сервис Sparkify.

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

Начнем с использования процесса CRISP-DM (межотраслевой процесс интеллектуального анализа данных):

  1. Деловое понимание
  2. Понимание данных
  3. Подготовить данные
  4. Моделирование данных
  5. Оцените результаты
  6. Развернуть

Деловое понимание

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

Понимание данных

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

Из небольшого набора данных у нас есть 286500 записей от 225 пользователей:

46% женщин и 54% мужчин

54% взаимодействия от бесплатных пользователей и 46% от пользователей премиум-класса.

Записи имеют временной промежуток с октября 2018 года по декабрь 2018 года.

Подготовить данные

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

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

Мы получаем 23% оттока и 77% оттока пользователей, поэтому набор данных довольно несбалансирован. Как объясняется в этом замечательном сообщении, мы должны помнить об этом, когда будем говорить о показателях в разделе Оценить результаты.

Затем я провел сравнение некоторых характеристик, учитывая также значение Churn:

Моделирование данных

Все категориальные функции, которые могут быть полезны для нашей задачи, были мгновенно закодированы и агрегированы с помощью userId:
- пол
- level
- page

Затем мы добавили несколько интересных инженерных функций, задав следующие вопросы:
- Как долго пользователи подписались на услугу? Связан ли отток с этим?
- Активность за последний месяц (для уволенного пользователя отмена - это последний месяц перед отменой), разделенные на недели
- Сколько артистов слушал пользователь?

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

Важно не учитывать такие атрибуты, как page_Cancellation_Confirmation или page_Cancel, потому что они точно отображают столбец метки, поэтому точность всегда будет 100%, потому что мы в основном изучаем значение, которое хотим предсказать.

Оцените результаты

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

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

Accuracy = (True Positives + True Negative) / (True Positives + False Positives + True Negatives + False Negatives)

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

Precision = True Positives / (True Positives + False Positives)

Отзыв (чувствительность) сообщает нам, какая часть прогнозов, которые на самом деле были верными, были нами признаны правильными. Это отношение истинно положительных результатов ко всем фактически положительным прогнозам:

Recall = True Positives / (True Positives + False Negative)

Оценка F-бета - это показатель, который учитывает как точность, так и запоминаемость:

Цель создания Наивного предсказателя - просто показать, как будет выглядеть базовая модель без какого-либо интеллекта. Как уже было сказано, если посмотреть на распределение данных, становится ясно, что большинство пользователей не уходят. Следовательно, модель, которая всегда прогнозирует '0' (т.е. пользователь не посещает страницу Cancellation Confirmation), в целом будет правильной.

Наивная модель, которая помечает всех пользователей как отток = 0, хорошо справляется с тестами: точность составляет 81,2%, а показатель F1 составляет 0,7284.

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

Сравним результаты трех моделей:

  • Логистическая регрессия
  • Деревья с усилением градиента
  • Машина опорных векторов

Первым шагом было удаление ненужных столбцов для обучения.

colonne = df.columns[1:-1]
colonne

затем все функции были векторизованы (преобразование не требуется, потому что все функции уже были числами)

assembler = VectorAssembler(inputCols = colonne, outputCol = ‘features’)
data = assembler.transform(df)

StandarScaler() использовался для масштабирования данных

scaler = StandardScaler(inputCol = 'features', outputCol = 'scaled_features', withStd = True)
scaler_model = scaler.fit(data)
data = scaler_model.transform(data)

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

train, rest = data.randomSplit([0.6, 0.4], seed = 42)
validation, test = rest.randomSplit([0.5, 0.5], seed = 42)

Для всех моделей в качестве показателей я использовал показатель F1.

f1_evaluator = MulticlassClassificationEvaluator(metricName = ‘f1’)

и ParamGridBuilder() и 3 раза CrossValidator() для определения лучших гиперпараметров для моделей с учетом всех параметров.

param_grid = ParamGridBuilder().build()

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

logistic_regression = LogisticRegression(maxIter = 10)
crossvalidator_logistic_regression = CrossValidator(  
estimator = logistic_regression,                                 evaluator = f1_evaluator,                                                    estimatorParamMaps = param_grid,                                                    numFolds = 3)
cv_logistic_regression_model = crossvalidator_logistic_regression.fit(train)

Деревья с усилением градиента

gradient_boosted_trees = GBTClassifier(maxIter = 10, seed = 42)
crossvalidator_gradient_boosted_trees = CrossValidator(
estimator = gradient_boosted_trees,                                                       evaluator = f1_evaluator,                                                       estimatorParamMaps = param_grid,                                                       numFolds = 3)
cv_gradient_boosted_trees_model = crossvalidator_gradient_boosted_trees.fit(train)

GBT также позволяет увидеть важность функций:

Мы видим, что registration_days и count_page_last_week имеют наибольшее значение

Машина опорных векторов

linear_svc = LinearSVC(maxIter = 10)
crossvalidator_linear_svc = CrossValidator(
estimator = linear_svc,                                           evaluator = f1_evaluator,                                           estimatorParamMaps = param_grid,                                           numFolds = 3)
cv_linear_svc_model = crossvalidator_linear_svc.fit(train)

Общая логистическая регрессия дает наилучшие результаты с оценкой F-1 0,8218 для тестового набора данных и 0,7546 для набора данных проверки.

Уточнение

В первый раз я попытался вручную настроить некоторые параметры для моделей, но наилучшие результаты были получены, если разрешить ParamGridBuilder() и CrossValidator() поиск по всем параметрам.

Развернуть

Как было предложено в Инструкциях по развертыванию облака для проекта DSND Capstone, я создал кластер с AWS

Как лучше объяснено здесь, m3.xlarge - это универсальный экземпляр EC2 второго поколения, оснащенный высокочастотным процессором Intel Xeon E5–2670 и 2 хранилища на базе SSD по 40 ГБ

Затем я создал Блокнот и скопировал необходимый код.

В реальном наборе данных 26259199 записей от 22278 пользователей:

47% женщин и 53% мужчин

21% взаимодействия от бесплатных пользователей и 79% от пользователей премиум-класса.

22% пользователей ушли, а 78% - нет.

Небольшой набор данных был хорошим представлением реального набора данных, что означает, что он не является предвзятым.

Заключение

Наша цель состояла в том, чтобы предсказать, собирается ли пользователь отказаться от услуги, чтобы компания могла делать ему предложения или скидки, чтобы попытаться удержать этих пользователей. После очистки данных и моделирования их в набор данных, готовый к использованию для обучения машинному обучению, мы протестировали производительность трех различных моделей. Все полученные модели успешно предсказывали, собирается ли пользователь покинуть службу, или не намного лучше, чем Наивный предсказатель, который всегда дает ответ '0' (пользователи не собираются уходить). С учетом оценки F-1 лучшей моделью является логистическая регрессия. Несмотря на хорошие результаты, модель можно улучшить, создав более технически спроектированную функцию, отражающую некоторые модели поведения, которые могут быть связаны с удовлетворенностью пользователей услугой: хороша ли система рекомендаций? То есть песня, рекомендованная пользователям, действительно соответствует их вкусам. Из важности функций GBT необработанные функции page_Thumbs_Up и page_Thumbs_Down очень важны, поэтому новая функция, фиксирующая музыкальные вкусы пользователей, может действительно улучшить модель.

Примечание. Код можно найти в этом репозитории на github.