PyMC3变量标准化/逆标准化处理、先验可视化及预测值还原问题
关于贝叶斯回归变量标准化相关问题的解答
问题1:先验可视化尺度错位的原因与调整方案
现象原因
你现在绘制的先验图出现x轴为标准化weight、y轴为原始height的错位,来自两个代码设定的叠加:
- 横轴你手动指定了
x = np.linspace(-3, 3, 50),这个区间本身就是标准化后变量的典型取值范围(±3倍标准差),所以x轴天然是标准化后的weight尺度 - 纵轴的计算值来自
y = a + b * x,其中a是你模型中定义的alpha参数,该参数的先验Normal(mu=178, sd=20)是完全基于原始身高尺度设置的,所以计算出的y值天然对应原始height的尺度
额外提醒:你当前的模型设定存在逻辑问题:你传入模型的observed变量height是标准化后的height_s,但参数先验却用了原始尺度的数值,会导致模型拟合完全偏离真实分布
调整方案
- 统一为全标准化尺度:把模型中
alpha的先验修改为适配标准化height的取值,比如pm.Normal('alpha', mu=0, sd=1),此时计算出的y值就是标准化后的height,和x轴的标准化weight尺度完全匹配 - 统一为全原始尺度:提前保存原始weight的均值
w_mean和标准差w_std,把横轴的x值逆标准化:x_original = x * w_std + w_mean,绘制时用x_original作为横轴输入,和y轴的原始height尺度匹配
问题2:后验预测值的逆标准化方案
逆转换方法
标准化的通用公式是 标准化值 = (原始值 - 变量均值) / 变量标准差,逆转换只要把公式反过来就行:
# 提前保存的原始height的均值和标准差 height_mean = df1.height.mean() height_std = df1.height.std() # 逆标准化 height_hat_original = height_hat * height_std + height_mean
处理位置选择
两种处理方式都可行,按需选择即可:
- 模型内部处理:如果后续分析全量使用原始尺度,可以直接在模型中添加逆变换逻辑,采样得到的结果直接就是原始尺度,不需要额外事后处理
- 事后处理:如果需要同时使用标准化和原始尺度的结果,事后转换更灵活,也不会增加模型的计算复杂度
标准流程
行业内通用的处理流程是:
- 做标准化操作时,就同步保存每个变量对应的均值、标准差参数,不要后续重新计算避免引入误差
- 可以封装通用的
standardize和inv_standardize工具函数,传入对应参数直接完成转换,降低出错概率
内容的提问来源于stack exchange,提问作者FHTE
相关产品推荐
相关产品推荐

