7 марта 2024 года Google выпустила новую официальную версию байесовского МММ под названием Meridian . В настоящее время доступность Meridian для некоторых рекламодателей ограничена. Посетите этот сайт или свяжитесь с представителем Google для получения дополнительной информации. Версия LMMM будет прекращена, как только Meridian станет общедоступной.
Документы • Введение • Теория • Начало работы • Справочные материалы • В центре внимания сообщества
Моделирование маркетингового микса (МММ) используется рекламодателями для измерения эффективности рекламы и принятия решений о распределении бюджета по медиаканалам. Измерения на основе агрегированных данных позволяют сравнивать онлайн- и офлайн-каналы, а также не зависят от недавних изменений экосистемы (некоторые из которых связаны с конфиденциальностью), которые могут повлиять на моделирование атрибуции. МММ позволяет:
Байесовский подход к MMM позволяет рекламодателю интегрировать предварительную информацию в моделирование, что позволяет вам:
Пакет LightweightMMM (созданный с использованием Numpyro и JAX) помогает рекламодателям легко создавать байесовские модели MMM, предоставляя функциональные возможности для надлежащего масштабирования данных, оценки моделей, оптимизации распределения бюджета и построения общих графиков, используемых в этой области.
МММ количественно определяет взаимосвязь между активностью медиаканала и продажами, одновременно контролируя другие факторы. Упрощенный обзор модели показан ниже, а полная модель представлена в документации модели. MMM обычно запускается с использованием еженедельных наблюдений (например, KPI может быть продажами за неделю), однако его также можно запускать и на ежедневном уровне.
Где KPI обычно представляет собой объем или стоимость продаж за период времени,
LightweightMMM можно запускать либо с использованием данных, агрегированных на национальном уровне (стандартный подход), либо с использованием данных, агрегированных на географическом уровне (субнациональный иерархический подход).
Национальный уровень (стандартный подход). Этот подход подходит, если имеющиеся данные агрегируются только на национальном уровне (например, KPI может представлять собой национальные продажи за период времени). Это наиболее распространенный формат, используемый в МММ.
Географический уровень (субнациональный иерархический подход). Этот подход подходит, если данные могут быть агрегированы на субнациональном уровне (например, ключевым показателем эффективности могут быть продажи за период времени для каждого штата внутри страны). Этот подход может дать более точные результаты по сравнению со стандартным подходом, поскольку он использует больше точек данных для соответствия модели. Мы рекомендуем по возможности использовать модель субнационального уровня для более крупных стран, таких как США.
Вполне вероятно, что влияние медиа-канала на продажи может иметь запаздывающий эффект, который со временем постепенно сходит на нет. Наша мощная архитектура байесовской модели MMM предназначена для учета этого эффекта и предлагает три различных подхода. Мы рекомендуем пользователям сравнить все три подхода и использовать тот, который работает лучше всего. Лучше всего работает подход, который, как правило, обеспечивает наилучшее соответствие вне выборки (что является одним из сгенерированных выходных данных). Функциональные формы этих трех подходов кратко описаны ниже и полностью выражены в документации нашей модели.
Рекомендуемый способ установкиweight_mmm — через PyPi:
pip install --upgrade pip
pip install lightweight_mmm
Если вы хотите использовать самую последнюю и немного менее стабильную версию, вы можете установить ее с github:
pip install --upgrade git+https://github.com/google/lightweight_mmm.git
Если вы используете Google Colab, обязательно перезапустите среду выполнения после установки.
Здесь мы используем смоделированные данные, но предполагается, что на этом этапе ваши данные очищены. Необходимыми данными будут:
# Let's assume we have the following datasets with the following shapes (we use
the `simulate_dummy_data` function in utils for this example ):
media_data , extra_features , target , costs = utils . simulate_dummy_data (
data_size = 160 ,
n_media_channels = 3 ,
n_extra_features = 2 ,
geos = 5 ) # Or geos=1 for national model
Масштабирование — это своего рода искусство. Байесовские методы хорошо работают, если входные данные имеют небольшой масштаб. Нам не следует центрировать переменные на уровне 0. Продажи и средства массовой информации должны иметь нижнюю границу 0.
y
можно масштабировать как y / jnp.mean(y)
.media
можно масштабировать как X_m / jnp.mean(X_m, axis=0)
, что означает, что новое среднее значение столбца будет равно 1. Мы предоставляем CustomScaler
, который может применять масштабирование умножения и деления в случае, если более широко используемые масштабаторы не подходят для вашего случая использования. Соответствующим образом масштабируйте данные перед подгонкой модели. Ниже приведен пример использования этого CustomScaler
:
# Simple split of the data based on time.
split_point = data_size - data_size // 10
media_data_train = media_data [: split_point , :]
target_train = target [: split_point ]
extra_features_train = extra_features [: split_point , :]
extra_features_test = extra_features [ split_point :, :]
# Scale data
media_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
extra_features_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
target_scaler = preprocessing . CustomScaler (
divide_operation = jnp . mean )
# scale cost up by N since fit() will divide it by number of time periods
cost_scaler = preprocessing . CustomScaler ( divide_operation = jnp . mean )
media_data_train = media_scaler . fit_transform ( media_data_train )
extra_features_train = extra_features_scaler . fit_transform (
extra_features_train )
target_train = target_scaler . fit_transform ( target_train )
costs = cost_scaler . fit_transform ( unscaled_costs )
Если у вас есть переменная, содержащая много нулей, вы также можете масштабировать ее по среднему значению ненулевых значений. Например, для этого вы можете использовать лямбда-функцию: lambda x: jnp.mean(x[x > 0])
. То же самое относится и к масштабированию затрат.
Модель требует медиа-данных, дополнительных функций, стоимости каждой медиа-единицы на канал и цели. Вы также можете указать, сколько образцов вы хотите использовать, а также количество цепочек.
Для параллельного запуска нескольких цепочек пользователю необходимо установить в numpyro.set_host_device_count
либо количество цепочек, либо количество доступных процессоров.
См. пример ниже:
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 )
Если вы хотите изменить какой-либо априор в модели (кроме априора носителя, который вы всегда указываете), вы можете сделать это с помощью custom_priors
:
# See detailed explanation on custom priors in our documentation.
custom_priors = { "intercept" : numpyro . distributions . Uniform ( 1 , 5 )}
# Fit model.
mmm = lightweight_mmm . LightweightMMM ()
mmm . fit ( media = media_data ,
extra_features = extra_features ,
media_prior = costs ,
target = target ,
number_warmup = 1000 ,
number_samples = 1000 ,
number_chains = 2 ,
custom_priors = custom_priors )
Более подробную информацию можно найти в нашей документации по custom_priors.
Вы можете переключаться между ежедневными и еженедельными данными, включив weekday_seasonality=True
и seasonality_frequency=365
или weekday_seasonality=False
и seasonality_frequency=52
(по умолчанию). В случае ежедневных данных мы имеем два типа сезонности: дискретную по дням недели и плавную годовую.
Пользователи могут проверить метрики сходимости параметров следующим образом:
mmm . print_summary ()
Эмпирическое правило заключается в том, что значения r_hat
для всех параметров меньше 1,1.
Пользователи могут проверить соответствие между истинным и прогнозируемым ключевым показателем эффективности:
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
Если задан target_scaler
, используемый для preprocessing.CustomScaler()
, цель будет немасштабирована. Байесовский R-квадрат и MAPE показаны на диаграмме.
Пользователи могут получить прогноз для тестовых данных следующим образом:
prediction = mmm . predict (
media = media_data_test ,
extra_features = extra_data_test ,
target_scaler = target_scaler
)
Возвращенный прогноз — это распределения; если требуются точечные оценки, пользователи могут рассчитать их на основе заданного распределения. Например, если data_size
тестовых данных равен 20, number_samples
— 1000, а number_of_chains
— 2, mmm.predict
возвращает 2000 наборов прогнозов с 20 точками данных. Пользователи могут сравнивать распределения с истинным значением тестовых данных и рассчитывать такие показатели, как среднее и медиану.
Пользователи могут получить подробную информацию об оценке параметра следующим образом:
mmm . print_summary ()
Вышеприведенное возвращает среднее значение, стандартное отклонение, медиану и достоверный интервал для каждого параметра. Графики распределения предоставлены:
plot . plot_media_channel_posteriors ( media_mix_model = mmm , channel_names = media_names )
channel_names
определяет имена мультимедиа в каждой диаграмме.
Кривые отклика представлены следующим образом:
plot . plot_response_curves ( media_mix_model = mmm , media_scaler = media_scaler , target_scaler = target_scaler )
Если заданы media_scaler
и target_scaler
используемые для preprocessing.CustomScaler()
, значения носителя и целевого значения будут немасштабированы.
Чтобы получить оценку эффективности СМИ и рентабельности инвестиций, пользователи могут сделать следующее:
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
— оценка эффективности СМИ, а roi_hat
— оценка рентабельности инвестиций. Тогда пользователи могут визуализировать распределение оценки следующим образом:
plot . plot_bars_media_metrics ( metric = media_effect_hat , channel_names = media_names )
plot . plot_bars_media_metrics ( metric = roi_hat , channel_names = media_names )
Для оптимизации мы максимизируем продажи, изменяя входные средства массовой информации так, чтобы суммарная стоимость средств массовой информации была постоянной. Мы также можем разрешить разумные ограничения для каждого медиа-входа (например, +- x%). Мы оптимизируем только по каналам, а не по времени. Для запуска оптимизации необходимы следующие основные параметры:
n_time_periods
: количество периодов времени, которые вы хотите смоделировать (например, оптимизировать на следующие 10 недель, если вы обучали модель на еженедельных данных).budget
который вы хотите выделить на следующие n_time_periods
.n_time_periods
.media_gap
относится к разрыву в медиаданных между концом обучающих данных и началом предоставленного медиафайла вне выборки. Например. если для обучения использовались данные за 100 недель, а прогнозирование начинается через 2 месяца после завершения данных обучения, нам необходимо предоставить 8 недель, недостающих между данными обучения и данными прогнозирования, чтобы преобразования данных (рекламные запасы, перенос и т. д.) могли происходить правильно. .См. ниже и пример оптимизации:
# Run media optimization.
budget = 40 # your budget here
prices = np . array ([ 0.1 , 0.11 , 0.12 ])
extra_features_test = extra_features_scaler . transform ( extra_features_test )
solution = optimize_media . find_optimal_budgets (
n_time_periods = extra_features_test . shape [ 0 ],
media_mix_model = mmm ,
budget = budget ,
extra_features = extra_features_test ,
prices = prices )
Пользователи могут сохранять и загружать модель следующим образом:
utils . save_model ( mmm , file_path = 'file_path' )
Пользователи могут указать file_path
для сохранения модели. Чтобы загрузить сохраненную модель МММ:
utils . load_model ( file_path : 'file_path' )
Чтобы процитировать этот репозиторий:
@software{lightweight_mmmgithub,
author = {Pablo Duque and Dirk Nachbar and Yuka Abe and Christiane Ahlheim and Mike Anderson and Yan Sun and Omri Goldstein and Tim Eck},
title = {LightweightMMM: Lightweight (Bayesian) Marketing Mix Modeling},
url = {https://github.com/google/lightweight_mmm},
version = {0.1.6},
year = {2022},
}
Джин Ю., Ван Ю., Сунь Ю., Чан Д. и Келер Дж. (2017). Байесовские методы моделирования медиа-микса с эффектами переноса и формы. Гугл Инк.
Чан Д. и Перри М. (2017). Проблемы и возможности моделирования медиа-микса.
Сунь Ю., Ван Ю., Джин Ю., Чан Д. и Келер Дж. (2017). Моделирование байесовского иерархического медиа-микса на географическом уровне.
Поскольку LMMM не является официальным продуктом Google, команда LMMM может предложить лишь ограниченную поддержку.
По вопросам методологии обращайтесь к разделу «Ссылки» или к странице часто задаваемых вопросов.
Если у вас возникли проблемы с установкой или использованием LMMM , не стесняйтесь публиковать их на вкладках «Обсуждения» или «Проблемы» репозитория Github. Команда LMMM отвечает на эти вопросы в свободное время, поэтому мы, к сожалению, не можем гарантировать своевременный ответ. Мы также призываем сообщество делиться друг с другом советами и рекомендациями здесь!
Запросы на функции размещайте на вкладке «Обсуждения» репозитория Github. У нас есть внутренний план развития LMMM, но мы обращаем внимание на запросы функций и ценим их!
Сообщения об ошибках публикуйте на вкладке «Проблемы» репозитория Github. Если/когда мы сможем их решить, мы сообщим вам об этом в комментариях к вашему вопросу.
Запросы на включение приветствуются, но нам очень сложно объединить их, поскольку код в этом репозитории связан с внутренними системами Google и должен пройти внутреннюю проверку. Если вы отправите запрос на включение и у нас есть ресурсы, чтобы помочь его объединить, мы свяжемся с вами по этому поводу!
Как создать модель маркетинг-микса с помощью LightweightMMM Марио Фильо.
Как работает Google LightweightMMM и обзор Google LightweightMMM Майка Тейлора.