機械学習で競馬予想をしてみた系のまとめ

機械学習を使って競馬予想をすることがここ数年で流行ってきていると感じていて、そんな中、私も機械学習を使って競馬予想をしてみたくて、Qiitaやnote等の記事を読み漁っていました。そして実際に自分でモデルを作成し競馬予測していますが、今後さらに精度を高めるために、どのような特徴量エンジニアリング、モデル作成などが有効で新規性があるのか、どんなものが儲かる（競馬で言うところ回収率に貢献する）のかを調べるために、記事のまとめを書いてみました。私の備忘録代わりでもあります。
ここでのまとめで頭を整理して自分のモデル作成の記事を書きたいと考えています。

リサーチ能力が乏しい私がまとめたものなので、ここで紹介した他に有益な記事、面白い記事等があればコメントなどで教えて欲しいです。

#最初に読んだもの
###AlphaImpactさん「開発者ブログ」「発表文献」
https://alphaimpact.jp/development/

本当の最初、初心者だった自分にとって開発者ブログの理論記事シリーズはとても競馬のことと機械学習のことに対して勉強になりました
開発者ブログだけでなく、発表文献においても競馬における機械学習はどうすべきかの方針の勉強になりました。


###stockedgeさん「競馬の解析をガチでやったら回収率が100%を超えた件」
http://stockedge.hatenablog.com/entry/2016/01/17/180919

