Заключительная статья из серии из трех частей, в которой объясняется, как настроить кластер AWS EMR для обучения и оценки созданной модели.

Введение

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

В этой статье мы рассмотрим шаги, необходимые для настройки кластера AWS EMR для запуска конвейера прогнозирования, созданного в предыдущих статьях, для полного набора данных объемом 12 ГБ.

Настроить кластер EMR

Создайте учетную запись AWS

Посетите aws.amazon.com и нажмите кнопку Создать учетную запись AWS.

Если у вас уже есть учетная запись AWS, войдите в нее. Если у вас нет учетной записи AWS, зарегистрируйтесь.

  • Когда вы зарегистрируетесь, вам нужно будет предоставить кредитную карту. Но не волнуйтесь, с вас пока ничего не заплатят.
  • Вам также нужно будет выбрать план поддержки. Вы можете выбрать бесплатный план базовой поддержки.
  • После завершения регистрации подождите несколько минут, чтобы получить электронное письмо с подтверждением учетной записи AWS. Затем вернитесь на aws.amazon.com и войдите в систему.

Запустить кластер EMR

Перейдите в Консоль Amazon EMR. Затем выберите Кластеры в меню слева и нажмите кнопку Создать кластер.

Настройте свой кластер со следующими параметрами:

  • Выпуск: emr-5.28.0 или новее
  • Приложения: Spark 2.4.4 или более поздней версии.
  • Тип экземпляра: m5.xlarge
  • Количество экземпляров: 3
  • Пара ключей EC2: продолжайте работу без пары ключей EC2 или можете использовать созданную вами, если хотите.

Вы можете оставить остальные настройки по умолчанию и нажать «Создать кластер» в правом нижнем углу.

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

Создать блокнот Jupyter

Теперь, когда вы успешно запустили свой кластер, давайте создадим блокнот для запуска кода PySpark в этом кластере. Выберите «Записные книжки» в меню слева и нажмите кнопку «Создать записную книжку».

Настройте свой ноутбук

  • Введите имя для вашего блокнота
  • Выберите «Выбрать существующий кластер» и выберите только что созданный кластер.
  • Используйте настройку по умолчанию для «роли службы AWS» — это должно быть «EMR_Notebooks_DefaultRole» или «Создать роль по умолчанию», если вы еще этого не сделали.

Вы можете оставить остальные настройки по умолчанию и нажать «Создать блокнот» в правом нижнем углу.

Подождите, пока записная книжка перейдет в состояние «Готово», затем нажмите «Открыть в JupyterLab», чтобы получить доступ к записной книжке.

Копировать функции

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

Примерка модели на большом наборе данных

Если вы выполнили все предыдущие шаги, теперь у вас должен быть открыт блокнот Jupyter на AWS с скопированным начальным кодом. Теперь мы можем приступить к загрузке набора данных размером 12 ГБ, который мы можем легко загрузить из ноутбука, поскольку данные хранятся на S3:

# Set up SparkSession and load the 12GB dataset 
spark = SparkSession \
    .builder \
    .appName("Sparkify") \
    .getOrCreate()
df_large = load_df_for_ml(
    's3n://udacity-dsnd/sparkify/sparkify_event_data.json')
df_large.sort('userId').show()
+-------+-------+---------------+
| userId|churned|number_sessions|
+-------+-------+---------------+
|1000025|      1|             17|
|1000035|      0|             22|
|1000083|      1|             11|
|1000103|      0|              4|
|1000164|      0|             18|
|1000168|      0|              8|
|1000182|      0|              4|
|1000194|      0|              3|
|1000214|      0|             27|
|1000233|      0|              5|
|1000244|      0|              2|
|1000248|      0|             15|
|1000280|      1|             22|
|1000353|      1|              4|
|1000407|      0|             25|
|1000409|      0|             29|
|1000446|      0|              6|
|1000503|      1|              3|
|1000527|      0|             10|
|1000611|      0|             26|
+-------+-------+---------------+
only showing top 20 rows
# Get number of users and percentage of churned users
nrows = df_large.count()
churned_users = df_large.where('churned=1').count()
print(f'Number of users in dataset: {total_rows}')
print(
    f'Percentage churned users: {100 * churned_users / nrows:.2f}')
Number of users in dataset: 22278
Percentage churned users: 22.46

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

# Split dataset into 80% for training and 20% for validation
large_train_df, large_validation_df = df_large.withColumnRenamed('churned', 'label').randomSplit(
    [0.8, 0.2], seed=42)
# Apply k-fold cross-validation to try to find better hyperparameters
cv = build_cross_validator()
cv_model = cv.fit(large_train_df)
# Evaluate the performance of the cross-validated model
results = cv_model.transform(large_validation_df)
results = eval_model(cv_model, large_validation_df)
Performance Stats
Accuracy: 0.8034
Precision = 0.5958
Recall = 0.3947
F1 Score = 0.4748

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

Вывод

В трех статьях я показал вам, как можно эффективно использовать pyspark для прогнозирования оттока пользователей на наборе данных размером 12 ГБ с вымышленной платформы потоковой передачи музыки Sparkify.

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

  • number_sessions: Общее количество сеансов
  • seconds_since_genesis: Общее количество секунд с момента первого записанного появления
  • avg_actions_per_session: Среднее количество действий за сеанс
  • avg_seconds_per_session: Среднее количество секунд, затраченных за сеанс.

Опробовав модель локально и убедившись в ее способности прогнозировать, мы перешли к испытанию того же кода на наборе данных объемом 12 ГБ с использованием распределенного кластера на базе AWS EMR.

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

  • Точность: 0,8034
  • Точность: 0,5958
  • Отзыв: 0,3947
  • Оценка F1: 0,4748

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

Возможные следующие шаги

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

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

Спасибо за чтение! Вы чему-то научились? Как вы думаете, мог ли я преподнести материал лучше? Удалось ли вам улучшить модель дальше? Мне всегда интересно учиться у других, поэтому комментарии приветствуются!