Этот блог посвящен моему ключевому проекту по обучению Udacity Data Scientist. Присоединиться к курсу можно здесь.

Определение проекта

Обзор проекта

Основная цель этого проекта - проанализировать и найти взаимосвязь между данными компании Starbucks. Методы науки о данных часто используются в компаниях для повышения удовлетворенности клиентов и продаж продукции.

Этот набор данных содержит смоделированные данные, которые имитируют поведение клиентов в мобильном приложении Starbucks Rewards. Раз в несколько дней Starbucks рассылает предложение пользователям мобильного приложения. Предложение может быть просто рекламой напитка или реальным предложением, таким как скидка или BOGO (купите один, получите второй бесплатно). Некоторые пользователи могут не получать никаких предложений в течение определенных недель.

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

Обзор набора данных

  • Программа, используемая для создания данных, моделирует, как люди принимают решения о покупке и как на эти решения влияют рекламные предложения.
  • У каждого человека в симуляции есть некоторые скрытые черты, которые влияют на их модели покупок и связаны с их наблюдаемыми чертами. Люди производят различные события, включая получение предложений, открытие предложений и совершение покупок.
  • Для упрощения нет явных продуктов для отслеживания. Записываются только суммы каждой сделки или предложения.
  • Существует три типа предложений, которые можно отправлять: купи-один-получи-один (BOGO), скидка и информационное. В предложении BOGO пользователь должен потратить определенную сумму, чтобы получить вознаграждение, равное этой пороговой сумме. При скидке пользователь получает вознаграждение, равное части потраченной суммы. В информационном предложении нет вознаграждения, но нет и необходимой суммы, которую пользователь должен потратить. Предложения могут быть доставлены по нескольким каналам.

Данные содержатся в трех файлах:

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

Вот схема и объяснение каждой переменной в файлах:

portfolio.json

  • id (string) — id оффера
  • offer_type (string) — тип предложения т.е. BOGO, скидка, информационное
  • трудность (целое число) — минимальные затраты, необходимые для выполнения предложения.
  • вознаграждение (int) — вознаграждение за выполнение предложения
  • duration (int) — время открытия оффера, в днях
  • каналы (список строк)

profile.json

  • age (int) — возраст клиента
  • стал_member_on (целое число) — дата, когда клиент создал учетную запись приложения.
  • гендер (str) — пол клиента (обратите внимание, что некоторые записи содержат «O» вместо M или F)
  • id (str) — идентификатор клиента
  • доход (float) — доход клиента

транскрипт.json

event (str) — описание записи (т. е. транзакция, полученное предложение, просмотренное предложение и т. д.)

person (str) — идентификатор клиента

time (int) — время в часах с момента начала теста. Данные начинаются в момент времени t=0

value — (dict of strings) — либо идентификатор предложения, либо сумма транзакции в зависимости от записи

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

Так как это краеугольный проект. Точного определения проблемы предоставлено не было. Я решил проанализировать и выяснить, будет ли выбранное предложение успешным для пользователя, определяемого его демографическими данными. Например, если предложение «А» будет успешным для пользователя с зарплатой x, полом y и т. д. Я буду решать эту проблему с помощью анализа данных и методов машинного обучения.

Показатели

В качестве основных показателей для наших моделей машинного обучения мы выбрали точность, которая используется для оценки обучающих данных. Набор данных содержит относительно одинаковое количество вхождений классов, что означает, что мы можем использовать точность. Точность — это наиболее интуитивно понятная мера производительности, и это просто отношение правильно предсказанного наблюдения к общему количеству наблюдений. Вторая метрика, которую мы использовали, — это показатель F-beta. Этот используется для оценки тестовых данных. Показатель F-бета представляет собой средневзвешенное гармоническое значение точности и полноты, достигающее своего оптимального значения при 1 и наихудшего значения при 0. Я использовал бета-значение 0,5, что означает, что в нем больше внимания уделяется точности, а меньше отзыву. подсчет баллов.

Анализ

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

