jiku log

データサイエンスの核心を掴む : 学びと発見の記録

馬場ベイズ本(「ベイズ統計モデリングによるデータ分析入門」)をNumPyroで実装 読書メモ一覧

はじめに

私は,製造業のデータサイエンス組織で管理職をしている。業務でデータ分析プロジェクトを推進する立場にいるが,推定結果の不確実性を扱うことができるベイズ統計学は,意思決定において有用であると考えられる。
ベイズ統計学や統計モデリングについて改めて学ぶために,当分野において名著として名高い,馬場真哉 著 「RとStanではじめる ベイズ統計モデリングによるデータ分析入門」 を読むことにした。

https://www.kspub.co.jp/book/detail/images/9784065165362_obi_w.jpg

NumPyroを用いた実装

本書は,プログラミングや統計モデリングにR言語とStanが用いられているが,ブログ筆者はPythonユーザであるため,生成AIと相談しながらPythonで実装することとした。
ベイジアンモデリングを扱うためのPythonライブラリとして

などが挙げられるが,今回はNumPyroを主に用いることとした。
num.pyro.ai


NumPyroの特徴は,以下のようなものが挙げられる(参考:「Pythonではじめるベイズ機械学習入門」を読む ~第2章 確率的プログラミング言語(PPL)③~ - jiku log)

  • バックエンドがJAXであり,高速であると言われている。
  • NumPy互換性のある配列や演算を使って確率モデリングを書くことが可能である。
  • HMC法を改善したNUTS(No-U-Turn Sampler)が実装されている。
    • NUTSアルゴリズムがJAXのJITコンパイルに対応できるように工夫されているので,大規模なデータセットに対して高速なMCMCサンプリングが可能になる。
  • 基本的な変分推論法の実装と,自動微分変分推論(ADVI)が用意されている。

馬場ベイズ本の実装を通じて感じたNumPyroのメリット

NumPyroのメリット:Pythonの各種ライブラリとの親和性が高い

データ分析業務に従事する人の中には,Pythonユーザが多い。NumPyroはPythonのライブラリであるため,Pythonの機械学習パイプラインに組込みやすい。
たとえば

df = pd.read_csv("data.csv")

x = jnp.array(df["x"].values)
y = jnp.array(df["y"].values)

のように,Pythonコード上で読み込んだ変数を,NumPyro用に変換するして使うことができる。


一方でR・Stanを用いる場合は,StanのコードとRのコードが別々に書かれており,RのコードからStanのコードを呼び出すことになる。
この構成では,デバッグをするときなどに,異なる種類のコード間を行ったり来たりする必要があるので,不便になると考えられる。

NumPyroのメリット:統計モデルの自由度が高い

最初のメリットともかかわっているが,NumPyroの統計モデルはPythonの関数として記述するため,Pythonの各種関数を使うことができる。


たとえば,馬場ベイズ本をNumPyroで実装 ~第5部・第3章 状態空間モデルによる予測~ - jiku log で扱ったように,統計モデルの中にif文を組み込むことができる。

    # 将来予測
    if pred_term > 0:
        ... 

そのため,処理内容を関数の引数によって切り替えることも可能であるし,どのような処理が書かれているか理解しやすい。

NumPyroのメリット:機能が豊富である

NumPyro documentation — NumPyro documentationのサイトを見ると,チュートリアルや応用例がグラフィカルに紹介されており,試してみたいことに近いことを探しやすくなっている。
今回はあまりNumPyroの機能に立ち入れていないが,今後試したい機能が出てきたときに便利である。

NumPyroの応用例(https://num.pyro.ai/en/stable/ を引用)

R・Stanのメリット:可視化機能が強い

たとえばRでは,marginal_effectsという関数が準備されていて,可視化周りのコードがかなり便利だったが,Pythonでは関数を手組みする必要があった。

R・Stanのメリット:収束判定の説明が充実している

MCMCを用いていると,収束判定が気になる。また収束しなかったときやWarningが出たときの対処方法も知りたくなる。

Stanにおいては,How to Diagnose and Resolve Convergence Problemsというサイトにおいて,収束の判断機能について説明されている。NumPyroを使う場合でも,これらの観点は役立つと考えられる。
mc-stan.org

読書メモ一覧

第2部 【基礎編】RとStanによるデータ分析

第3部 【実践編】一般化線形モデル

第2章 単回帰モデル
第3章 モデルを用いた予測
第4章 デザイン行列を用いた一般化線形モデルの推定
第7章 正規線形モデル
第8章 ポアソン回帰モデル
第9章 ロジスティック回帰モデル
第10章 交互作用

第4部 【応用編】一般化線形混合モデル

第1章 階層ベイズモデルと一般化線形混合モデルの基本
第2章 ランダム切片モデル
第3章 ランダム係数モデル

第5部 【応用編】状態空間モデル

第2章 ローカルレベルモデル
第3章 状態空間モデルによる予測と補間
第4章 時変係数モデル
第5章 トレンドの構造
第6章 周期性のモデル化
第7章 自己回帰モデルとその周辺
第8章 動的一般化線形モデル:二項分布を仮定した例
第9章 動的一般化線形モデル:ポアソン分布を仮定した例