Получил `AttributeError` от `from_pymc3` из ArviZ

#python #bayesian #pymc3 #arviz

Вопрос:

Я изучаю байесовский вывод по книге Bayesian Analysis with Python . Однако при использовании plot_ppc я получил AttributeError и предупреждение

/usr/локальный/Хранилище/миниконда/база/envs/kaggle/lib/python3.9/пакеты сайтов/pymc3/выборка.py:1689: Предупреждение пользователя: параметр выборки меньше, чем nchains раз ndraws, некоторые рисунки и/или цепочки могут не быть представлены в возвращенных предупреждениях о задних прогнозных выборках.предупреждать(

Модель является

 shift = pd.read_csv('../data/chemical_shifts.csv')

with pm.Model() as model_g:
    μ = pm.Uniform('μ', lower=40, upper=70)
    σ = pm.HalfNormal('σ', sd=10)
    y = pm.Normal('y', mu=μ, sd=σ, observed=shift)
    trace_g = pm.sample(1000, return_inferencedata=True)
 

Если бы я использовал следующие коды

 with model_g:
    y_pred_g = pm.sample_posterior_predictive(trace_g, 100, random_seed=123)
    data_ppc = az.from_pymc3(trace_g.posterior, posterior_predictive=y_pred_g) # 'Dataset' object has no attribute 'report'
 

У меня есть объект «Набор данных», у которого нет атрибута «отчет».

Если бы я использовал следующие коды

 with model_g:
    y_pred_g = pm.sample_posterior_predictive(trace_g, 100, random_seed=123)
    data_ppc = az.from_pymc3(trace_g, posterior_predictive=y_pred_g) # AttributeError: 'InferenceData' object has no attribute 'report'
 

Я получил ошибку атрибута: объект «InferenceData» не имеет атрибута «отчет».

Версия ArviZ: 0.11.2 Версия PyMC3: 3.11.2 Версия Aesara/Theano: 1.1.2 Версия Python: 3.9.6 Операционная система: macOS Big Sur Как вы установили PyMC3: conda

Ответ №1:

Вы переходите return_inferancedata=True к pm.sample() , который в соответствии с документацией PyMC3 вернет InferenceData объект, а не MultiTrace объект.

 return_inferencedatabool, default=False

    Whether to return the trace as an arviz.InferenceData (True) object or a MultiTrace (False) Defaults to False, but we’ll switch to True in an upcoming release.
 

from_pymc3 Функция, однако, ожидает MultiTrace объект.

Хорошей новостью является то, что from_pymc3 возвращает InferenceData объект, поэтому вы можете решить эту проблему одним из двух способов:

  1. Самое простое решение-просто удалить from_pymc3 вызовы, так как он возвращается InferenceData , что у вас уже есть из-за return_inferencedata=True .
  2. Установить return_inferencedata=False (вы также можете удалить этот аргумент, но в документации указано , что в будущем он будет установлен по умолчанию True , поэтому для подтверждения в будущем лучше явно установить его значение False ). Это вернет MultiTrace значение, которое можно передать from_pymc3 .

Комментарии:

1. Спасибо тебе, Николас. 2 — е решение сработало. Тем не менее, я все равно хотел бы попробовать 1-е решение.

2. 1 — е решение также сработало. Еще раз спасибо вам !