使用pymc_marketing的DelayedSaturatedMMM预测测试数据遇coord错误求助
解决pymc_marketing DelayedSaturatedMMM预测时"coord values need to be updated"错误
使用DelayedSaturatedMMM构建模型无报错,但用测试集预测时触发PyMC的"data_setter"错误,核心原因是测试数据的时间维度(Date列)未被正确纳入模型的坐标系统,且数据拆分与传递过程存在疏漏。
1. 修正数据拆分逻辑,保留时间列
原代码错误地将Date列从特征中移除,导致模型训练时无法构建正确的时间坐标,测试时自然无法匹配。正确拆分方式如下:
import datetime import pandas as pd from sklearn.model_selection import train_test_split from pymc_marketing.mmm import DelayedSaturatedMMM sampler_config = {"progressbar": True} # 仅移除目标列,保留Date列及所有特征列 X = df_mmm.drop(["A"], axis=1) y = df_mmm["A"] # 按时间顺序拆分(shuffle=False保证时序性) X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, shuffle=False) # 构建训练DataFrame:将目标列加入训练特征,确保Date列存在 train_df = X_train.copy() train_df["Joins"] = y_train # 与模型的target_column参数保持一致
2. 初始化并训练模型
确保模型初始化时传入的train_df包含所有必要列(Date、目标列、渠道列、控制列),然后完成训练:
mmm = DelayedSaturatedMMM( model_config=mynew_model_config, sampler_config=sampler_config, data=train_df, target_column="Joins", date_column="Date", validate_data=True, channel_columns=['Audio_s','Cable_s','CTV_s','Display_s','META_s','Radio_s','Snapchat_s','TikTok_s','TV_s','YouTube_s'], control_columns=['google_trends'], adstock_max_lag=1, yearly_seasonality=2 ) # 训练模型(必须执行此步骤才能进行预测) mmm.fit()
3. 准备测试数据并执行预测
测试数据需包含Date、所有渠道列和控制列,无需包含目标列(若包含也不影响),直接调用predict方法:
# 测试数据保留Date、渠道列、控制列即可 test_df = X_test.copy() # 执行预测 predictions = mmm.predict(test_df)
4. 若仍触发坐标错误的补救方案
如果测试数据的日期范围超出训练数据的坐标范围,需手动更新模型的坐标:
# 获取测试数据的日期索引(根据你的时间粒度调整,比如周/月) test_dates = test_df["Date"].dt.to_period("W") # 更新模型的时间坐标 mmm.model.coords["date"] = test_dates # 重新设置测试数据 with mmm.model: pm.set_data( { "date": test_dates, **{col: test_df[col].values for col in mmm.channel_columns + mmm.control_columns} } ) # 再次执行预测 predictions = pm.sample_posterior_predictive(mmm.idata, model=mmm.model)
内容的提问来源于stack exchange,提问作者Shuvayan Das
相关产品推荐
相关产品推荐

