اعتبارًا من 7 مارس 2024، أصدرت Google إصدارًا رسميًا جديدًا لـ MMM من Bayesian يسمى Meridian . يتوفر Meridian حاليًا بشكل محدود لمعلنين محددين. يرجى زيارة هذا الموقع أو الاتصال بممثل Google للحصول على مزيد من المعلومات. سيتم إيقاف إصدار LMMM بمجرد وصول Meridian إلى التوفر العام.
المستندات • المقدمة • النظرية • البدء • المراجع • أضواء على المجتمع
يستخدم المعلنون نموذج المزيج التسويقي (MMM) لقياس فعالية الإعلان وإبلاغ قرارات تخصيص الميزانية عبر القنوات الإعلامية. يسمح القياس المستند إلى البيانات المجمعة بإجراء مقارنة عبر القنوات عبر الإنترنت وغير المتصلة بالإنترنت بالإضافة إلى عدم تأثره بالتغيرات الأخيرة في النظام البيئي (بعضها يتعلق بالخصوصية) والتي قد تؤثر على نماذج الإحالة. MMM يسمح لك بما يلي:
إن اتباع نهج بايزي في MMM يسمح للمعلن بدمج المعلومات السابقة في وضع النماذج، مما يسمح لك بما يلي:
تساعد حزمة LightweightMMM (التي تم إنشاؤها باستخدام Numpyro وJAX) المعلنين على إنشاء نماذج Bayesian MMM بسهولة من خلال توفير الوظائف لقياس البيانات بشكل مناسب وتقييم النماذج وتحسين مخصصات الميزانية ورسم الرسوم البيانية الشائعة المستخدمة في هذا المجال.
يحدد MMM العلاقة بين نشاط قناة الوسائط والمبيعات، مع التحكم في العوامل الأخرى. يتم عرض نظرة عامة مبسطة على النموذج أدناه ويتم عرض النموذج الكامل في وثائق النموذج. يتم عادةً تشغيل MMM باستخدام ملاحظات المستوى الأسبوعي (على سبيل المثال، يمكن أن يكون مؤشر الأداء الرئيسي هو المبيعات في الأسبوع)، ومع ذلك، يمكن أيضًا تشغيله على المستوى اليومي.
حيث أن مؤشر الأداء الرئيسي هو عادة حجم أو قيمة المبيعات لكل فترة زمنية،
يمكن تشغيل LightweightMMM إما باستخدام البيانات المجمعة على المستوى الوطني (النهج القياسي) أو باستخدام البيانات المجمعة على المستوى الجغرافي (النهج الهرمي دون الوطني).
المستوى الوطني (النهج القياسي). يعتبر هذا الأسلوب مناسبًا إذا كانت البيانات المتاحة مجمعة فقط على المستوى الوطني (على سبيل المثال، يمكن أن يكون مؤشر الأداء الرئيسي عبارة عن مبيعات وطنية لكل فترة زمنية). هذا هو التنسيق الأكثر شيوعًا المستخدم في MMMs.
المستوى الجغرافي (النهج الهرمي دون الوطني). يعد هذا الأسلوب مناسبًا إذا كان من الممكن تجميع البيانات على المستوى دون الوطني (على سبيل المثال، يمكن أن يكون مؤشر الأداء الرئيسي هو المبيعات لكل فترة زمنية لكل ولاية داخل البلد). يمكن أن يؤدي هذا الأسلوب إلى نتائج أكثر دقة مقارنةً بالطريقة القياسية لأنه يستخدم المزيد من نقاط البيانات لملاءمة النموذج. نوصي باستخدام نموذج المستوى دون الوطني للبلدان الأكبر مثل الولايات المتحدة إن أمكن.
من المحتمل أن يكون لتأثير قناة الوسائط على المبيعات تأثير متأخر يتضاءل ببطء بمرور الوقت. تم تصميم بنية نموذج Bayesian 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. يجب أن يكون للمبيعات والوسائط حد أدنى يبلغ 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 للقيام بذلك: 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
: عدد الفترات الزمنية التي تريد محاكاتها (على سبيل المثال، قم بالتحسين للأسابيع العشرة القادمة إذا قمت بتدريب نموذج على البيانات الأسبوعية).budget
التي تريد تخصيصها للفترات n_time_periods
التالية.n_time_periods
التالية.media_gap
إلى فجوة بيانات الوسائط بين نهاية بيانات التدريب وبداية عينة الوسائط المقدمة. على سبيل المثال. إذا تم استخدام 100 أسبوع من البيانات للتدريب وبدأ التنبؤ بعد شهرين من انتهاء بيانات التدريب، فنحن بحاجة إلى توفير الأسابيع الثمانية المفقودة بين بيانات التدريب وبيانات التنبؤ حتى يمكن إجراء تحويلات البيانات (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},
}
جين، واي.، وانغ، واي.، صن، واي.، تشان، دي.، وكوهلر، جي. (2017). الطرق البايزية لنمذجة مزيج الوسائط مع تأثيرات الترحيل والشكل. شركة جوجل
تشان، د.، وبيري، م. (2017). التحديات والفرص في نمذجة مزيج الوسائط.
صن، واي، وانغ، واي، وجين، واي، وتشان، دي، وكوهلر، جيه (2017). نمذجة مزيج الوسائط الهرمية بايزي على المستوى الجغرافي.
نظرًا لأن LMMM ليس أحد منتجات Google الرسمية، فإن فريق LMMM لا يمكنه تقديم سوى دعم محدود.
للأسئلة حول المنهجية ، يرجى الرجوع إلى قسم المراجع أو إلى صفحة الأسئلة الشائعة.
بالنسبة إلى المشكلات المتعلقة بتثبيت LMMM أو استخدامه ، فلا تتردد في نشرها في علامات التبويب "المناقشات" أو "المشكلات" في مستودع Github. يجيب فريق LMMM على هذه الأسئلة في وقت فراغنا، لذلك لا يمكننا للأسف ضمان الرد في الوقت المناسب. نحن أيضًا نشجع المجتمع على مشاركة النصائح والإرشادات مع بعضهم البعض هنا!
بالنسبة لطلبات الميزات ، يرجى نشرها في علامة تبويب المناقشات في مستودع Github. لدينا خريطة طريق داخلية لتطوير LMMM ولكننا نولي اهتمامًا لطلبات الميزات ونقدرها!
بالنسبة لتقارير الأخطاء ، يرجى نشرها في علامة تبويب المشكلات في مستودع Github. إذا/عندما نتمكن من معالجتها، سنخبرك بذلك في التعليقات على مشكلتك.
نقدر طلبات السحب ولكن يصعب علينا دمجها نظرًا لأن الكود الموجود في هذا المستودع مرتبط بأنظمة Google الداخلية ويجب أن يجتاز المراجعة الداخلية. إذا قمت بإرسال طلب سحب ولدينا موارد للمساعدة في دمجه، فسنتواصل معك بخصوص هذا الأمر!
كيفية إنشاء نموذج مزيج تسويقي باستخدام الوزن الخفيف MMM بقلم ماريو فيلهو.
كيف يعمل Google LightweightMMM وشرح تفصيلي لـ LightweightMMM من Google بقلم مايك تايلور.