从典型的机器学习角度来看,通常会考虑建模的两个阶段:培训和评分。我希望使用pymc
来实现类似的功能,但我发现它非常困难。
考虑一些简单的事情,例如线性回归。我有一个输入数据矩阵X
和一个目标向量y
。也许我通过确定性函数向X
添加一些新的附加变量,以便X_det
是一个确定性变量。通常情况下,我们定义一个确定性y_hat
,它结合了系数b
和数据X_det
,以及随机观察变量Y_obs
:
@pymc.deterministic
def y_hat(b=b, X=X_det):
return np.dot(X, b)
Y_obs = pymc.Normal(name='Y', mu=y_hat, tau=tau, value=y, observed=True)
我还可以添加一个模拟变量来方便地捕获预测的后验:
Y_sim = pymc.Normal(name='Y_sim', mu=y_hat, tau=tau)
我可以轻松地为此创建模型,运行MCMC以获得系数b
和预测Y_sim
的后验。
但是,有一种简单的方法可以为 new (即未在推理中使用)预测数据生成预测后验,比如X_test
?据我了解,您可以使用numpy.ma.MaskedArray
来实现此目的,您可以在其中连接X
和X_test
(调用此X_concat
)并将y
与某些连接起来虚拟值以匹配X_concat
的长度,并屏蔽虚拟值。但是,这感觉很笨,需要一个固定的X_test
。如果我想得分X_test2
,我将不得不再次运行MCMC采样。由于您已经拥有跟踪数据,因此感觉有些过分。
我想我正在搜索的是某种与pymc.Model
相关联的函数,它接受随机变量的值并返回确定性变量的值。
model = pymc.Model([X_det, Y_obs, Y_sim, b, y_hat, tau, ...])
mcmc = pymc.MCMC(model)
# Score new data:
y_predicted = model.magic_function(X_test, mcmc.trace)
这类似于predict
回归量可用的sklearn
函数。看起来原则上这应该是可能的而不是太困难,但对于我的生活,我找不到一个很好的方法来实现这一目标。但我假设这种情况经常出现。有没有人有想法或建议?