PyMC3:相同输入的不同预测

PyMC3: Different predictions for identical inputs

在 PyMC3 中,通过 set_data() 传递的单个新观察值目前无法由 sample_posterior_predictive() 正确处理,在这种情况下它会预测训练数据(参见 #3640)。因此,我决定在我的输入数据中添加第二个与第一行相同的人工行,以绕过此行为。

现在,我偶然发现了一些我目前无法理解的东西:第一行和第二行的预测不同。对于常量 random_seed,我本以为这两个预测是相同的。任何人都可以 (i) 确认这是预期的行为而不是错误,如果是这样,(ii) 解释为什么 sample_posterior_predictive() 为同一个输入数据创建不同的结果?

这是一个基于鸢尾花数据集的可重现示例,其中花瓣宽度和长度分别用作预测变量和响应变量,除最后一行以外的所有内容都用于训练。该模型随后针对最后一行进行测试。 pd.concat()用于复制测试数据框的第一行以规避上述错误。

import seaborn as sns
import pymc3 as pm
import pandas as pd
import numpy as np


### . training ----

dat = sns.load_dataset('iris')
trn = dat.iloc[:-1]

with pm.Model() as model:
    s_data = pm.Data('s_data', trn['petal_width'])
    outcome = pm.glm.GLM(x = s_data, y = trn['petal_length'], labels = 'petal_width')
    trace = pm.sample(500, cores = 1, random_seed = 1899)


### . testing ----

tst = dat.iloc[-1:]
tst = pd.concat([tst, tst], axis = 0, ignore_index = True)

with model:
    pm.set_data({'s_data': tst['petal_width']})
    ppc = pm.sample_posterior_predictive(trace, random_seed = 1900)

np.mean(ppc['y'], axis = 0)
# array([5.09585088, 5.08377112]) # mean predicted value for [first, second] row

我不认为这是一个错误,我也不觉得它有什么问题。由于 PyMC3 不检查预测的点是否相同,它会分别对待它们,并且每个点都会从模型中随机抽取。虽然每个 PPC 抽取(ppc['y'] 中的行)都对从迹线中获取的 GLM 使用相同的随机参数设置,但模型仍然是随机的(即始终存在测量误差)。我认为这解释了差异。

如果增加 PPC 中的抽奖次数,您会发现均值差异减小,这与抽样差异一致。