Наиболее востребованные навыки в области данных

«Информация — это масло 21 века, а аналитика — двигатель внутреннего сгорания».

(Питер Сондергаард, старший вице-президент, Gartner)

Наука о данных — одна из самых привлекательных областей, и HBR опубликовал статью еще в 2012 году, в которой говорится, что это Самая сексуальная работа 21 века (ссылка). Поскольку наука о данных может применяться практически в любых отраслях и с чрезвычайно высоким спросом, чем когда-либо, наличие выдающихся научных и аналитических навыков в значительной степени поможет продвинуться по карьерной лестнице и открыть бесчисленные возможности.

Ученые и аналитики данных регулярно сталкиваются с проблемами, которые требуют от них анализа огромного количества данных, что выходит далеко за рамки того, что можно было бы сделать с помощью нераспределенных технологий, таких как scikit-learn, поэтому Spark приходит на помощь.

Apache Spark — это молниеносная унифицированная аналитическая система для больших данных и машинного обучения. (Кирпичи данных)

По мере того, как я приближался к завершению Программы наностепеней для специалистов по данным, я выбрал проект Capstone, чтобы использовать Spark для прогнозирования оттока для популярной компании по предоставлению цифровых музыкальных услуг под названием Sparkify(Звучит знакомо?). Кстати, прогнозирование показателей оттока — сложная и распространенная проблема, с которой специалисты по данным и аналитики регулярно сталкиваются в любом бизнесе, работающем с клиентами. Благодаря этому проекту я также получу практический опыт работы со Spark для эффективного управления большими наборами данных. Такая милая сделка, не так ли?

Процесс CRISP-DM (Межотраслевой процесс интеллектуального анализа данных) — это распространенный процесс, используемый для поиска многих решений в науке о данных, и он уже много лет является отраслевым стандартом, и я будет применять этот процесс и в этом проекте. Процесс CRIPS-DM будет выглядеть следующим образом:

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

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

3. Подготовка данных

4. Данные модели

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

6. Развернуть

В этом сообщении в блоге я расскажу, как я использую Spark вместе с процессом CRISP-DM для прогнозирования оттока, упустив последний шаг «6. Развертывание», поскольку он выходит за рамки моего проекта. Держитесь крепче и давайте начнем!

Часть I: Понимание вопросов и имеющихся данных

Прежде чем приступить к работе над любым проектом данных, очень важно иметь

1. Бизнес-понимание. Понимание проблемы и вопросов, которые вам интересны, в контексте любой области, в которой вы работаете.

2. Понимание данных — переместите вопросы из раздела Понимание бизнеса в вопросы по данным.

Данные, с которыми я работал, представляют собой крошечную часть (128 МБ) полного доступного набора данных (12 ГБ), который содержит данные о том, как пользователи как бесплатного, так и премиум-сервиса используют сервис. Этот набор данных содержит 286 500 записей со следующей информацией:

root
 |-- artist: string (nullable = true)
 |-- auth: string (nullable = true)
 |-- firstName: string (nullable = true)
 |-- gender: string (nullable = true)
 |-- itemInSession: long (nullable = true)
 |-- lastName: string (nullable = true)
 |-- length: double (nullable = true)
 |-- level: string (nullable = true)
 |-- location: string (nullable = true)
 |-- method: string (nullable = true)
 |-- page: string (nullable = true)
 |-- registration: long (nullable = true)
 |-- sessionId: long (nullable = true)
 |-- song: string (nullable = true)
 |-- status: long (nullable = true)
 |-- ts: long (nullable = true)
 |-- userAgent: string (nullable = true)
 |-- userId: string (nullable = true)

Давайте посмотрим, что доступно в столбце page в этом наборе данных:

df.groupby(‘page’).count().orderBy(desc(‘count’)).show(50)
+--------------------+------+
|                page| count|
+--------------------+------+
|            NextSong|228108|
|                Home| 14457|
|           Thumbs Up| 12551|
|     Add to Playlist|  6526|
|          Add Friend|  4277|
|         Roll Advert|  3933|
|               Login|  3241|
|              Logout|  3226|
|         Thumbs Down|  2546|
|           Downgrade|  2055|
|                Help|  1726|
|            Settings|  1514|
|               About|   924|
|             Upgrade|   499|
|       Save Settings|   310|
|               Error|   258|
|      Submit Upgrade|   159|
|    Submit Downgrade|    63|
|              Cancel|    52|
|Cancellation Conf...|    52|
|            Register|    18|
| Submit Registration|     5|
+--------------------+------+

С предложением, полученным от Udacity, мы будем использовать события Cancellation Confirmation для определения вашего оттока, поэтому мы создадим новый столбец willBeChurned все события пользователей, в котором событие события Cancellation Confirmation равно 1 для обозначения оттока и 0 для остальных.

После проведения исследовательского анализа данных (EDA) в этом наборе данных я обнаружил пару интересных выводов, которые мы должны использовать для следующих шагов процесса CRISP-DM, включая:

  1. Мы видим большую часть мужчин в наборе данных об оттоке:

2. SessionTime пользователей, которые все еще находятся в сервисе, имеет более высокое среднее время сеанса (303 минуты против 283 минут).

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

