截至 2024 年 3 月 7 日,Google 發布了新的官方貝葉斯 MMM 版本,名為Meridian 。 Meridian 目前對選定的廣告商的可用性有限。請造訪此網站或聯絡您的 Google 代表以了解更多資訊。一旦 Meridian 全面上市,LMMM 版本將被停用。
文件 • 簡介 • 理論 • 入門 • 參考資料 • 社區焦點
廣告主使用行銷組合建模 (MMM) 來衡量廣告成效並為跨媒體管道的預算分配決策提供資訊。基於聚合數據的測量除了不受最近可能影響歸因建模的生態系統變化(一些與隱私相關)的影響外,還可以跨線上和離線管道進行比較。 MMM 允許您:
採用貝葉斯方法進行 MMM 允許廣告商將先驗資訊整合到建模中,使您能夠:
LightweightMMM 套件(使用 Numpyro 和 JAX 建置)透過提供適當縮放資料、評估模型、優化預算分配和繪製現場使用的常用圖表的功能,幫助廣告商輕鬆建立貝葉斯 MMM 模型。
MMM 量化媒體通路活動與銷售之間的關係,同時控制其他因素。下面顯示了簡化的模型概述,完整的模型在模型文件中列出。 MMM 通常使用每週級別的觀察值來運行(例如,KPI 可以是每週的銷售額),但是,它也可以在每日級別上運行。
其中kpi通常是每個時間段的銷售額或銷售額,
LightweightMMM 可以使用在國家層級聚合的資料(標準方法)運行,也可以使用在地理層級聚合的資料(地方層級方法)運行。
國家級(標準方法)。如果可用資料僅在國家層級進行匯總(例如 KPI 可以是每個時間段的國家銷售額),則此方法是合適的。這是 MMM 中最常用的格式。
地理層面(次國家層級方法)。如果可以在次國家層級匯總資料(例如,KPI 可以是一個國家內每個州每個時間段的銷售額),則這種方法是合適的。與標準方法相比,這種方法可以產生更準確的結果,因為它使用更多的數據點來擬合模型。如果可能的話,我們建議對美國等大國使用次國家級模型。
媒體管道對銷售的影響可能會產生滯後效應,隨著時間的推移慢慢減弱。我們強大的貝葉斯 MMM 模型架構旨在捕捉這種效果,並提供三種不同的方法。我們建議使用者比較所有三種方法並使用最有效的方法。最有效的方法通常是具有最佳樣本外擬合度的方法(這是產生的輸出之一)。以下簡要描述了這三種方法的功能形式,並在我們的模型文件中充分錶達。
推薦安裝lightweight_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。
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 )
如果您的變數有很多 0,您也可以透過非零值的平均值進行縮放。例如,您可以使用 lambda 函數來執行此操作: lambda x: jnp.mean(x[x > 0])
。這同樣適用於成本縮放。
該模型需要媒體資料、額外功能、每個頻道的每個媒體單元的成本以及目標。您還可以傳遞您想要使用的樣本數量以及鏈的數量。
要並行運行多個鏈,使用者需要將numpyro.set_host_device_count
設定為鏈數或可用 CPU 數。
請參閱下面的範例:
# 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。
使用者可以透過以下方式檢查真實 KPI 與預測 KPI 之間的擬合情況:
plot . plot_model_fit ( media_mix_model = mmm , target_scaler = target_scaler )
如果給出用於preprocessing.CustomScaler()
target_scaler
,則目標將不縮放。圖表中顯示了貝葉斯 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 )
如果給出了用於preprocessing.CustomScaler()
media_scaler
和target_scaler
,則媒體值和目標值都將不縮放。
要提取媒體效果和投資回報率估計,用戶可以執行以下操作:
media_effect_hat , roi_hat = mmm . get_posterior_metrics ()
media_effect_hat
是媒體效果估計, roi_hat
是 ROI 估計。然後使用者可以將估計的分佈視覺化如下:
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 週)。n_time_periods
分配的budget
。n_time_periods
的額外功能。media_gap
是指訓練資料結束與給定樣本外媒體開始之間的媒體資料間隙。例如。如果使用 100 週的資料進行訓練,並且在訓練資料完成後 2 個月開始預測,我們需要提供訓練資料和預測資料之間缺失的 8 週,以便正確進行資料轉換(adstock、結轉…) 。請參閱下面的最佳化範例:
# 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
來保存模型。若要載入已儲存的 MMM 模型:
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},
}
Jin, Y., Wang, Y., Sun, Y., Chan, D., & Koehler, J. (2017)。具有殘留和形狀效應的媒體混合建模的貝葉斯方法。 Google公司
陳 D. 與佩里 M. (2017)。媒體混合建模中的挑戰與機會。
孫 Y.、王 Y.、金 Y.、陳 D. 和 Koehler, J. (2017)。地理級貝葉斯分層媒體混合建模。
由於 LMMM 不是 Google 官方產品,因此 LMMM 團隊只能提供有限的支援。
有關方法的問題,請參閱參考資料部分或常見問題頁面。
對於安裝或使用 LMMM 的問題,請隨時將其發佈到 Github 儲存庫的「討論」或「問題」標籤中。 LMMM 團隊會在空閒時間回答這些問題,因此遺憾的是我們無法保證及時回覆。我們也鼓勵社區在這裡互相分享提示和建議!
對於功能請求,請將其發佈到 Github 儲存庫的「討論」標籤。我們有 LMMM 開發的內部路線圖,但請注意並欣賞功能請求!
對於錯誤報告,請將其發佈到 Github 儲存庫的問題標籤。如果/當我們能夠解決這些問題時,我們會在問題評論中告知您。
拉取請求受到讚賞,但我們很難合併,因為此儲存庫中的程式碼連結到 Google 內部系統並且必須通過內部審查。如果您提交拉取請求,並且我們有資源來幫助合併它,我們將就此與您聯繫!
如何使用 LightweightMMM 建立行銷組合模型,作者:Mario Filho。
Google LightweightMMM 的工作原理以及 Mike Taylor 的 Google LightweightMMM 演練。