RigelのR言語メモであーる(R言語だけとは言っていない)

RigelのR言語メモであーる(主にpython)

興味あることや趣味、やったことについて書くよ

{競艇解析} 階層ベイズモデルによる着順予測(1)

競艇の着順を予測するにはどうすればいいだろう。
三連単の120クラス分類として機械学習(SVMやDL)がぱっと思い浮かびます。
ですが、クラス数が多い上にサンプル数もひどくばらばらで、4着以下のデータは全く無視となるので微妙です。
そこで、今回は階層ベイズモデルを使って予測までやってみようと思います。

階層ベイズモデル

今回立てた階層ベイズモデルについて説明します。
階層ベイズモデルはシンプルなモデルから徐々に複雑にするのが良いみたいですね。
なので、例えば場所とか天気はとりあえず無視します。
艇番号は明らかに影響があることが分かっているので考慮します。
以下に仮定をつらつら書きます。

  1. 総レース数を{ \displaystyle G}、レースのインデックスを{ \displaystyle g}とする。{ \displaystyle g=1,...,G}
  2. 全選手数を{ \displaystyle N}、選手のインデックスを{ \displaystyle n}とする。{ \displaystyle n=1,...,N}
  3. 各選手は、強さパラメータ{ \displaystyle \mu_n}をもつ。
  4. 各艇番号は、強さパラメータ{ \displaystyle \mu_c}をもつ。{ \displaystyle c=1,...,6}
  5. 各選手の強さ{ \displaystyle \mu_n}は平均{ \displaystyle 0}標準偏差{ \displaystyle \sigma_{\mu_n}}正規分布に従うと考える。
  6. あるレースでのある選手のパフォーマンス(発揮できた力)は、その選手と艇番号の強さと、共通の勝負ムラ{ \displaystyle \sigma_p}から生成される。
  7. 勝負ムラ{ \displaystyle \sigma_p}は10に固定。
  8. パフォーマンスの大きさ順でレースの着順が決まる。

モデル式は以下です。{ \displaystyle r\ (r=1,...,6)}は着順を表します。
{\begin{eqnarray}
&&Performance[g,r] \sim {\rm Normal}(\mu_n[n[g,r]]+\mu_c[c[g,r]],\sigma_p)\\
&&Performance[g,1]>Performance[g,2]>,...,>Performance[g,6]\\
&&\mu_n[n] \sim {\rm Normal}(0,\sigma_{\mu_n})\\
&&\sigma_p =10
  \end{eqnarray}}
以上です。
グラフィカルモデルで表すと、こんな感じですか。
f:id:strawberry_kyon:20171005163424p:plain:w300
{ \displaystyle Performance}{ \displaystyle P}と表しています。
また、{ \displaystyle P_{g,1}>P_{g,2}>,...,>P_{g,6}}という大小関係があります。
グラフィカルモデルはあまり書かないので苦手です。
記事最下部の一つ目の参考図書を参考に書きました。
このモデルをstanで回します。

stanコード

stanコードは記事最下部の二つ目の参考図書をベースにしました。

data {
  int N;
  int G;
  int<lower=1, upper=N> n[G,6];
  int<lower=1, upper=6> c[G,6];
  int GN;
  int<lower=1, upper=N> nN[GN,6];
  int<lower=1, upper=6> cN[GN,6];
}

parameters {
  ordered[6] pe[G];
  vector[6] peN[GN];
  vector[N] mu_n;
  vector[6] mu_c;
  real<lower=0> s_mun;
}

model {
  for (g in 1:G){
    for(r in 1:6){
      pe[g,r] ~ normal(mu_n[n[g,(7-r)]]+mu_c[c[g,(7-r)]],10);
    }
  }
  for (g in 1:GN){
    for(r in 1:6){
      peN[g,r] ~ normal(mu_n[nN[g,(7-r)]]+mu_c[cN[g,(7-r)]],10);
    }
  }
  mu_n ~ normal(0, s_mun);
}

順序構造をもつパラメータはorderedでいけるみたいです。
新しいデータに対する予測も実装しています。
予測の方法としては、サンプリングするだけです。
疲れたので結果は次回に回します。

参考図書

StanとRでベイズ統計モデリング (Wonderful R)

StanとRでベイズ統計モデリング (Wonderful R)

続きの記事

strawberry-kyon.hateblo.jp