PyMCで作られたコードを、PyMC3に載せ替える形で
映画サイトのレビュー(星マークの0〜5)の妥当性をベイズ推論で評価しようと考えてます。
▼変数の説明
review_rate →これがレビュー(0〜5で投稿されたものの平均)
review_num →レビューの投稿数
これに対して、以下の通りモデルの設計をしました。
python
1##------------------------------- 2# ライブラリのインポート 3##------------------------------- 4import pandas as pd 5import numpy as np 6import matplotlib.pyplot as plt 7import seaborn as sns 8 9##------------------------------- 10# データの取り込み 11 12# review_num:映画作品に対するレビュー数 13# review_rate:映画作品に対する★1.0〜5.0のレビュー評価値の平均 14##------------------------------- 15data = pd.read_csv("movie_review4.csv") 16 17data = data.astype({'review_rate': float, 'review_num': int}) 18 19# x軸にreview_rate、y軸にreview_num 20data.plot(x='review_rate', y='review_num', kind='hist', bins=20) 21 22 23 24##------------------------------- 25# モデルの設計 26##------------------------------- 27 28# レビュー評価の事後分布の軌跡(trace)を取得する 29# レビューの評価は0.0〜5.0のものを、0~1の範囲の一様分布で扱うため、引数で与えられた値に対して調整を加える 30# name は確率変数名 31def get_posterior_review_rate_trace(review_rate, review_num): 32 with pm.Model() as model: 33 _review_rate = pm.Uniform(name='review_rate', lower=0, upper=1) 34 review_rate_0_to_1 = (review_rate - 1) * 0.25 35 print('0~1の範囲でのレビュー評価 : ', review_rate_0_to_1) 36 37 # 連続確率変数のためBeta分布を使用 38 theta = pm.Beta(name='theta', alpha=1, beta=1) 39 observations = pm.Binomial( 40 # nはレビュー数、valueはレビュー評価にレビュー数を乗算した値を指定 41 name='obs', n=review_num, p=theta, 42 value=review_rate_0_to_1 * review_num, 43 observed=True) 44 map_ = pm.MAP([theta, observations]).fit() 45 model2 = pm.Model([theta, observations]) 46 mcmc = pm.MCMC(model2) 47 # MCMCの探索を。第一引数は探索回数。第二引数のバーンインは最初の収束していない一定数は好ましくないので破棄して5000件目~20000件目のサンプリング結果を取得 48 mcmc.sample(20000, 5000) 49 # 探索結果のthetaの確率変数の軌跡を取得 50 trace = mcmc.trace('theta') 51 return trace 52 53##------------------------------- 54# モデルの妥当性を確認 55##------------------------------- 56import pymc3 as pm 57from pymc3 import plots as mcplot 58 59# レビュー評価4.5に対して、取得した軌跡(trace)を引数に渡して事後分布の確認 60trace_of_review_num_2 = get_posterior_review_rate_trace( 61 review_rate=4.5, review_num=2)
しかし、この結果以下のエラーが発生してしまいます。
どうやら、「pm.MAP」と「pm.MCMC」でAttributeErrorが出ているようで、
pymcからpymc3に載せ替えたため、pymc3にはこれらのAttributeはないようです。
この2つの代々手段について、コードレビューをいただける方ご協力よろしくお願いします。
↓エラーコード
AttributeError Traceback (most recent call last)
<ipython-input-8-3c1692da3682> in <module>
1 # レビュー評価4.5に対して、取得した軌跡(trace)を引数に渡して事後分布の確認
2 trace_of_review_num_2 = get_posterior_review_rate_trace(
----> 3 review_rate=4.5, review_num=2)<ipython-input-6-dd3a44a6b085> in get_posterior_review_rate_trace(review_rate, review_num)
43 name='obs', n=review_num, p=theta,
44 observed=review_rate_0_to_1 * review_num)
---> 45 map_ = pm.MAP([theta, observations]).fit()
46
47 with pm.Model() as model:AttributeError: module 'pymc3' has no attribute 'MAP'
あなたの回答
tips
プレビュー