PyMC3:相同输入的不同预测

2024-04-26 10:18:27 发布

您现在位置:Python中文网/ 问答频道 /正文

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

现在,我偶然发现了一件我目前还没有弄明白的事情:第一排和第二排的预测是不同的。如果有一个常数random_seed,我会认为这两个预测是相同的。有人能(i)确认这是预期的行为而不是bug,如果是的话,(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

Tags: 数据sampleimportdataasrandomdatseed
1条回答
网友
1楼 · 发布于 2024-04-26 10:18:27

我不认为这是一个错误,我也不觉得麻烦。由于PyMC3不检查被预测的点是否相同,它将它们分开处理,每个点都从模型中随机抽取。虽然每个PPC绘图(在ppc['y']中的行)对从记录道获取的GLM使用相同的随机参数设置,但是模型仍然是随机的(即,始终存在测量误差)。我想这就解释了区别。你知道吗

如果你增加PPC中的抽签数,你会发现平均数的差异会减小,这与抽样中的差异是一致的。你知道吗

相关问题 更多 >