对在pymc3中构建分层贝叶斯模型感到困惑

时间:2019-06-06 15:08:52

标签: python pymc3 hierarchical-bayesian

我正在尝试使用多个预测变量构建一个半复杂的PyMC3分层贝叶斯模型。我认为我的问题是由于我对如何正确构建这些模型缺乏了解。我或者遇到以下错误:

  

TypeError:对于compute_test_value,一个输入测试值没有所请求的类型。

将测试值转换为该变量类型时出错:

  

尺寸错误:应为0,形状为1(53724,)。

或者我将N和X的shape参数设置为数据集的长度,并且我用完了RAM(无论如何这似乎是不合适的,所以我并不感到惊讶)。

我最初的策略是建立一个模型,该模型基于预测的索赔数乘以每项索赔的平均成本来预测总成本,其中索赔数和平均数遵循各自的分布(分别为零膨胀负二项式和伽玛值) 。这些都是根据我的数据集中的几个预测变量使用权重的线性组合构建的。我是否从根本上错误地解决了此问题?

代码

from pymc3 import *

with Model() as model:

    # Priors
    psi_N = Uniform('psi_N', lower=0, upper=1)
    alpha_N = HalfCauchy('alpha_N', beta=1)
    sigma_X = HalfCauchy('sigma_X', beta=1)

    mu_N_noise = StudentT('mu_N_noise', nu=3, mu=0, sd=1)
    mu_N_MT = StudentT('mu_N_MT', nu=3, mu=0, sd=1, shape=num_MT)
    mu_N_V = StudentT('mu_N_V', nu=3, mu=0, sd=1, shape=num_V)
    mu_N_G = StudentT('mu_N_G', nu=3, mu=0, sd=1, shape=num_G)
    mu_N_A = StudentT('mu_N_A', nu=3, mu=0, sd=1, shape=num_A)
    mu_N_RA = StudentT('mu_N_RA', nu=3, mu=0, sd=1, shape=num_RA)
    mu_N_TI = StudentT('mu_N_TI', nu=3, mu=0, sd=1, shape=num_TI)
    mu_N_RS = StudentT('mu_N_RS', nu=3, mu=0, sd=1)
    mu_N_MM = StudentT('mu_N_MM', nu=3, mu=0, sd=1)
    mu_N_IP = StudentT('mu_N_IP', nu=3, mu=0, sd=1)
    mu_N_OP = StudentT('mu_N_OP', nu=3, mu=0, sd=1)
    mu_N_P = StudentT('mu_N_P', nu=3, mu=0, sd=1)
    mu_N_O = StudentT('mu_N_O', nu=3, mu=0, sd=1)
    mu_N_Rx = StudentT('mu_N_Rx', nu=3, mu=0, sd=1)

    mu_X_noise = StudentT('mu_X_noise', nu=3, mu=0, sd=1)
    mu_X_MT = StudentT('mu_X_MT', nu=3, mu=0, sd=1, shape=num_MT)
    mu_X_V = StudentT('mu_X_V', nu=3, mu=0, sd=1, shape=num_V)
    mu_X_G = StudentT('mu_X_G', nu=3, mu=0, sd=1, shape=num_G)
    mu_X_A = StudentT('mu_X_A', nu=3, mu=0, sd=1, shape=num_A)
    mu_X_RA = StudentT('mu_X_RA', nu=3, mu=0, sd=1, shape=num_RA)
    mu_X_TI = StudentT('mu_X_TI', nu=3, mu=0, sd=1, shape=num_TI)
    mu_X_RS = StudentT('mu_X_RS', nu=3, mu=0, sd=1)
    mu_X_MM = StudentT('mu_X_MM', nu=3, mu=0, sd=1)
    mu_X_IP = StudentT('mu_X_IP', nu=3, mu=0, sd=1)
    mu_X_OP = StudentT('mu_X_OP', nu=3, mu=0, sd=1)
    mu_X_P = StudentT('mu_X_P', nu=3, mu=0, sd=1)
    mu_X_O = StudentT('mu_X_O', nu=3, mu=0, sd=1)
    mu_X_Rx = StudentT('mu_X_Rx', nu=3, mu=0, sd=1)

    # Deterministic combination of variates using priors to generate the primary variables
    mu_N = Deterministic('mu_N', mu_N_noise + mu_N_MT[MetalTier] + mu_N_V[Variant] + mu_N_G[Gender] + mu_N_A[AgeBand] + mu_N_RA[RatingArea] + mu_N_TI[TobaccoIndicator] +
                         mu_N_RS * RS17 + mu_N_MM * MM + mu_N_IP * IP_Count + mu_N_OP * OP_Count + mu_N_P * Prof_Count + mu_N_O * Other_Count + mu_N_Rx * Rx_Count)
    mu_X = Deterministic('mu_X', mu_X_noise + mu_X_MT[MetalTier] + mu_X_V[Variant] + mu_X_G[Gender] + mu_X_A[AgeBand] + mu_X_RA[RatingArea] + mu_X_TI[TobaccoIndicator] +
                         mu_X_RS * RS17 + mu_X_MM * MM + mu_X_IP * IP_Avg + mu_X_OP * OP_Avg + mu_X_P * Prof_Avg + mu_X_O * Other_Avg + mu_X_Rx * Rx_Avg)

    # Primary variables, Frequency (N) and Severity (X)
    N = ZeroInflatedNegativeBinomial('N', psi=psi_N, mu=mu_N, alpha=alpha_N)#, shape=len(x_train))
    X = Gamma('X', mu=mu_X, sd=sigma_X)#, shape=len(x_train))

    # Model error
    sigma_y = Normal('sigma_y', mu=0, sd=1e3)

    # Expected value
    y_hat = N * X

    # Data likelihood
    y_like = Normal('y_like', mu=y_hat, sd=sigma_y, observed=y_train.values)

我希望该模型能够编译而不会出现错误,也不会耗尽RAM(在64GB的计算机上)。我需要将其分为两个单独的模型吗?

0 个答案:

没有答案