これも最初の方に読み、方針付け、モチベ向上につながった記事。
扱ってる内容としては、「オッズの歪み」「穴馬バイアス」「馬齢の歪み」から「おいしさ指数」を計算するモデルの作成をされています。
この「おいしさ指数」がここでも[卍氏の本](https://www.amazon.co.jp/dp/4895958809/)でもぼかして書かれているので、これを考えて計算するモデルが作れれば、私でも回収率100％越えが...！とやる気に。

#同様にすでに成果があり予想が公開されているもの
###SIVAさん
https://siva-ai.com/
[人工知能学会で「アンサンブル学習を用いた競馬予測」の発表をしてきたまとめ](https://qiita.com/nami73bnami73/items/5b213cb69d49222e75ec)

###松風さん
http://matsukaze.ai/

このあたりを見ていると夢があってモチベーションが向上する。私も当てたい...！

#データスクレイピング系

###stockedgeさん「netkeiba-scraper」
ここでもstockedgeさんのスクレイピングを最初に参考にしました。
[競馬の予測をガチでやってみた](http://stockedge.hatenablog.com/entry/2016/01/03/103428)
この界隈では有名（と勝手に思ってます）なスクレイピングのコード。とてもお世話になりました。
公開されてすでに5年近く経っているので、Qiitaで最近でも動くように記事が書かれています。
[netkeiba-scraperが2019年6月現在動くかの話(Ubuntu 18.04.2 LTS)](https://qiita.com/dk4130523/items/2c13dd713e8a84693aa9)
[Macでnetkeiba-scraperを使って、競馬データベースをスクレイピングする](https://qiita.com/yosshi4486/items/7b7516869689e547c39b)

（ただ私にはスクレイピング能力がなくプログラムの修正に時間がかかることが多かったので、今では月額料金を払いcsvをダウンロードする方法に変更しています。）

###その他のスクレイピング系
[機械学習用に競馬のデータをMySQLに用意する](https://qiita.com/t-izaki/items/5006eab22f0bd5c81ed4)
[競馬データをスクレイピングしてみた](https://qiita.com/Octoparse_Japan/items/49c763ccfe2bdbd03a31)
[Pythonで競馬サイトWebスクレイピング](https://qiita.com/Mokutan/items/89c871eac16b8142b5b2)

競馬ではないけど、Goolge Colaboratoryをよく使うので、参考にしました。
[ColaboratoryでSeleniumが使えた：JavaScriptで生成されるページも簡単スクレイピング](https://qiita.com/ftoyoda/items/fe3e2fe9e962e01ac421)

#データエンジニアリング系
次はデータへの愛を感じられる記事のまとめ。

###【競馬】競走馬の強さを数値化してみた
https://qiita.com/katsuomi/items/0c89b7c1dd29abfaeb1d
・Bradley-Terryモデルで個々の馬の強さを数値化。

個々の強さという観点からはQiitaじゃなくGoogleで検索すると色々と出てきます。
私が初めに見つけたのは馬券とポートフォリオ関係で調べているときで、そこからBTモデルの存在を知りました。

###有馬記念を予想する
https://qiita.com/___uhu/items/6da27e5ab4f7889a589c
・BTモデルと同様のElo rating で強さの数値化されています。

###【データ分析入門】競馬の法則♬
https://qiita.com/MuAuan/items/92e834b0934e3ffd9343
・人気と着順の関連付けに何か法則がないかの分析がされています。フラクタル？

###python初心者、競馬歴1年未満でも３連単を当てることができました。
https://qiita.com/Fuji-race/items/99927ee048d58e52deee
・上り3ハロンを重要視し、分析がされています。

###競馬市場の「本命-大穴バイアス」をロジスティック回帰で観測してみる
https://qiita.com/Kotaro_Nishiyama/items/7c88bc5bcad2b5dc1d28
・stockedgeさんも触れていた大穴バイアスについての分析がされています。
大穴に過剰に人気が集まるから本命のオッズが多少はあがって狙い目になる？

###西田式スピード指数
http://www.rightniks.ne.jp/index.php?action=whatspidx_contents&name=sikumi
言わずと知れたスピード指数。これを特徴量に使わないのはもったいないかも？

###競馬必勝法をプログラム化
https://qiita.com/naonao_py/items/019b15876e3ef02d92f2
・データ分析というよりは、馬券購入の際の買い目選択での考察になります。
合成オッズと単体のオッズが逆転するときにどう組み合わせるか。
ポートフォリオ的なリスク分散、モデル作成し予測値（例えば3着指数や1位確率など）を用いればさらにリスクヘッジができる？


ここからは予測モデル作成に何を使うかで分けてまとめます。
#ディープラーニング系
###ディープラーニングさえあれば、競馬で回収率100%を超えられる
https://qiita.com/yossymura/items/334a8f3ef85bff081913

ちょっと前からすごいLGTM数を稼いでて、Qiita検索で「競馬」のLGTM数順でトップに。
内容としては、
・targetを「3着以内に入るかどうか（3着指数）」の分類
・オッズと3着指数のバランスで買い目の選択
・購入買い目は少ない（約2年で購入数99）

そしてこの記事に対して違う人による検証記事もとても参考になります。

###【検証】ディープラーニングがあるからといって、競馬で回収率100%を簡単に超えられるわけではない
https://qiita.com/kscntt/items/3f215a945c32a2bbcd3c

データへの愛がとてつもなく大事であることを痛感しました。ここで行われている検証は、私が作ってる他のプログラムにおいても注意すべき・検証すべきことだな...と肝に銘じています。

・モデルの検証。ディープラーニングだけじゃなく、ロジスティック回帰、ランダムフォレストなどでも検証してみる。
・データの1つ1つの中身まで見る。もしデータ破棄するときはデータに対して誠実に愛を持って判断する。
・未来のデータを判断基準に予測前のデータセットの処理をしてはいけない。
・作成したモデルに対して1つのtestデータだけでなく、様々なデータセットで試して評価する。
・儲からなくても競馬は楽しい（すごく大事）。
（またこの記事はコメントでも有益な議論がされています。）

###その他
[データ収集からディープラーニングまで全て行って競馬の予測をしてみた](https://qiita.com/kami634/items/55e49dad76396d808bf5)
[大井競馬で帝王賞を機械学習で当てた話](https://qiita.com/ishizakiiii/items/3b894b6e987fdf87093e)
[金儲けしたい一心で競馬ドシロウトが競馬の予想を機械学習でチャレンジした](https://qiita.com/cohki0305/items/dc59cc4bfdc63fa16a65)

#決定木系

[競馬予想　機械学習(LightGBM)で回収率100%超えたと思ったら、やらかしてた話](https://qiita.com/gara_gara/items/3e099c24280d772e7086)
やらかしてはいるけれどとても参考になりました。私もLightGBMを使ってモデル作成をしています。
・targetを走破タイムにしている。
・評価関数と回収率については同じことを悩んでました
・モデル作成後のデータ分析も詳しく参考になる。


[LightGBMで3着以内に入る馬を予測してみた
](https://qiita.com/dijzpeb/items/66a6ea1a87bf75b9b05e)
・スクレピングから予想まで動画解説があるので初めて作るって人にはすごく良いと思います。

決定木系と書きつつ、あまり記事が見つけられずというかLightGBMを使ったものしか見つけられませんでした。
私もLightGBMをつかってモデル作成しているので、近日中に記事を書きたいと思っています。

#最後に私見
色々と記事を漁って試してみたいことがどんどん追加されました。LightGBMは（私の勝手なイメージですが）使える使えないの判断せずにとりあえず特徴量を入れるだけ入れればモデル様が勝手に判断してくれるので、例えばデータ分析系の記事なんかは全て試して特徴量として入れるだけでかなり精度が上がるのではないかと思います。
またここで取り上げた手法たちをアンサンブルすれば、これも精度向上に貢献すると思うので、LightGBMだけじゃなくディープラーニング系も取り入れたい。。

そしてモデル作成後、出てきた予測値を使ってどうやって馬券を選択するか、どう組み合わせるかの議論は少ない（私が調べ切れていない）ので、最適化問題で馬券選択するのか、強化学習で馬券を自動的に決めるのか、などを検討したいと思いました。