Фото автора Адриана Конверса на Unsplash
Существует множество способов построения модели маркетингового комплекса (МММ), но обычно всё сводится к использованию линейной регрессии из-за её простой интерпретируемости.
Интерпретируемость более сложных нелинейных моделей — тема исследований последних 5–6 лет, поскольку в сообществе машинного обучения были предложены такие концепции, как LIME или SHAP, для объяснения выходных данных модели. Однако эти новые концепции, похоже, почти неизвестны в области атрибуции маркетинга.
В этой статье я продолжаю исследовать практические подходы в моделировании маркетингового комплекса, создавая ансамбли на основе деревьев с помощью Random Forest и объясняя эффективность медиаканалов с помощью концепции SHAP.
В предыдущей статье я использовал байесовское программирование для построения модели маркетингового комплекса и сравнил результаты с фреймворком Robyn.
Мой основной интерес состоял в том, чтобы выяснить, сопоставимы ли оба подхода и могут ли они быть последовательными в повествовании. Поскольку Robyn генерирует несколько решений, я смог найти то, которое согласуется с байесовским решением, а именно, что доли эффектов обеих моделей последовательно выше или ниже долей расходов в каждом канале. Процентные различия могут быть объяснены различиями в подходах и способностью моделей хорошо соответствовать данным.
Однако общее между двумя подходами заключается в том, что оба описывают линейную зависимость между расходами на рекламу и откликом и, следовательно, не могут уловить более сложные взаимосвязи переменных, такие как взаимодействия.
Моделирование маркетингового комплекса с помощью PyMC3
Одним из первых коммерческих примеров использования более сложных алгоритмов, таких как Gradient Boosting Machines (GBM) вместе с SHAP в моделировании маркетингового комплекса, который мне удалось найти, был описан H2O.ai.
Я перечисляю основные мотивы перехода на более сложные алгоритмы:
- Классические подходы, такие как линейная регрессия, сложны и требуют времени и опыта для выявления надлежащих структур моделей, таких как корреляции переменных, взаимодействия или нелинейные отношения. В некоторых случаях необходимо удалять сильно коррелированные признаки. Переменные взаимодействия должны быть явно разработаны. Нелинейности, такие как насыщение и убывающая отдача, должны быть явно введены с помощью различных преобразований.
- Некоторые структуры моделей приносятся в жертву ради более простой интерпретируемости модели, что может привести к снижению производительности модели.
- Более сложные алгоритмы машинного обучения, такие как ансамбли на основе деревьев, хорошо работают при наличии сильно коррелированных переменных, могут фиксировать взаимодействия между переменными, являются нелинейными и обычно более точными.
Подробности о SHAP для объяснения моделей объясняются во многих статьях и книгах. Я перечисляю основную интуицию, стоящую за SHAP:
SHAP (SHapley Additive exPlanations) — это теоретико-игровой подход к объяснению выходных данных любой модели машинного обучения. Он связывает оптимальное распределение кредитов с локальными объяснениями, используя классические значения Шепли из теории игр и их связанные расширения.
- SHAP — это метод объяснения отдельных прогнозов и отвечает на вопрос, как сильно каждая функция влияет на этот прогноз.
- Значения SHAP — это показатели важности функций.
- Значения SHAP могут быть отрицательными и положительными и показывают величину прогноза относительно среднего значения всех прогнозов. Абсолютная величина указывает на силу функции для конкретного индивидуального прогноза.
- Среднее значение абсолютных величин значений SHAP для каждой функции указывает на глобальную важность функции.
- В некотором смысле важность функций SHAP может быть альтернативой важности функций перестановки. В отличие от SHAP, важность функций перестановки основана на общем снижении производительности модели.
Основная проблема при переходе на более сложные модели в МММ — отсутствие инструментов для объяснения влияния отдельных медиаканалов.
Хотя сообщество машинного обучения активно использует подходы для объяснимости моделей, такие как SHAP, предложенные сотнями статей и докладов на конференциях, всё ещё очень сложно найти примеры использования SHAP в контексте МММ. Эта замечательная статья связывает МММ с SHAP и объясняет, как мы можем интерпретировать результаты маркетингового комплекса.
Мотивированный этой статьёй, я написал почти универсальное решение для моделирования маркетингового комплекса, объединив идеи методологии Robyn для разложения тенденций и сезонности, используя оценщик Random Forest (который можно легко заменить другими алгоритмами) и оптимизируя параметры adstock и параметры модели с помощью Optuna (фреймворк для оптимизации гиперпараметров). Решение позволяет переключаться между одноцелевой оптимизацией, как это обычно делается в МММ, и многоцелевой оптимизацией, как это делает Robyn.
Данные
Я продолжаю использовать набор данных, предоставленный Robyn под лицензией MIT, как в моей первой статье для обеспечения согласованности и сравнительного анализа, и следую тем же шагам подготовки данных, применяя Prophet для разложения тенденций, сезонности и праздников.
Набор данных состоит из 208 недель доходов (с 2015–11–23 по 2019–11–11) с:
- 5 каналами расходов на медиа: tv_S, ooh_S, print_S, VK_S, search_S;
- 2 медиаканалами, которые также имеют информацию об экспозиции (Impression, Clicks): VK_I, search_clicks_P (не используется в этой статье);
- Органическими медиа без расходов: newsletter;
- Контрольными переменными: events, holidays, competitor sales (competitor_sales_B).
Окно анализа составляет 92 недели с 2016–11–21 по 2018–08–20.
Adstock / Carryover Effects
Независимо от алгоритма моделирования, реклама adstock играет важную роль в МММ. Поэтому мы должны решить, какой вид adstock мы собираемся использовать и какие минимальные и максимальные значения он может потенциально иметь для каждого медиаканала (пожалуйста, обратитесь к моей предыдущей статье для обзора различных функций adstock). Алгоритм оптимизации будет пробовать каждое значение adstock из диапазона определённых значений, чтобы найти наилучшее, которое минимизирует критерии оптимизации.
Я использую геометрическую функцию adstock, реализованную в scikit-learn следующим образом:
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.utils import check_array
from sklearn.utils.validation import check_is_fitted
class AdstockGeometric(BaseEstimator, TransformerMixin):
def __init__(self, alpha=0.5):
self.alpha = alpha
def fit(self, X, y=None):
X = check_array(X)
self._check_n_features(X, reset=True)
return self
def transform(self, X: np.ndarray):
check_is_fitted(self)
X = check_array(X)
self._check_n_features(X, reset=False)
x_decayed = np.zeros_like(X)
x_decayed[0] = X[0]
for xi in range(1, len(x_decayed)):
x_decayed[xi] = X[xi] + self.alpha* x_decayed[xi - 1]
return x_decayed
Diminishing Returns / Saturation Effect
Я уже упоминал, что линейные модели не способны уловить нелинейные взаимосвязи между различными уровнями расходов на рекламу и результатом. Поэтому перед моделированием были применены различные нелинейные преобразования, такие как Power, Negative Exponential и Hill.
Алгоритмы на основе деревьев способны фиксировать нелинейности. Поэтому я не применяю никаких нелинейных преобразований явно и позволяю модели самостоятельно изучать нелинейности.
Моделирование
Моделирование состоит из нескольких шагов:
Параметры Adstock
Длительность эффекта рекламы зависит от медиаканала. Поскольку мы ищем оптимальный коэффициент затухания adstock, мы должны быть реалистами в отношении возможных диапазонов параметра. Например, известно, что телевизионная реклама может иметь длительный эффект, в то время как реклама в печати имеет более короткий эффект. Поэтому мы должны иметь возможность определять реалистичные гиперпараметры для каждого медиаканала. В этом примере я использую точные диапазоны, предложенные Robyn в их демонстрационном файле.
adstock_features_params = {}
adstock_features_params["tv_S_adstock"] = (0.3, 0.8)
adstock_features_params["ooh_S_adstock"] = (0.1, 0.4)
adstock_features_params["print_S_adstock"] = (0.1, 0.4)
adstock_features_params["VK_S_adstock"] = (0.0, 0.4)
adstock_features_params["search_S_adstock"] = (0.0, 0.3)
adstock_features_params["newsletter_adstock"] = (0.1, 0.4)
Перекрёстная проверка временных рядов
Мы хотим найти параметры, которые хорошо обобщаются на невидимых данных. Мы должны разделить наши данные на обучающий и тестовый наборы. Поскольку наши данные представляют собой расходы и доходы, происходящие во времени, мы должны применить перекрёстную проверку временных рядов таким образом, чтобы обучающий набор состоял только из событий, которые произошли до событий в тестовом наборе.
Алгоритмы машинного обучения работают лучше, когда они обучены на больших объёмах данных. Алгоритм Random Forest не является исключением, и для того, чтобы уловить нелинейности и взаимодействия между переменными, его следует обучать на большом количестве данных. Как я упоминал ранее, у нас всего 208 точек данных и 92 точки данных в окне анализа. Нам нужен некоторый компромисс между обобщаемостью и способностью модели к обучению.
После некоторых экспериментов я решил использовать 3 cv-сплита, выделив 20 недель данных (около 10%) в качестве тестового набора.
from sklearn.model_selection import TimeSeriesSplit
tscv = TimeSeriesSplit(n_splits=3, test_size = 20)
Гиперпараметрическая оптимизация с помощью Optuna
Гиперпараметрическая оптимизация состоит из ряда экспериментов или проб. Каждый пробный запуск можно условно разделить на три этапа.
- Применение преобразования adstock к медиаканалам с использованием набора параметров adstock.
- Перекрёстная проверка и измерение средней ошибки по всем тестовым наборам.
- Возврат среднего значения ошибки.
Результаты
Первый график для проверки — насколько хорошо модель соответствует данным за период анализа в 92 недели:
MAPE улучшился на 40%, а NRMSE — на 17% по сравнению с байесовским подходом.
Далее давайте построим график доли расходов по сравнению с долей эффекта:
Доля эффекта рассчитывается с использованием абсолютной суммы значений SHAP для каждого медиаканала в пределах интервала анализа и нормализуется по общей сумме значений SHAP всех медиаканалов.
Доля эффекта почти согласуется с долей эффекта предыдущей статьи. Я наблюдаю только одно несоответствие между долей эффекта канала search.
Заключение
В этой статье я продолжил исследовать способы улучшения моделей маркетингового комплекса, используя более сложные алгоритмы, которые способны улавливать нелинейности и взаимодействия переменных. В результате весь конвейер упрощается за счёт исключения шага нелинейного преобразования, который всегда применяется при использовании линейной регрессии. Использование значений SHAP позволило провести дальнейший анализ доли эффекта и кривых отклика. Моя вторая цель состояла в том, чтобы достичь согласованных результатов между различными подходами. Сравнение результатов предыдущей статьи, в которой я использовал байесовское моделирование, и результатов этой статьи показало высокую степень согласованности в разложенных эффектах по медиаканалам.
