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 中的抽奖次数,您会发现均值差异减小,这与抽样差异一致。
在 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 中的抽奖次数,您会发现均值差异减小,这与抽样差异一致。