Расчет WAI C для моделей с несколькими функциями правдоподобия с помощью pymc3 - PullRequest
0 голосов
/ 09 апреля 2020

Я пытаюсь предсказать исход футбольных матчей на основе количества забитых голов и использую следующую модель:

with pm.Model() as model:
  # global model parameters
   h = pm.Normal('h', mu = mu, tau = tau)
   sd_a = pm.Gamma('sd_a', .1, .1) 
   sd_d = pm.Gamma('sd_d', .1, .1) 
   alpha = pm.Normal('alpha', mu=mu, tau = tau)

  # team-specific model parameters
   a_s = pm.Normal("a_s", mu=0, sd=sd_a, shape=n)
   d_s = pm.Normal("d_s", mu=0, sd=sd_d, shape=n)

   atts = pm.Deterministic('atts', a_s - tt.mean(a_s))
   defs = pm.Deterministic('defs', d_s - tt.mean(d_s))
   h_theta = tt.exp(alpha + h + atts[h_t] + defs[a_t])
   a_theta = tt.exp(alpha + atts[a_t] + defs[h_t])

  # likelihood of observed data
   h_goals = pm.Poisson('h_goals', mu=h_theta, observed=observed_h_goals)
   a_goals = pm.Poisson('a_goals', mu=a_theta, observed=observed_a_goals)

При выборке модели графики трассировки выглядят нормально.

Впоследствии, когда я хочу вычислить WAI C:

waic = pm.waic(trace, model)

Я получаю следующую ошибку:


----> 1 waic = pm.waic(trace, model)

~\Anaconda3\envs\env\lib\site-packages\pymc3\stats_init_.py in wrapped(*args, **kwargs)
22 )
23 kwargs[new] = kwargs.pop(old)
—> 24 return func(*args, **kwargs)
25
26 return wrapped

~\Anaconda3\envs\env\lib\site-packages\arviz\stats\stats.py in waic(data, pointwise, scale)
1176 “”"
1177 inference_data = convert_to_inference_data(data)
-> 1178 log_likelihood = _get_log_likelihood(inference_data)
1179 scale = rcParams[“stats.ic_scale”] if scale is None else scale.lower()
1180

~\Anaconda3\envs\env\lib\site-packages\arviz\stats\stats_utils.py in get_log_likelihood(idata, var_name)
403 var_names.remove(“lp”)
404 if len(var_names) > 1:
–> 405 raise TypeError(
406 “Found several log likelihood arrays {}, var_name cannot be None”.format(var_names)
407 )

TypeError: Found several log likelihood arrays [‘h_goals’, ‘a_goals’], var_name cannot be None

Есть ли способ рассчитать WAI C и сравнить модели, когда у меня есть две функции правдоподобия в pymc3? (1: голы, забитые хозяевами 2: голы, забитые гостями)

1 Ответ

1 голос
/ 18 апреля 2020

Это возможно, но требует определения того, что вас интересует в прогнозировании, это может быть результатом матча или количеством голов, забитых одной из команд (а не совокупностью, каждый матч даст 2 результата для прогнозирования). ).

Полный и подробный ответ доступен по адресу PyM C discourse .

Здесь я переписываю случай, когда интересующее количество является результатом совпадения, в виде резюме. ArviZ автоматически получит 2 точечных логарифмических вероятностных массива, которые мы должны каким-то образом объединить (например, add, concatenate, groupby ...), чтобы получить один массив. Сложной частью является знание того, какая операция соответствует каждой величине, которая должна оцениваться для каждой модели. В этом конкретном примере прогнозирующая точность результата совпадения может быть рассчитана следующим образом:

dims = {
    "home_points": ["match"],
    "away_points": ["match"],
}
idata = az.from_pymc3(trace, dims=dims, model=model)

Установка затемнения match важна для xarray , как выровнять точечные логарифмические вероятностные массивы, иначе они не будут транслироваться и выровняться нужным образом.

idata.sample_stats["log_likelihood"] = (
    idata.log_likelihood.home_points + idata.log_likelihood.away_points
)
az.waic(idata)
# Output
# Computed from 3000 by 60 log-likelihood matrix
#
#           Estimate       SE
# elpd_waic  -551.28    37.96
# p_waic       46.16        -
#
# There has been a warning during the calculation. Please check the results.

Обратите внимание, что требуется ArviZ> = 0.7.0.

...