Обзор продукта

Starbucks Capstone Challenge — это проект, реализованный в рамках программы Udacity Data Science Nano Degree. Задача состоит из данных, сгенерированных Starbucks из разных кампаний. Это могут быть такие предложения, как BOGO (Купи один, получи один) или скидки на будущие покупки. Можно ли взять эти данные и превратить в полезные инсайты своих клиентов? Давай выясним.

Анализ этой работы можно найти на Github здесь

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

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

Стратегия

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

Далее мы должны очистить данные и извлечь полезные функции, которые можно использовать для нашей ML-модели.

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

Последний шаг — попытаться улучшить модель ML, оптимизировав гиперпараметры.

Метрики

При создании модели машинного обучения важно знать, какие показатели использовать при оценке результатов. Есть несколько мер, которые необходимо использовать. Здесь мы решили сосредоточиться на скорости попаданий вместе с матрицей путаницы. Частота совпадений просто говорит нам, сколько правильных прогнозов модель сделала из набора тестов. С другой стороны, матрица путаницы смотрит на то, где возникают ошибки. Возникает ли большинство ошибок из-за ложных срабатываний или, например, ложных отрицаний? Ложноположительный результат определяется как модель, предсказывающая истину, если фактический результат был ложным. Ложноотрицательный результат — это ML-модель, предсказывающая ложь, когда фактический результат был верным. Это число может быть либо в необработанном виде, либо в процентах от общего числа.

Исследование и визуализация данных

Теперь мы углубимся в данные и посмотрим, что они содержат.

Первая часть данных содержит различные предложения, такие как сложность типа, вознаграждение и т. д.

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

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

Этот набор данных содержит так много информации, что интересно копнуть немного дальше.

Давайте начнем с того, сколько событий инициирует типичный пользователь.

Также постройте его в виде гистограммы.

Теперь мы знаем, что среднее количество событий на человека составляет около 18. Как насчет распределения пола и возраста в данных?

Мы видим, что в данных немного больше мужчин, чем женщин.

Далее мы можем увидеть возрастное распределение.

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

Мы можем определить несколько вещей, которые происходят с этим конкретным клиентом. Эта женщина получила предложение в момент времени 0, затем оно было просмотрено через 6 часов. После этого она на самом деле покупает кофе в момент 132, достаточно, чтобы завершить предложение. Затем поступает новое предложение и клиент отвечает своими действиями.

Предварительная обработка данных

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

Мы также сразу закодировали пол и добавили столбец, чтобы указать, был ли пол неизвестен или нет.

Создание набора данных результатов предложения кампании

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

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

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

Вот некоторые статистические данные о наборе данных offerOutcomes:

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

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

Выполнение

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

Большая часть работы по ETL уже проделана. Данные очищаются, функции извлекаются, а разные таблицы объединяются. Теперь мы добавим это в модель машинного обучения.

Тренировочные/тестовые наборы

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

Создайте классификатор Gradient Boosting в качестве модели машинного обучения. Затем мы обучаем его на тренировочном наборе и оцениваем на невидимом тестовом наборе.

Оценка и проверка модели

Мы видим, что на тестовом наборе у нас есть вероятность попадания около 79%, что совсем неплохо.

Матрица путаницы

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

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

Уточнение

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

Давайте попробуем это.

Мы нашли новую модель с немного другими гиперпараметрами. Насколько это хорошо?

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

Обоснование

Окончательная модель работает довольно хорошо. С вероятностью 80% прогнозирования, выполнит ли клиент предложение или нет. Также нет особенно большого дисбаланса между ложными положительными или ложными отрицательными результатами, как это видно в матрице путаницы.

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

Настройка гиперпараметров действительно улучшила модель, но ненамного.

Отражение

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

Самая трудная проблема заключалась в том, чтобы преобразовать необработанные данные, которые представляли собой журнал транзакций событий, во что-то полезное. Например, клиент может случайно завершить предложение еще до просмотра объявления.

Также довольно сложно сделать хорошую разработку функций. Извлечение полезных метрик в качестве входных данных для модели ML — это форма искусства. Должны ли мы учитывать предыдущее поведение клиента в качестве входных данных при оценке вероятности успешной кампании? Какие показатели должны быть включены?

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

Возможные улучшения

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

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

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

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