機械学習 PR

【ベイズ統計モデリング入門】NumPyroで回帰モデルをつくる

NumPyroでベイズ回帰モデルをつくる
記事内に商品プロモーションを含む場合があります

こんにちは。

現役エンジニアの”はやぶさ”@Cpp_Learningです。最近は統計モデリングを勉強しています。

今回は確率的プログラミング言語NumPyroによるベイズ統計モデリングに挑戦したので、備忘録も兼ねて本記事を書きます。

本記事で説明しないこと

本記事ではベイズ統計に関する理論や数式の説明はしません。用語については以下の記事で簡単に紹介していますが…

GMR(Gaussian Mixture Regression)
【ベイズ推定】GMR(Gaussian Mixture Regression)入門 -GMMによるクラスタリングから回帰分析まで-こんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。最近は統計モデリングを勉強しています。 今回はGM...

以下の本で勉強するのがオススメです。

以降から確率的プログラミング言語の概要を説明したあと、NumPyroによる統計モデリングについて、ソースコード付きで紹介します。

確率的プログラミング言語(PPL:Probabilistic Programming Language)とは

深層学習フレームワーク(TensorFlow, PyTorchなど)を活用することで、比較的簡単に深層学習モデルの設計ができるようになり、ディープラーニングの民主化が進みました。

ベイズ統計の分野でも確率的プログラミング言語(PPL:Probabilistic Programming Language)の登場により、モデリング作業の簡素化が整備されつつあります。

そのためディープラーニング同様に、ベイズ統計モデリングの民主化が進むと考えています。

代表的なPPL

PPL(Python用)の有名どころは以下の通りです。

代表的な確率的プログラミング言語

※2020/10/01時点

PPLについて、もっと知りたい人のために、以下のスライドショーをオススメしておきます。

NumPyroとは

『Pythonで作って学ぶ統計モデリング』の記事に感化され、PyMC3を使っていましたが、MCMCの処理が遅くて少し不満でした。

そんなとき NumPyroのMCMC実行が高速という情報をキャッチしました。

他にも以下の NumPyro 関連記事を見つけました。

NumPyro に興味を持ったので、触ってみることにしました。

スポンサーリンク

実践!NumPyroでベイズ回帰モデルをつくる -その1-

以下の記事と同じ問題設定会計総額からチップ額を予測にベイズ回帰モデルを活用します。

sklearnで一般化線形モデル(GLM)
【統計モデリング】scikit-learnが一般化線形モデル(GLM)をサポートしたので使ってみたこんにちは。 現役エンジニアの”はやぶさ”@Cpp_Learningです。仕事でもプライベートでも機械学習で色々やってます。 ...

なお本記事のソースコードはGoogle Colabで動作確認しました。

インストール

最初に以下のコマンドでNumPyroをインストールします。

pip install numpyro

以降からコード書いていきます。

Import

まずはimportから

データ可視化

データセットをロードして、データを可視化します。

可視化

説明変数と目的変数

説明変数:X と 目的変数:Y を定義します。

ベイズ統計モデリング -線形回帰モデル-

今回は X から Y を予測するモデルを以下のように設計しました。

【線形回帰モデル】

y = ax + b

【事前分布】

pm_a ~ Normal(μ=0.0, σ=10.0)
pm_b ~ Normal(μ=0.0, σ=10.0)

【確率モデル】

pm_Y ~ Normal(μ=y, σ=1.0)

ここでは a を傾き、b を切片と呼ぶことにし、y = ax + b で”あてはまり”の良い予測ができると考えました。

また傾き:a、切片:b、予測値:y が正規分布に従うと考えました。

上記のモデルをNumPyroで実装したものが以下です。

MCMCの実行

以下のコードでMCMCの実行と pm_a や pm_b の基本統計量を確認できます。

mean std median 5.0% 95.0% n_eff r_hat
pm_a 0.11 0.01 0.11 0.09 0.12 379.86 1.00
pm_b 0.92 0.16 0.92 0.64 1.17 362.92 1.00

※num_samples=2000なので、pm_a と pm_b のサンプル数が2,000あります

事後分布の可視化

MCMCで算出された推定パラメータ(pm_a、pm_b)は以下のコードで取得できます。

pm_a および pm_b は 事後分布なので、以下のコードで分布を可視化できます。

ベイズ統計モデリング MCMC

推論

以下のコードで X=0, 1, …, 49, 50 のときの Y を予測します。

以下のコードで予測結果を可視化します。

