[应用开发] 轻量化MMM的部署应用
[应用开发] 轻量化MMM的部署应用
[应用开发] 轻量化MMM的部署应用 [应用开发] 轻量化MMM的部署应用 Modified August 19, 2025 5623 6001 Code block Bash Copy 绘制参数的后验分布 samples trace = mmm.trace 损失值(预测数值和实际数值的差异,用于辨别模型的准确性,曲线越一致,模型性能越好,极端情况下可能会有模型过拟合的情况,这时候可以通过一些非线性的函数进行处理) 绘制残差图(评估拟合性) 所有单一变量对最终销售的贡献 Baseline预测(在没有任何外因干预的情况下,销售额的走势,这里用的是模拟数据,趋势不准) 所有外因对销售的贡献度 第七步:关联性分析 第六步其实MMM的运行步骤已经运行完了,这块是我另外自己加的,用来检验各项因素之间的关联性 Code block Bash Copy 计算关联性矩阵 correlation matrix = np.corrcoef(media data train.T, target train.T) 提取媒体和销售的相关性 media sales correlation = correlation matrix[:len(media data train[0]), 1] Print correlation matrix and media and sales correlation print("Correlation Matrix:") print(correlation matrix) print("Media and Sales Correlation:") for i, corr in enumerate(media sales correlation): print(f"Media Channel {i+1}: {corr:.2f}") 打印相关性结果 plt.figure(figsize=(10, 8)) plt.imshow(correlation matrix, cmap='coolwarm', interpolation='none') plt.colorbar(label='Correlation Coefficient') plt.title('Correlation Matrix') plt.xticks(range(correlation matrix.shape[1]), ['Media ' + str(i+1) for i in range(correlation matrix.shape[1] 1)] + ['Sales'], rotation=90) plt.yticks(range(correlation matrix.shape[0]), ['Media ' + str(i+1) for i in range(correlation matrix.shape[0] 1)] + ['Sales']) plt.show() 绘制热力图 plt.figure(figsize=(8, 6)) plt.bar(range(len(media sales correlation)), media sales correlation, color='blue') plt.xlabel('Media Channels') plt.ylabel('Correlation with Sales') plt.title('Media Channels vs. Sales Correlation') plt.xticks(range(len(media sales correlation)), ['Media ' + str(i+1) for i in range(len(media sales correlation))]) plt.show() 热力图(画的有点丑,颜色什么的可以自行调 ) 计算相关性,还是因为数据集原因看着有点奇怪,真实场景如果看到负相关性,就要注意是否需要缩减投入或者进行其他决策了。 模型流程主要是在前面几步,后面的可视化和其他分析自由度很高,欢迎各位大佬测试,提出新的优化意见。 Colab上部署的地址,可以直接用来测试: https://colab.research.google.com/drive/1vzMbUuGsaFHlnl9CKFXgxXn8aqWaw60I?usp=sharing 损失值(预测数值和实际数值的差异,用于辨别模型的准确性,曲线越一致,模型性能越好,极端情况下可能会有模型过拟合的情况,这时候可以通过一些非线性的函数进行处理) 绘制残差图(评估拟合性) 所有单一变量对最终销售的贡献 Baseline预测(在没有任何外因干预的情况下,销售额的走势,这里用的是模拟数据,趋势不准) 所有外因对销售的贡献度 第七步:关联性分析 第六步其实MMM的运行步骤已经运行完了,这块是我另外自己加的,用来检验各项因素之间的关联性 热力图(画的有点丑,颜色什么的可以自行调 ) 计算相关性,还是因为数据集原因看着有点奇怪,真实场景如果看到负相关性,就要注意是否需要缩减投入或者进行其他决策了。 模型流程主要是在前面几步,后面的可视化和其他分析自由度很高,欢迎各位大佬测试,提出新的优化意见。 Colab上部署的地址,可以直接用来测试: https://colab.research.google.com/drive/1vzMbUuGsaFHlnl9CKFXgxXn8aqWaw60I?usp=sharing 💡 MMM(Marketing Mix Modelling) 做Marketing的同学应该都不陌生了,可以用大量的微分数据计算一系列因素参数(比如价格,媒体投放,季节气候等)对结果(最通用的是销售额,也可以是其他任何连续性的数据,品牌知名度也可以计算,但考虑品牌知名度的数据可微分性,平行维度的数据对模型的帮助有限)的趋势性影响。 MMM(Marketing Mix Modelling) 做Marketing的同学应该都不陌生了,可以用大量的微分数据计算一系列因素参数(比如价格,媒体投放,季节气候等)对结果(最通用的是销售额,也可以是其他任何连续性的数据,品牌知名度也可以计算,但考虑品牌知名度的数据可微分性,平行维度的数据对模型的帮助有限)的趋势性影响。 为什么需要轻量化的MMM 轻量化MMM(LightweightMMM)是一个由Google开发的轻量级贝叶斯营销组合建模(Bayesian Marketing Mix Modeling, MMM)库。相比传统的MMM,轻量化的产品具备更高的灵活性,更低的训练成本,可以在绝大部分的环境下运行。 https://github.com/google/lightweight mmm?tab=readme ov file theory 贝叶斯定理 概念 贝叶斯定理是概率论中的一个重要概念,它描述了在给定相关证据的情况下,某个假设的概率如何更新。公式为: 其中: • 𝑃(𝐻∣𝐸) 是在证据 𝐸 出现后假设 𝐻 成立的概率,也称为后验概率。 • 𝑃(𝐸∣𝐻) 是在假设 𝐻成立的情况下,证据 𝐸 出现的概率,也称为似然度。 • 𝑃(𝐻) 是在没有考虑任何证据之前,假设 𝐻 成立的概率,也称为先验概率。 • 𝑃(𝐸) 是证据 𝐸E 出现的总概率,也称为边际概率。 结合概率论,我们可以对一定微分状态下的连续数据进行求导,从而预测在特定条件下,数据在未来时间内连贯延续发生的变化趋势(销售增加,增加多少,减少,减少多少,增加或减少的原因等等)。有兴趣的同学可以去系统学习贝叶斯定理和微积分,但运行这个模型暂时不需要。 贝叶斯方法在MMM中的工作流程 1. 定义先验概率:在没有考虑任何营销活动的影响之前,根据历史数据或专家意见,为每个营销渠道设定一个初始的影响概率(先验概率)。 2. 收集数据:收集与营销活动相关的数据,包括不同渠道的投入和相应的销售或品牌知名度结果。 3. 计算似然度:对于每个营销渠道,计算在给定该渠道投入的情况下,观察到的销售或品牌知名度结果的概率。 4. 更新后验概率:使用贝叶斯定理,结合先验概率和似然度,更新每个营销渠道对销售或品牌知名度的影响概率(后验概率)。 5. 模型优化:通过迭代过程,不断调整先验概率和模型参数,以最大化模型对数据的拟合度。 6. 结果解释:最终,模型提供了每个营销渠道对销售或品牌知名度的相对贡献度,帮助营销人员做出更明智的决策。 和反向传播算法(BP)的相似和不同 和反向传播类似,贝叶斯方法也是通过微分求导来实现相关性分析,我之前用反向传播方法尝试过一些简单的模型尝试一样的目标,但反向传播的结果通常不具备可解释性(也就是概率),更多用于模型参数的优化,而概率性预测可以让模型的结果更具备可解释性。 模型实现 下面是分步骤的执行代码,MMM因为做成了python库,因此非常容易部署,下面的代码是我基于colab环境写的,本地部署的话,相应调整文件的调用方式就可以: 第一步:安装运行需要的依赖项 第二步:准备数据集 用于实验的话,可以尝试用模拟数据集: 模拟数据的批次是117,所以跑出来的形状是117组数据,训练集78% = 91, 测试集22% = 26 也可以用自己的数据集。如果本地运行的话,可以让GPT改成遍历本地文件地址 第三步:拆分数据 第四步:数据预处理 由于我们实际的数据绝对值落差会非常大,比如点击率(CTR)通常只有(1%),而媒体花费可能会是上百万,会影响模型对于每个因素的贡献率判断,因此这里会做一个缩放处理(归一化),让每个变量之间的关系是对等的。 第五步:初始化模型 这一步数据集训练是最费时间的,取决于数据量的大小和训练步长 第六步:运算可视化 这里的自由度就比较高了,我举了一些常用的例子供大家参考,也可以根据自己的需求增加自己需要的可视化图表