使用 PyMC3 和大型数据集的贝叶斯线性回归 - 括号嵌套级别超过最大值且性能低下
Bayesian Linear Regression with PyMC3 and a large dataset - bracket nesting level exceeded maximum and slow performance
我想使用贝叶斯多元线性回归来估计团队运动(例如冰球、篮球或足球)中运动员的力量。为此,我创建了一个矩阵 X,其中玩家作为列,比赛作为行。对于每场比赛,球员条目为 1(球员在主队比赛)、-1(球员在客队比赛)或 0(球员未参加本场比赛)。因变量 Y 定义为两队在每场比赛中的得分差异 (Score_home_team - Score_away_team).
因此,一个赛季的参数数量将相当大(例如,X 由 300 行 x 450 列定义;即 450 个球员系数 + y 轴截距)。当 运行 匹配时,我遇到了一个编译错误:
('Compilation failed (return status=1): /Users/me/.theano/compiledir_Darwin-17.7.0-x86_64-i386-64bit-i386-3.6.5-64/tmpdxxc2379/mod.cpp:27598:32: fatal error: bracket nesting level exceeded maximum of 256.
我试图通过设置来处理这个错误:
theano.config.gcc.cxxflags = "-fbracket-depth=1024"
现在,采样是 运行ning。但是,它太慢了,即使我只取 300 行中的 35 行,采样也不会在 20 分钟内完成。
这是我的基本代码:
import pymc3 as pm
basic_model = pm.Model()
with basic_model:
# Priors for beta coefficients - these are the coefficients of the players
dict_betas = {}
for col in X.columns:
dict_betas[col] = pm.Normal(col, mu=0, sd=10)
# Priors for unknown model parameters
alpha = pm.Normal('alpha', mu=0, sd=10) # alpha is the y-intercept
sigma = pm.HalfNormal('sigma', sd=1) # standard deviation of the observations
# Expected value of outcome
mu = alpha
for col in X.columns:
mu = mu + dict_betas[col] * X[col] # mu = alpha + beta_1 * Player_1 + beta_2 * Player_2 + ...
# Likelihood (sampling distribution) of observations
Y_obs = pm.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
大型数据集的模型实例化在 运行 秒内完成。我使用以下方式进行采样:
with basic_model:
# draw 500 posterior samples
trace = pm.sample(500)
小样本(如9行80列)7分钟内完成抽样。然而,时间随着样本量的增加而大幅增加。
有什么建议可以让我在可行的时间内将贝叶斯线性回归 运行 吗?使用 PyMC3 是否可以解决这些问题(记得我遇到过括号嵌套错误)吗?我在最近的一份出版物中看到,这种分析在 R 中是可行的 (https://arxiv.org/pdf/1810.08032.pdf)。因此,我想它也应该以某种方式与 Python 3.
一起工作
感谢任何帮助!
消除 for
循环应该可以提高性能,并且还可以解决您报告的嵌套问题。 Theano TensorVariables 和派生自它们的 PyMC3 随机变量已经是多维的并且支持线性代数运算。尝试将您的代码更改为
beta = pm.Normal('beta', mu=0, sd=10, shape=X.shape[1])
...
mu = alpha + pm.math.dot(X, beta)
...
如果您需要为 mu
and/or sd
指定不同的先验值,这些参数接受 theano.tensor.as_tensor_variable() 接受的任何内容,因此您可以传递列表或 numpy 数组.
我强烈建议您熟悉 theano.tensor and pymc3.math 操作,因为有时您必须使用这些操作来正确操作随机变量,并且通常它会导致更高效的代码。
我想使用贝叶斯多元线性回归来估计团队运动(例如冰球、篮球或足球)中运动员的力量。为此,我创建了一个矩阵 X,其中玩家作为列,比赛作为行。对于每场比赛,球员条目为 1(球员在主队比赛)、-1(球员在客队比赛)或 0(球员未参加本场比赛)。因变量 Y 定义为两队在每场比赛中的得分差异 (Score_home_team - Score_away_team).
因此,一个赛季的参数数量将相当大(例如,X 由 300 行 x 450 列定义;即 450 个球员系数 + y 轴截距)。当 运行 匹配时,我遇到了一个编译错误:
('Compilation failed (return status=1): /Users/me/.theano/compiledir_Darwin-17.7.0-x86_64-i386-64bit-i386-3.6.5-64/tmpdxxc2379/mod.cpp:27598:32: fatal error: bracket nesting level exceeded maximum of 256.
我试图通过设置来处理这个错误:
theano.config.gcc.cxxflags = "-fbracket-depth=1024"
现在,采样是 运行ning。但是,它太慢了,即使我只取 300 行中的 35 行,采样也不会在 20 分钟内完成。
这是我的基本代码:
import pymc3 as pm
basic_model = pm.Model()
with basic_model:
# Priors for beta coefficients - these are the coefficients of the players
dict_betas = {}
for col in X.columns:
dict_betas[col] = pm.Normal(col, mu=0, sd=10)
# Priors for unknown model parameters
alpha = pm.Normal('alpha', mu=0, sd=10) # alpha is the y-intercept
sigma = pm.HalfNormal('sigma', sd=1) # standard deviation of the observations
# Expected value of outcome
mu = alpha
for col in X.columns:
mu = mu + dict_betas[col] * X[col] # mu = alpha + beta_1 * Player_1 + beta_2 * Player_2 + ...
# Likelihood (sampling distribution) of observations
Y_obs = pm.Normal('Y_obs', mu=mu, sd=sigma, observed=Y)
大型数据集的模型实例化在 运行 秒内完成。我使用以下方式进行采样:
with basic_model:
# draw 500 posterior samples
trace = pm.sample(500)
小样本(如9行80列)7分钟内完成抽样。然而,时间随着样本量的增加而大幅增加。
有什么建议可以让我在可行的时间内将贝叶斯线性回归 运行 吗?使用 PyMC3 是否可以解决这些问题(记得我遇到过括号嵌套错误)吗?我在最近的一份出版物中看到,这种分析在 R 中是可行的 (https://arxiv.org/pdf/1810.08032.pdf)。因此,我想它也应该以某种方式与 Python 3.
一起工作感谢任何帮助!
消除 for
循环应该可以提高性能,并且还可以解决您报告的嵌套问题。 Theano TensorVariables 和派生自它们的 PyMC3 随机变量已经是多维的并且支持线性代数运算。尝试将您的代码更改为
beta = pm.Normal('beta', mu=0, sd=10, shape=X.shape[1])
...
mu = alpha + pm.math.dot(X, beta)
...
如果您需要为 mu
and/or sd
指定不同的先验值,这些参数接受 theano.tensor.as_tensor_variable() 接受的任何内容,因此您可以传递列表或 numpy 数组.
我强烈建议您熟悉 theano.tensor and pymc3.math 操作,因为有时您必须使用这些操作来正确操作随机变量,并且通常它会导致更高效的代码。