Использование методов Python и ансамбля для более глубокого изучения клиентов Starbucks

Испытываете волнение, когда Starbucks предлагает вам акцию «купи один, получи один»? Однако достаточно ли вас привлекает предложение прийти в ближайший магазин Starbucks и потратить свои деньги?

Введение

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

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

1. Представление предложения и завершенная модель прогнозирования

Представьте себя молодой взрослой женщиной со средним доходом, и пока вы проверяете свой мобильный телефон, вы видите рекламу: акция BOGO от Starbucks, срок действия которой истекает через 3 дня. Воспользуетесь акцией?

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

Эта модель была направлена ​​на то, чтобы предсказать, будет ли конкретный клиент в определенной демографической группе просматривать или / и завершать предложение, отправленное Starbucks.

2. Модель прогнозирования средних расходов

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

Часть I. Модель прогнозирования просмотренных и завершенных предложений

Вместо демографических характеристик переменные продвижения (типы, вознаграждения, сложность) влияют на то, чтобы больше людей просматривали рекламу, основываясь на приведенном выше графике корреляции. Тип предложения, такой как BOGO, кажется очень привлекательным. Участники просматривают более 70% предложений. Это очень значительное число по сравнению с другими типами кампаний, которые имеют показатель успеха всего 57,9%.

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

Наиболее коррелирующими демографическими атрибутами с просмотренным предложением является возрастная группа. Как показано на приведенном ниже графике, 41,6% участников в возрастной группе молодых людей (17–25 лет) даже не удосужились увидеть предложение, в то время как в других возрастных группах показатель успеха достиг 63,1%.

Это почему? Похоже, что юная взрослая возрастная группа хорошо отреагировала на рекламную кампанию BOGO. В то время как 68,2% просмотрели кампанию BOGO, только 52% из них видели другие типы кампаний.

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

Одно из интересных замечаний, которые можно найти, заключается в том, что участник, присоединившийся в 2018 году (самый новый участник в наборе данных), имеет процент отказов 71,5%. Это почти на 20% больше по сравнению с другими участниками!

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

Пол оказывается решающим здесь. Мужчины на 14% чаще склонны не завершать предложение по сравнению с женщинами.

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

Приступаем к модели. Поскольку существует два класса меток: просмотренное предложение и выполненное, используется MultiOutputClassifier, что означает, что будет четыре разных типа выходных данных: клиент, который не просмотрел и не завершил предложение (0,0), клиент, который не просмотрел и не завершил предложение. (0,1), клиент, просмотревший предложение, но не совершивший его (1,0), и клиент, просмотревший предложение и совершивший его (1,1). Вместе с поиском по сетке используются две модели ансамблевого обучения, повышение градиента и случайный лес.

pipeline = Pipeline([
    ('clf', MultiOutputClassifier(GradientBoostingClassifier())) 
    ])
parameters = [
    {
    "clf": [MultiOutputClassifier(GradientBoostingClassifier())],
    'clf__estimator__learning_rate':[0.5, 0.25],
    'clf__estimator__n_estimators':[100, 200],
    },
    {
    "clf": [MultiOutputClassifier(RandomForestClassifier())],
    'clf__estimator__n_estimators': [100,200]
    }]
grid = GridSearchCV(pipeline, param_grid = parameters, cv=10, return_train_score=False)
grid.fit(X_train, y_train)

Лучшая модель, которая возвращает лучший средний результат теста 54% в наборе обучающих данных, — это повышение градиента с гиперпараметрами скорости обучения 0,25 и n_estimators 100.

Почему повышение градиента работает лучше, чем случайный лес? Повышение градиента работает лучше, чем случайный лес, для несбалансированных наборов данных, таких как обучающий набор данных, используемый для этой модели (только 8% метки — это клиенты, которые не просмотрели и не завершили предложение). Повышение шаг за шагом фокусируется на сложных примерах, которые дают хорошую стратегию для работы с несбалансированными наборами данных за счет усиления влияния положительного класса.

Давайте посмотрим, как модель выполняет тестовый набор данных.

y_pred = grid.predict(X_test)
label = ['Offer Viewed', 'Offer Completed']
report = classification_report(y_test, y_pred, output_dict=True, target_names=label)
confusion_matrix_viewed = multilabel_confusion_matrix(y_test, y_pred)[0]
accuracy_viewed = round(sum(confusion_matrix_viewed.diagonal())*100/confusion_matrix_viewed.sum(), 2)
recall_viewed = round(report['Offer Viewed']['recall']*100,2)
precision_viewed = round(report['Offer Viewed']['precision']*100,2)
confusion_matrix_completed = multilabel_confusion_matrix(y_test, y_pred)[1]
accuracy_completed = round(sum(confusion_matrix_completed.diagonal())*100/confusion_matrix_completed.sum(), 2)
recall_completed = round(report['Offer Completed']['recall']*100,2)
precision_completed = round(report['Offer Completed']['precision']*100,2)
print('The overall accuracy of the model on both class in the test dataset is {}%. Accuracy, recall and precision for offer viewed are {}%, {}% and {}%, \
while accuracy, recall and precision for offer completed are {}%, {}% and {}%.'.format(round(grid.score(X_test, y_test)*100,2),\                                                                              accuracy_viewed,recall_viewed,precision_viewed,\                                                                                   accuracy_completed,recall_completed,precision_completed))

