Запутался в построении иерархической байесовской модели в pymc3 - PullRequest
0 голосов
/ 06 июня 2019

Я пытаюсь построить полусложную байесовскую модель PyMC3 с использованием нескольких предикторов.Я думаю, что моя проблема связана с отсутствием понимания с моей стороны о том, как правильно построить эти модели.Я либо получаю ошибку:

TypeError: Для compute_test_value одно входное тестовое значение не имеет запрошенного типа.

Ошибка при преобразовании тестового значения втип этой переменной:

Неверное количество измерений: ожидается 0, получено 1 с формой (53724,).

или я установил параметр формы для N и X надлина набора данных, и у меня заканчивается ОЗУ (в любом случае это кажется неуместным, поэтому я не удивлен).

Моя первоначальная стратегия заключалась в построении модели, которая прогнозирует общую стоимость на основе умножения прогнозируемых количеств требований.по средней цене за заявку, где количество претензий и средние значения соответствуют их собственным соответствующим распределениям (Ноль-завышенный отрицательный бином и Гамма, соответственно).Каждый из них построен с использованием линейной комбинации весов на основе нескольких предикторов из моего набора данных.Неправильно ли я к этому подхожу?

Код

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)

Я ожидаю, что модель сможет скомпилироваться без ошибок или нехватки ОЗУ (на компьютере с 64 ГБ памяти).).Нужно ли разделить это на две отдельные модели?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...