ベイズ統計モデリング MCMC

ベイズ回帰モデルでは、予測に対する不確実性(uncertainty)を表現できる点も魅力の一つです。

つまり『任意の x に対する予測値 y を一意に決めず、上図の緑の範囲に予測値 y が含まれる』という表現ができます。

全ての推定パラメータを使って推論・可視化

推定パラメータ:pm_a, pm_b の全サンプル(今回は2,000サンプル)で推論します。

ベイズ回帰モデル

これも予測に対する不確実性を表現しており、線の数だけ予測候補があることを示しています。

線形回帰モデル

最後に pm_a, pm_b の平均値を採用して、線形回帰モデルをつくります(扱いやすいように関数化しておきます)。

以下のコードでmy_model()による推論および結果の可視化をします。

線形回帰モデル

こうすることで『任意の x に対する予測値 y を一意に決めるモデルを生成』できるため、システムなどに組み込み易くなります。

以上までが【NumPyroでベイズ回帰モデルをつくる -その1-】でした。もう一つベイズ統計モデリングの例を紹介します。

実践!NumPyroでベイズ回帰モデルをつくる -その2-

【その1】と同じ問題設定で、モデルのみを変更します。

ベイズ統計モデリング -ポアソン回帰モデル-

今度は以下のようなモデルを設計しました。

【ポアソン回帰モデル】

y = exp(ax + b)

【事前分布】

pm_a ~Normal(μ=0.0, σ=10.0)
pm_b ~ Normal(μ=0.0, σ=10.0)

【確率モデル】

pm_Y ~ Poisson(μ=Y)

【その1】との違いは y = exp(a*x + b) を採用し、かつポアソン分布に従うと考えた点です。

上記のモデルをNumPyroで実装したものが以下です。

MCMCの実行

あとは【その1】と同じで、MCMCを実行します。

mean std median 5.0% 95.0% n_eff r_hat
pm_a 0.03 0.00 0.03 0.02 0.04 429.94 1.00
pm_b 0.46 0.10 0.46 0.31 0.62 400.91 1.00

コード割愛しますが、事後分布を可視化したものが下図です。

ベイズ統計モデリング MCMC

推論

以下のコードで X=0, 1, …, 49, 50 のときの Y を予測します。

ベイズ統計モデリング MCMC

【その1】同様、予測に対する不確実性(uncertainty)を表現できています。

全ての推定パラメータを使って推論・可視化

推定パラメータ:pm_a, pm_b の全サンプル(今回は2,000サンプル)で推論します。

ポワソン回帰モデル

※ x:会計総額(total_bill), y:チップ額(tip)

xの値が大きいほど、yの予測候補の範囲が広いことが分かります。この予測範囲の広さを「予測結果の自信の無さ」という解釈ができそうです。

例えば、会計総額が小さい場合、チップ額(予測値)の”ばらつき”が小さいです。これを直観的に解釈すると「会計総額が小さい場合、ある程度”決まりきったチップ額”になる」といえそうです。

一方で会計総額が大きくなるにつれて、チップ額(予測値)の”ばらつき”も大きくなります。これは「会計総額が大きい客の中に、気前の良い客が含まれており、線形増加ではないチップ額を支払う場合もある」といえそうです。

ただし、会計総額が大きいときのサンプルが少ないので、モデルは自信のある予測ができない…などの解釈ができそうです。

ポアソン回帰モデル

最後にpm_a, pm_bの平均値を採用して、ポアソン回帰モデル(の関数)をつくり、結果の可視化まで行います。

ポワソン回帰モデル

以上までが【NumPyroでベイズ回帰モデルをつくる -その2-】でした。

まとめ -ベイズ統計モデリング入門-

ベイズ統計モデリングについて勉強し、NumPyroによる実践までした内容をまとめました。

本記事の内容について間違っている箇所があれば、教えて頂けると嬉しいです。

ベイズ統計モデリングは難しいけど、強力な武器になると感じたので、今後も勉強した内容を記事にしたいと考えています。

はやぶさ
はやぶさ
統計モデリングに関する情報共有をしながら、一緒に成長できると嬉しいです。よろしくお願いします。

以下 本記事の前半で紹介したオススメの書籍を改めて載せておきます。

PICK UP BOOKS

  • 数理モデル入門
    数理モデル
  • Jetoson Nano 超入門
    Jetoson Nano
  • 図解速習DEEP LEARNING
    DEEP LEARNING
  • Pythonによる因果分析
    Python