Общая точность модели для обоих классов в тестовом наборе данных составляет 53,85%. Точность, отзыв и точность просмотренных предложений составляют 71,03%, 80,39% и 75,13%, тогда как точность, отзыв и точность завершенных предложений составляют 72,44%, 70,27% и 66,84%.

Часть II. Модель прогнозирования средних расходов

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

Члены, отнесенные к категории участников с высоким доходом, чаще всего тратят около 30 долларов, со средним доходом в основном тратят 20 долларов, а с низким доходом в основном тратят около 5-10 долларов.

Мужчина и женщина по-разному ведут себя в тратах, увидев предложение. В то время как женщины чаще всего тратят около 25–30 долларов, мужчины в основном тратят менее 10 долларов.

Наиболее интересно сравнение между пожилой возрастной группой (старше 60 лет) и другими возрастными группами. Пожилая группа чаще всего тратит около 30 долларов, а другие возрастные группы - около 10 долларов.

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

pipeline = Pipeline([
    ('clr', GradientBoostingRegressor()) 
    ])
parameters = [
    {
    "clr": [GradientBoostingRegressor()],
    'clr__learning_rate':[0.5, 0.25, 0.1],
    'clr__n_estimators':[100, 200,300],
    'clr__max_depth':[10,20,50]
    },
    {
    "clr": [RandomForestRegressor()],
    'clr__n_estimators': [100,200,300],
    'clr__max_depth':[10,20,50],
    'clr__min_samples_split':[2, 5, 10]
    }]
grid_amount = GridSearchCV(pipeline, param_grid = parameters, cv=10, return_train_score=False)
grid_amount.fit(X_train, y_train.values.ravel())
y_pred_train = grid_amount.predict(X_train)
print(mean_absolute_error(y_train, y_pred_train))
print(mean_squared_error(y_train, y_pred_train))

Наилучшей моделью после запуска поиска по сетке является случайный лес с гиперпараметрами числа оценок 300, максимальной глубины 10 и минимального разделения выборок 10. Средняя абсолютная ошибка и среднеквадратическая ошибка в наборе обучающих данных составляют 5,52 и 186,80.

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

Давайте посмотрим, как это работает в тестовом наборе данных.

y_pred = grid_amount.predict(X_test)
print(mean_absolute_error(y_test, y_pred))
print(mean_squared_error(y_test, y_pred))

В наборе тестовых данных средняя абсолютная ошибка и среднеквадратическая ошибка составляют 6,33 и 279,52.

По сравнению со значением диапазона средних расходов в наборе данных, от 0 до 600, средняя абсолютная ошибка 6,33 звучит удивительно, однако мы должны учитывать среднее значение набора данных, которое составляет всего около 15.

Часть 3. Заключение и улучшение

  1. Рекламные атрибуты, такие как тип предложения, влияют на поведение участника при просмотре полученного предложения. Тип предложения, такой как BOGO, просматривают 70% участников, которые его получили.
  2. В завершении предложения демографические атрибуты вносят большой вклад. Мужчины на 14% чаще не выполнили предложение, которое они получили, по сравнению с женщинами.
  3. Для модели просмотренных и завершенных предложений повышение градиента работает лучше, чем модель случайного леса, потому что оно работает лучше, чем случайный лес для несбалансированных наборов данных. Для улучшения, недостаточная или избыточная выборка несбалансированного класса может решить проблему. Общая точность модели повышения градиента для обоих классов в тестовом наборе данных составляет 53,85%. Точность, отзыв и точность просмотренных предложений составляют 71,03%, 80,39% и 75,13%, тогда как точность, отзыв и точность завершенных предложений составляют 72,44%, 70,27% и 66,84%.
  4. Различные демографические группы ведут себя по-разному в отношении средних денег, которые они тратят после просмотра определенных предложений в течение срока действия предложений. Чаще всего мужчины тратят менее 10 долларов, а женщины чаще всего тратят около 25–30 долларов.
  5. Для модели средних расходов случайный лес работает лучше, чем модель повышения градиента, из-за присутствия выбросов в наборе данных. Для улучшения работа над выбросами может решить проблему. Средняя абсолютная ошибка и среднеквадратическая ошибка в тестовом наборе данных составляют 6,33 и 279,52.

Ссылки

Полная благодарность Udacity и Starbucks за предоставление наборов данных. Полный код можно посмотреть здесь: https://github.com/dhaneswaramandrasa/starbucks.

  1. http://ecmlpkdd2017.ijs.si/papers/paperID241.pdf
  2. https://medium.com/@aravanshad/gradient-boosting-versus-random-forest-cfa3fa8f0d80
  3. https://stats.stackexchange.com/questions/140215/why-boosting-method-is-sensitive-to-outliers#:~:text=Outliers%20can%20be%20bad%20for,its%20attention%20on% 20тех%20баллов.