かけだしデータサイエンティストの日報

最近勉強したデータサイエンティスト的な話題のブログです。

Python で始めるベイズ機械学習入門(3章)

ch3

3章の内容は回帰問題についてベイズ的にモデルを作成する話。

  • 3.1~3.5 までは具体的なモデルを設定する方法(線形回帰、一般化線形回帰のベイズ推定)
  • 3.6~3.7 まではガウス過程回帰をもちいてモデルを仮定しない方法

を取っている。

3.1~3.5(線形回帰、一般化線形回帰のベイズ推定)

ベイズ的にモデルを決める手順
  1. 予測モデルを決める。 y \sim p(y|x,w)
    •  p(y|x,w)をどのような確率分布に設定するのか。(ガウス分布ポアソン分布など)
    •  wの個数をいくつにするのか。(単回帰 or 重回帰)
    • 確率分布のパラメータ(ガウス分布における平均など)と x,wの依存性をどうやって設定するのか。(線形回帰 or 一般化線形回帰)
  2. 確率変数とするモデルパラメータを決めて、事前分布を与える。  w \sim p(w|\alpha)
    • \alphaはハイパーパラメータであるが、ハイパーパラメータも確率変数として扱っているものを階層モデルと呼んでいる。
  3. 予測モデルから尤度関数を計算する。( \prod_{i}^{N} p(y_{i}|x_{i},w))
  4. MCMCなどのサンプリングアルゴリズムを使って事後分布からのサンプリングを行う
  5. サンプリングアルゴリズムから得られたパラメータを用いてモデルとする。
    • 例1: サンプリングしたモデルパラメータの平均値をモデルのパラメータとして設定する。
    • 例2: 各サンプリング結果を用いて予測値  \tilde{y} を計算したあとで予測の平均値を予測モデルとする。


MCMCを使っている目的は、ベイズモデルではモデルパラメータ事後分布からのサンプリング {w}_{\text{sample}}が回帰モデルを決定するために必要だからである。

コードの手順

これはすべて同じである。

  1. 真のモデルを決める。
  2. 真のパラメータを決める。
  3. 観測したデータを生成する。
  4. pymc3 でモデルの設定を行う。
    1. 観測した説明変数のデータを指定。 x
    2. モデルパラメータの事前分布を指定。 {w}
    3. 確率モデルを設定して目的変数のデータを指定。 y
  5. MCMCを用いて事後分布を作成する。(= 事後分布からのサンプリングを行う)
  6. サンプリングしたモデルのパラメータ {w}_{\text{sample}}と新しい説明変数  x_{\text{new}} を用いて予測確率モデルからのサンプリングを行う。

 \displaystyle
y_{\text{new}} \sim  p(y|x_{\text{new}}, {w}_{\text{sample}})

    • パラメータのサンプル値 {w}_{\text{sample}}を複数回サンプリングして、そのたびに y_{\text{new}}もサンプリングしている
    •  y_{\text{new}}はモデルのパラメータのサンプル値 {w}_{\text{sample}}を変えてサンプルしている
    • 複数回サンプリングして得られた y_{\text{new}} の平均値が推定値として利用されている。このプロセスが


\begin{align}
y_{\text{new}|x_{\text{new}}}
& = \int dw  p(y|x_{\text{new}}, w)p(w|D) \\
& \sim\frac{1}{N} \sum^{N} p(y|x_{\text{new}}, w_{\text{sample}})p(w_{\text{sample}}|D)
\end{align}

に対応している。 ここで  Dは観測したデータ点 (x_{i},y_{i})の組,  Nはサンプリングした回数。


3.6~3.7: ガウス過程回帰

ガウス過程回帰ではモデルを決定することはない。なぜならガウス過程回帰では、(イメージとして)すべての関数からなる空間から最も適切そうな関数を探索するからである。すべての関数からなる空間にはあらゆる1次関数やあらゆる指数関数などが含まれており、簡単な式では表せない関数も含まれている。その中から観測したデータ点  (x,y) を説明しうる曲線が平均として現れるようなガウス過程を求めている.詳細については Qiita に解説記事を載せているのでこちらを参照.
qiita.com