PyMC5贝叶斯回归样本外预测适配问题求助
PyMC5 样本外预测适配方案
修改模型代码,引入 pm.MutableData
核心是将静态特征数据替换为pm.MutableData容器,这样后续可以动态替换为新的样本外数据:
import pandas as pd import pymc as pm # 假设你的特征列名是['f1', 'f2'],target是目标列名 features = ['f1', 'f2'] target = df['target'].values basic_model = pm.Model() with basic_model: # 用MutableData包裹每个特征,方便后续替换数据 feature_vars = {} for f in features: feature_vars[f] = pm.MutableData(f'feature_{f}', df[f].values) response_mean = [] for f in features: ff = feature_vars[f] beta = pm.HalfNormal(f'coeff_{f}', sigma=2) decay = pm.Beta(f'decay_{f}', alpha=3, beta=3) # 修复原代码语法错误:补全括号 contribution = pm.Deterministic(f'contribution_{f}', ff * decay * beta) response_mean.append(contribution) sigma = pm.HalfNormal('sigma', sigma=1) likelihood = pm.Normal("likelihood", mu=sum(response_mean), sigma=sigma, observed=target) # 训练模型(和原代码逻辑一致) with basic_model: idata = pm.sample(return_inferencedata=True, tune=1000)
执行样本外预测
准备好新的特征数据后,通过pm.set_data替换模型中的特征值,再生成预测分布:
# 示例:构造新的样本外数据 new_data = pd.DataFrame({ 'f1': [1.2, 3.4], # 新的f1特征值 'f2': [5.6, 7.8] # 新的f2特征值 }) with basic_model: # 更新MutableData为新数据 pm.set_data({f'feature_{f}': new_data[f].values for f in features}) # 基于训练好的参数生成后验预测样本 idata_pred = pm.sample_posterior_predictive(idata, extend_inferencedata=True) # 查看预测结果:计算每个新样本的平均预测值 print(idata_pred.posterior_predictive['likelihood'].mean(dim=['chain', 'draw']))
关键说明
pm.MutableData是PyMC5中实现动态数据替换的核心容器,替代了PyMC3的pm.Data功能- 替换数据时,新特征的维度需与训练时保持一致(支持单样本或多样本预测)
sample_posterior_predictive生成的是完整的预测分布,而非单一预测值,能反映预测的不确定性
内容的提问来源于stack exchange,提问作者cervus_pc
相关产品推荐
相关产品推荐

