Можете ли вы сказать, когда пользователь собирается покинуть ваш сервис?

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

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

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

Поэтому мне пришлось работать над разработкой чего-то, что можно было бы масштабировать с помощью больших данных. Я использовал Apache Spark для очистки данных, а также для создания модели машинного обучения. Это очень важно, потому что позволяет компаниям с ОГРОМНЫМИ наборами данных внедрить это решение. Это также означает, что мое решение сможет масштабироваться в зависимости от размера набора данных.

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

Точность = (истинно положительные + истинно отрицательные) / все образцы

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

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

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

Загрузка и изучение

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

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

После загрузки данных из файла json с помощью метода spark.read.json(path) я проверил схему данных.

Исполнитель: исполнитель воспроизводимой в данный момент песни.

Аутентификация: сообщает, вошел ли пользователь в свою учетную запись.

FirstName: имя пользователя.

Пол. Пол пользователя.

ItemInSession: номер элемента в сеансе.

LastName: фамилия пользователя.

Длина: продолжительность песни в секундах.

Уровень. Тип подписки пользователя (бесплатная или платная).

Местоположение. местонахождение пользователя.

Метод:запросы GET или PUT.

Страница. Страница, на которой в данный момент находится пользователь.

Регистрация: регистрационный номер пользователя.

SessionID:идентификатор текущего сеанса.

Песня: название песни, которую сейчас слушают.

Статус:веб-статус

TS: временная метка произошедшего действия.

UserAgent:агент пользователя.

UserID:уникальный идентификатор для каждого пользователя.

Один из примеров того, как данные выглядят в наборе данных:

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

Все возможные разные страницы:

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

Давайте получим представление о том, сколько клиентов было помечено за отмену их обслуживания:

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

Теперь давайте посмотрим, что произойдет, если мы сравним количество ушедших пользователей по полу и уровню подписки.

Каждая из категорий на графике соответствует индексу кадра данных выше. Эта гистограмма раскрывает нам много интересной информации. Похоже, что у мужчин и женщин разная величина оттока.

Уборка

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

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

Я также создал столбец с именем time, который содержит объекты datetime. Этот столбец преобразует предыдущий столбец ts в объект datetime. Это сделано потому, что в таком формате намного проще прочитать дату и время возникновения действия по сравнению со столбцом ts.

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

Я сделал что-то похожее и на гендерную колонку.

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

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

Модель

Выполнение

Глядя на данные и анализ, который мы сделали до сих пор. Столбцы, которые будут включены в модель, будут следующими: Downgrade, Gender и Level.

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

Разделение

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

Я решил использовать разделение 90/10 для обучения и тестирования. Это хорошо, потому что оптимизирует создание модели и по-прежнему оставляет мне приличное количество данных для тестирования.

Выбор модели

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

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

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

Тюнинг/доработка

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

Я решил настроить параметр maxDepth дерева решений. Два варианта, которые я передал, были 2 и 10.

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

Потом подхожу по модели.

Эта перекрестная проверка уточняет мою модель, создавая две модели. Сначала создается модель с параметром maxDepth, равным 2, а затем вычисляется оценка F1. Затем он делает это снова, но на этот раз с максимальной глубиной 10. Он сравнивает оценку F1 двух моделей и выбирает модель с более высокой оценкой F1.

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

Надежность

Надежность модели проявляется, когда вы проверяете скорость обучения. Это покажет, что модель сможет масштабироваться эффективно и результативно.

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

Метрики

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

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

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

Обоснование

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

Это показывает, что maxDepth был более оптимальным при значении 2, а не 10. Это означает, что maxDepth, равное 2, обеспечивало более высокий балл F1 и, следовательно, лучшую и улучшенную модель по сравнению с maxDepth, равным 10.

Вывод

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

Резюме

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

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

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

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

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

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

Размышления

В этом путешествии мы использовали Apache Spark и библиотеку машинного обучения PySpark для навигации по этому огромному набору данных. Эти инструменты позволили нам гибко масштабироваться в зависимости от размера данных и при этом создавать эффективные и действенные модели. Цель этого проекта состояла в том, чтобы предсказать отток, с чем мы отлично справились. Шаги, предпринятые для достижения этой цели, включали загрузку, очистку, EDA, извлечение признаков, моделирование, оценку и настройку. Нам также нужно было найти переменные, которые помогли бы нам предсказать желаемый результат.

Уроки выучены

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

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

Улучшения

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

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