Часть II: Подготовка данных

Следующим шагом процесса CRISP-DM является

3. Подготовка данных

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

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

Категорические данные: отток (да/нет), пол пользователя (мужчина/женщина), последний статус пользователя (платно/бесплатно).

  • Для этого я использовал pyspark.ml.feature.StringIndexerModel, чтобы кодировать категориальные данные в числа и преобразовать их в «int» в конце для экономии памяти (см. пример во фрагменте кода ниже).

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

  • Для числовых данных важно масштабировать их в одном диапазоне, чтобы функции с более высокими значениями не перевешивали функции с крошечными значениями (например, сравнение температуры в градусах Фаренгейта и Цельсия).

Для масштабирования числовых данных в Spark необходимо выполнить два шага:

  • Создайте векторные данные с помощью pyspark.ml.feature.VectorAssembler
  • Затем передайте векторные данные выбранному вами классу масштабирования, и я выбрал pyspark.ml.feature.StandardScaler для этой задачи, чтобы гарантировать, что данные в этих числовых столбцах масштабируются до единичной дисперсии.

(См. пример в фрагменте кода ниже)

Наконец, нам нужно упаковать наши данные таким образом, чтобы их понимали алгоритмы машинного обучения. В этом случае мы создадим новый фрейм данных, который будет содержать только два столбца 'features', которые содержат вектор всех закодированных и масштабированных данных наших объектов и'метки' который содержит данные об оттоке (1/0), которые нам интересно прогнозировать.

Ниже приведен пример того, как выглядят окончательные данные:

Часть III: Моделирование и оценка

Последние этапы процесса CRISP-DM для этого проекта:

4. Данные модели

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

Чтобы создать модель машинного обучения, я начал с разделения данных, сгенерированных в предыдущем сеансе, на обучение (80%) и тестирование (20%). ) данных и использовать pyspark.ml.tuning.CrossValidator и pyspark.ml.tuning.CrossValidator.ParamGridBuilder для автоматического выполнения процесса настройки гиперпараметра.

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

  1. Логистическая регрессия — отлично подходит для задачи по описанию данных и объяснению связи между одной зависимой бинарной переменной.
# Find the average metrics
cvModel_lr.avgMetrics
[0.7236534899472613,
 0.7201886415819452,
 0.710364861505701,
 0.7236534899472613,
 0.7226214097403506,
 0.7247208574624389,
 0.7236534899472613,
 0.7251688440048267,
 0.5]
# Find metric of areaUnderROC
evaluator = BinaryClassificationEvaluator(rawPredictionCol="rawPrediction")
evaluator.evaluate(results_lr)
0.7063345704340608

2. Gradient-boosted Tree Classifier — Очень популярный и эффективный метод, который создает модель прогнозирования в виде ансамбля слабых моделей прогнозирования.

Посмотрите этот отличный пост на Medium, чтобы узнать больше о Gradient Boosting.

# Find the average metrics
cvModel_gbt.avgMetrics
[0.8475309079106088,
 0.9244396717787051,
 0.9778826164196679,
 0.8653077438688899,
 0.9582185909264465,
 0.9867078366697819,
 0.8782328614390618,
 0.9753719357483237,
 0.9912278431482545]
# Find metric of areaUnderROC
evaluator = BinaryClassificationEvaluator(rawPredictionCol="rawPrediction")
evaluator.evaluate(results_gbt)
0.9969456674581039

Из приведенных выше результатов видно, что лучшая модель, обученная с использованием Градиентно-усиленного древовидного классификатора, была очень точной при прогнозировании оттока и достигла метрики Площадь под кривой ROC на уровне около 99,7 % при сравнении. к лучшей модели, обученной с использованием логистической регрессии, которая достигает метрики Площадь под кривой ROC примерно на 70%

Вывод

Мы рассмотрели, как мы можем использовать Spark для выполнения процесса CRISP-DM для анализа большого набора данных, что может быть очень сложно сделать с помощью нераспределенных технологий, таких как scikit-learn.

Кроме того, мы увидели, как Spark можно использовать для выполнения всего процесса науки о данных, начиная с исследовательского анализа данных (EDA), разработки признаков и процесса моделирования, и заканчивая окончательной моделью машинного обучения, обученной с помощью классификатора дерева с градиентным усилением алгоритм имеет очень высокую производительность и имеет показатель Площадь под ROC-кривой более 99%

Обратите внимание, что этот проект выполнялся на моей локальной машине, и я был очень доволен тем фактом, что процесс обучения выполняется менее чем за два часа, учитывая, что набор данных содержит почти 300 тысяч строк. Для повышения производительности также можно развернуть кластер Spark в облаке с помощью AWS или IBM Cloud для анализа (намного) большего объема данных.

Чтобы повторить то, что я упоминал ранее:

«Информация — масло 21 века, а аналитика — двигатель внутреннего сгорания»

(Питер Сондергаард, старший вице-президент, Gartner)

Вы готовы запустить двигатель внутреннего сгорания?

Чтобы узнать больше об этом анализе, см. ссылку на мой Github, доступную здесь.