Спрос на услуги потокового аудио увеличился, предложение этих услуг также увеличилось, а уровень компетенции высок. Лояльность клиентов к конкретному приложению или услуге имеет решающее значение для этой модели бизнеса.
Sparkify — это вымышленная популярная цифровая медиа-служба, созданная Udacity, похожая на Spotify или Pandora; многие пользователи пользуются их услугами каждый день. У него также есть два режима: использование бесплатного уровня или модели подписки премиум-класса, в которой пользователь может бесплатно обновить, понизить или отменить услугу по своему усмотрению. Важно, чтобы пользователю нравился сервис, лояльный к Sparkify.
Мы отслеживаем каждое событие; если пользователь воспроизводит песню, посещает определенную страницу или получает сообщение об ошибке, он генерирует много данных, которые можно легко увеличить до ГБ данных. К счастью, для больших объемов данных мы можем использовать технологии больших данных, такие как Spark, и мы можем анализировать и прогнозировать отток клиентов, чтобы они не уходили.
Что такое отток клиентов?
Это когда пользователь перестает использовать продукт нашей компании, в данном случае сервис Sparkify. Это показатель, который помогает определить, растет бизнес или нет, и он важен, потому что обычно привлечение новых клиентов обходится дороже, чем удержание существующих. Чтобы уменьшить отток клиентов, Sparkify решила проанализировать данные и предложить стимулы для удержания клиентов.
Определение проекта
Это реалистичный набор данных со Spark для разработки соответствующих функций для прогнозирования оттока. Использование Spark MLlib для создания моделей машинного обучения с большими наборами данных. Полный набор данных составляет 12 ГБ (s3n://udacity-dsnd/sparkify/sparkify_event_data.json)
, из которых вы можете проанализировать мини-подмножество 128 МБ (s3n://udacity-dsnd/sparkify/mini_sparkify_event_data.json
)
Код этого проекта находится в репозитории Github.
создать искровую сессию:
# create a Spark session spark = SparkSession \ .builder \ .master("local[*]") \ .config("spark.ui.port",3000) \ .appName("Sparkify") \ .getOrCreate()
Загрузить и очистить набор данных
для мини-подмножества данных это небольшой набор данных для машинного обучения; он содержит 286 500 строк и следующие столбцы:
отсутствуют идентификаторы пользователей, обычно файлы cookie отключены или мы не можем отследить этого конкретного пользователя, тогда связанные с ним данные были удалены. Есть 225 уникальных пользователей, которые имеют следующее распределение:
Исследовательский анализ данных
Мы определили как отток посещения Cancellation Confirmation
страницы, и данные были оценены в соответствии с этим, если у пользователя отток или нет.
23,11% пользователей отказались от услуги, а взаимодействие пользователей с посещенными страницами выглядит следующим образом:
Существует небольшая разница в поведении пользователей, у которых есть отток и нет от сервиса. Thumbs Up
, Thumps down
и Roll Advert
, однако статистически значимой разницы по-прежнему нет. Эта оценка блочной диаграммы была выполнена для визуализации процентилей и среднего значения для проверки распределения.
Чтобы избежать переобучения модели, мы удалили страницы, связанные с аннулированием аккаунта, что означает отток.
поведение пользователей, связанное с сессиями (продолжительность в часах и количество проигранных песен)
hour_data_Churn = spark.sql(""" SELECT Churn, dayOfWeek(from_unixtime( ts/1000.00)) dayofweek, hour(from_unixtime( ts/1000.00)) hour, count(*) count FROM Sparkify_churn_view group by Churn, dayOfWeek(from_unixtime( ts/1000.00)) , dayofmonth(from_unixtime( ts/1000.00)) , hour(from_unixtime( ts/1000.00)) """).toPandas() hour_data_scaled = scale_data_by_Churn(hour_data_Churn,'dayofweek','count') hour_data_scaled.plot.bar(rot=0,title = 'event count(scaled) by day of week', figsize=(5,5))
Используя информацию userAgent, мы также определили состав пользователей по устройствам, операционной системе и браузеру, получив больше разницы данных по браузеру и операционной системе (для оценки данные были масштабированы):
Все больше пользователей запустили сервис с помощью Firefox, проверяя его в браузере и используя Ubuntu в качестве операционной системы.
Разработка функций
- Категориальные характеристики: все категориальные помечены как 1/0 (фиктивные столбцы), чтобы их можно было использовать в модели.
- Пол
- страницы (удалить
Cancellation Confirmation
иCancel
) - Браузер (извлечено из
userAgent
) - ОС (извлечено из
userAgent
)
2. Числовые характеристики: эти данные были масштабированы от 0 до 1.
- среднее значение песен в сеансе
- средняя продолжительность сеанса (в часах)
- среднее значение событий (регистров) в сеансе
- дни использования (поведение)
Все данные были сокращены пользователем.
в качестве последних столбцов имеем:
root |-- userId: string (nullable = true) |-- Churn: integer (nullable = true) |-- level: integer (nullable = true) |-- gender: integer (nullable = true) |-- lenght_avg_scaled: double (nullable = true) |-- day_of_weeks3n://udacity-dsnd/sparkify/sparkify_event_data.json)
scaled: double (nullable = true) |-- day_of_weeks3n://udacity-dsnd/sparkify/mini_sparkify_event_data.json
scaled: double (nullable = true) |-- day_of_weekCancellation Confirmation
scaled: double (nullable = true) |-- day_of_weekThumbs Up
scaled: double (nullable = true) |-- day_of_weekThumps down
scaled: double (nullable = true) |-- day_of_weekRoll Advert
scaled: double (nullable = true) |-- day_of_weekCancellation Confirmation
scaled: double (nullable = true) |-- songs_by_session_scaled: double (nullable = true) |-- session_duration_scaled: double (nullable = true) |-- event_count_by_session_scaled: double (nullable = true) |-- total_sessions_scaled: double (nullable = true) |-- browser_chrome: integer (nullable = true) |-- browser_firefox: integer (nullable = true) |-- browser_ie: integer (nullable = true) |-- browser_mobile_safari: integer (nullable = true) |-- browser_safari: integer (nullable = true) |-- OS_linux: integer (nullable = true) |-- OS_mac_os_x: integer (nullable = true) |-- OS_ubuntu: integer (nullable = true) |-- OS_windows: integer (nullable = true) |-- OS_ios: integer (nullable = true) |-- page_about_scaled: double (nullable = true) |-- page_add_friend_scaled: double (nullable = true) |-- page_add_to_playlist_scaled: double (nullable = true) |-- page_downgrade_scaled: double (nullable = true) |-- page_error_scaled: double (nullable = true) |-- page_help_scaled: double (nullable = true) |-- page_home_scaled: double (nullable = true) |-- page_logout_scaled: double (nullable = true) |-- page_nextsong_scaled: double (nullable = true) |-- page_roll_advert_scaled: double (nullable = true) |-- page_save_settings_scaled: double (nullable = true) |-- page_settings_scaled: double (nullable = true) |-- page_submit_downgrade_scaled: double (nullable = true) |-- page_submit_upgrade_scaled: double (nullable = true) |-- page_thumbs_down_scaled: double (nullable = true) |-- page_thumbs_up_scaled: double (nullable = true) |-- page_upgrade_scaled: double (nullable = true)
Построение модели
Данные были разделены на наборы данных для обучения и тестирования, которым присвоены 70% и 30% соответственно. Для этого анализа используются следующие классификации:
- Дерево решенийКлассификатор
- GBTКлассификатор
- Случайный ЛесКлассификатор
- ЛинейныйSVC
на каждой из моделей выполняются следующие операции:
model = classifier.fit(df_train) #train the model pred_test = model.transform(df_test) #predict the data #evaluate the metrics metric_f1.evaluate(pred_test)
Оценка модели
Мы проверим производительность обученных моделей и выберем ту, которая имеет лучшую производительность; он основан на счете f1
Причина использования этой оценки связана с дисбалансом в распределении классов, который присутствует в наборе данных. Существует небольшая часть пользователей, которые уходят, и цель этого анализа — определить пользователей, которые могут правильно уходить от службы Sparkify.
Выводы
Модель Machine Learning и Spark позволяют обрабатывать большие объемы данных; это полезно для масштабируемого анализа и позволяет отслеживать пользователей. После того, как мы определили пользователей с возможным поведением оттока, хорошей бизнес-стратегией для уменьшения оттока будет AB/Test, чтобы оценить и привлечь больше пользователей, и это начнется с исследования текущей производительности, затем наблюдения и формулирования гипотезу и определить варианты для двух групп (новый стимул и контрольная группа с существующими) и оценить новое поведение.
Оценка F1 была метрикой для оптимизации, лучшим результатом для этого была классификация линейных опорных векторов (LinearSVC) с оценкой 0,8061; несмотря на время обучения, после обучения время прогнозирования не будет иметь значения для новых пользователей. Модель можно оценивать раз в неделю для выявления новых пользователей, а настройку модели и функции для извлечения можно оценивать раз в неделю.
Для будущей работы оценка в других окнах времени, извлечение признаков могут быть полезны для повышения производительности, проверки того, что мы не получаем переобучения в модели. Имея больше данных, будет полезно оценить: обучение, проверку и наборы тестов.