Сначала нам нужно посмотреть все наборы данных, которые нам предоставили. Первый назывался «Портфолио», в нем были все предложения с их описанием. Всего было 10 различных предложений. Пользователи могли получить 3 вида предложений: дисконтное, бесплатное и информационное.

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

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

Вторым был набор данных «Профиль». В нем была вся информация о профилях зарегистрированных людей, таких как их пол, доход, возраст и т. Д. Набор данных содержал 17000 уникальных профилей. Отсутствуют данные, такие как доход, которые необходимо заменить на следующем шаге.

Как вы можете видеть на картинке гендерного распределения, в нашем наборе данных больше клиентов-мужчин и меньше клиентов-женщин.

Последний набор данных назывался «Транскрипт». Он хранил все данные, связанные с поведением, таким как получение предложения или завершение предложения и т. Д. Всего в нем было 306534 записи. Большинство из них представляли собой записи о транзакциях. События транзакции не понадобятся.

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

Методология

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

В данных портфолио я заменил столбец каналов столбцами для мобильных устройств, Интернета, социальных сетей и электронной почты. Эти новые столбцы имеют значение 1 или 0 в зависимости от наличия в столбце каналов в строке.

Второй модификацией стал столбец offer_type. Аналогичные изменения были внесены и здесь. Столбец Offer_type был заменен всеми его уникальными значениями на отдельные столбцы.

Следующим шагом было изменение данных стенограммы. Проблема заключалась в том, что в столбце «значение» было значение формата json. Это было решено путем замены исходного значения значением элемента словаря и удалением ключа словаря.

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

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

Вот пример предложений случайного человека.

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

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

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

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

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

После этого я создал манекены из столбца id и удалил все ненужные столбцы person, offer_received, offer_viewed, offer_completed. Теперь у нас есть окончательная форма наших данных, которые будут переданы нашим моделям машинного обучения.

Реализация

Для всего решения я использовал Python 3.7, а код был написан непосредственно в блокноте Udacity jupyter.

Первым шагом перед созданием модели машинного обучения было разделение данных на наборы для обучения и тестирования. 60% данных используются для обучения и 40% для тестирования модели. Для этой операции я использовал модуль Python sklearn.model_selection.

Столбец успеха использовался как класс (выходная метка).

Затем я создал 3 разные модели машинного обучения:

  1. Случайная модель леса
  2. Многослойная модель персептрона
  3. k-модель ближайшего соседа

Все они использовались из библиотеки sklearn python с параметрами по умолчанию.

Уточнение

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

Результаты

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

Согласно определенным метрикам точность данных обучения составила:

Как вы можете видеть, на тренировочном наборе модель случайного леса была лучшей с точностью 98%, а с другой стороны, многослойный персептрон был худшим с точностью всего 39%.

На тестовом наборе я посмотрел на показатель F-бета:

Результаты были такими же, как и на обучающей выборке. Лучшей снова стала модель Random Forest с результатом 75%. Второй была модель kNN с 65%, а последней была модель многослойного персептрона только с 38%.

Настройка параметров

После этого я решил улучшить модель случайного леса, используя методы перекрестной проверки. Алгоритм нашел модель с лучшими параметрами. Эта новая модель случайного леса имела 78% F-бета-показателей.

Как мы видим, настройка параметров улучшила показатель F-бета модели Ranodm Forest на 3%.

Обоснование

Как показали результаты, модель случайного леса является наиболее надежной и лучше всего подходит для нашей задачи. После настройки параметров я получил еще лучшие результаты. Вероятно, это связано с тем, что алгоритм случайного леса является самым надежным из всех трех алгоритмов, которые я использовал. С другой стороны, модель MLP не очень хорошо соответствует нашим данным.

Заключение

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

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

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

Теперь у нас были данные, которые нужно было разделить на обучающие и тестовые наборы. Наконец мы начали подгонять наши 3 модели (Random Forest, kNN, MLP). После того, как мы обнаружили, что у Ranodm Forest были лучшие результаты с показателем F-бета 75%, мы выбрали его для настройки параметров. После процесса перекрестной проверки мы улучшили показатель F-бета на 3% до 78%.

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

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

Улучшения

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

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

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