{競艇解析} 階層ベイズモデルによる着順予測(1)
競艇の着順を予測するにはどうすればいいだろう。
三連単の120クラス分類として機械学習(SVMやDL)がぱっと思い浮かびます。
ですが、クラス数が多い上にサンプル数もひどくばらばらで、4着以下のデータは全く無視となるので微妙です。
そこで、今回は階層ベイズモデルを使って予測までやってみようと思います。
階層ベイズモデル
今回立てた階層ベイズモデルについて説明します。
階層ベイズモデルはシンプルなモデルから徐々に複雑にするのが良いみたいですね。
なので、例えば場所とか天気はとりあえず無視します。
艇番号は明らかに影響があることが分かっているので考慮します。
以下に仮定をつらつら書きます。
- 総レース数を、レースのインデックスをとする。
- 全選手数を、選手のインデックスをとする。
- 各選手は、強さパラメータをもつ。
- 各艇番号は、強さパラメータをもつ。
- 各選手の強さは平均、標準偏差の正規分布に従うと考える。
- あるレースでのある選手のパフォーマンス(発揮できた力)は、その選手と艇番号の強さと、共通の勝負ムラから生成される。
- 勝負ムラは10に固定。
- パフォーマンスの大きさ順でレースの着順が決まる。
モデル式は以下です。は着順を表します。
以上です。
グラフィカルモデルで表すと、こんな感じですか。
はと表しています。
また、という大小関係があります。
グラフィカルモデルはあまり書かないので苦手です。
記事最下部の一つ目の参考図書を参考に書きました。
このモデルを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)
- 作者: 松浦健太郎,石田基広
- 出版社/メーカー: 共立出版
- 発売日: 2016/10/25
- メディア: 単行本
- この商品を含むブログ (8件) を見る