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

Прогнозирование оттока

Каждая подписная компания хочет сохранить своих пользователей. Если бы ты смог разбить это яйцо, тебе бы больше никогда не пришлось работать. Как мы можем использовать машинное обучение для выявления пользователей, которые могут «уйти», т. е. отменить или понизить уровень своих услуг в ближайшее время? Чтобы ответить на этот невероятно прибыльный бизнес-вопрос, я решил попробовать свои силы в Spark.

ETL (извлечение-преобразование-загрузка)

Мой набор данных был предоставлен Udacity, где я участвую в программе Data Science Nano Degree. Каждая строка представляет собой действие, предпринятое пользователем, подписавшимся на службу потоковой передачи музыки.

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

EDA (исследовательский анализ данных)

Затем мне нужно было определить отток. Ключ к определению того, когда происходит отток, лежит в поле «страница». Учитывая потенциальные страницы, которые может посетить пользователь, я снова выбрал простой подход (большой сюрприз). Я определил отток как любое событие, когда посещается страница «Подтверждение отмены».

Я создал это событие как функцию в наборе данных. Я также создал функции для событий, которые хотел использовать при обучении моделей: «Добавить в плейлист», «Большие пальцы вверх», «Большие пальцы вниз» и «Следующая песня».

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

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

Обучение и тестирование моделей

Поскольку я новичок в этом мире машинного обучения, я попробовал всего понемногу, чтобы набраться опыта. Я векторизовал свои функции, а затем запустил Normalizer и StandardScaler, чтобы создать два отдельных вектора для обучения. Я разделил свои данные на наборы обучающих и тестовых наборов (7:3) и выбрал две модели классификации для обучения: логистическая регрессия и случайный лес. Наконец, я использовал CrossValidator для настройки каждой модели по нескольким параметрам.

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

Заключение

Модели логистической регрессии (LR) незначительно превосходили модели Random Forest (RF) в 3 из 4 случаев. Два разных преобразователя признаков, Normalizer и StandardScaler, не показали надежной тенденции между 4 испытаниями. Значение regParam, равное 0,0, не имеет никакой разницы в точности по сравнению со значением 0,1. И что еще хуже, значения numTrees, равные 10 и 100, не показали никакой разницы в производительности.

Наилучшей производительностью была скромная точность 67,3%, и три из восьми испытаний показали такой уровень точности. Три других испытания показали очень похожие результаты в пределах 3%. Остальные два испытания были хуже на 60–62%. Единственная последовательность заключалась в том, что случайный лес с нормализатором работал хуже всего.

Прогнозирование оттока с точностью 67 % определенно не поможет продать мою модель Spotify. Мне определенно нужно сохранить свою постоянную работу инженера-программиста! Здесь я продемонстрировал, что даже новичок может использовать Spark для машинного обучения.

Если вам интересно узнать больше об этом проекте, посетите мой репозиторий на GitHub. Если вам нравится исправлять людей в Интернете, я буду рад вашим отзывам о моей работе. Лучший способ научиться - это попробовать!

ОБНОВЛЯТЬ

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

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

Но я сохранил свой старый код, потому что… ну, я им гордился. Крутой код просто крут, независимо от того, решает он проблему или нет. Перенесемся на месяц вперед, когда я буду готов представить свой проект, и я думаю: «Я должен попробовать точно такое же моделирование с моим старым набором функций с самого начала. Только для улыбки». Я сейчас ухмыльнусь! Проверь это.

Обучение с моими исходными функциями с использованием тех же параметров, скейлеров и моделей дало точность более 90%. Я пойду дальше и подам заявление об увольнении на работе сейчас, так как я должен получить чек от Spotify в любой день! Помимо сарказма, я очень рад, что мои первоначальные идеи в конце концов принесли свои плоды. Мораль этой истории такова…

Если сначала у вас не получится, сохраните свой код на потом.