工学系大学院生のブログ

2人の大学院生による雑記ブログ

第1回 競馬予想プログラムを作りたい [機械学習、python, lightGBM]


第1回 競馬予想プログラムを作りたい (ここ)
第2-1回 オッズの見積方法(競馬予想)
第2-2回 様々な賭け方の予測精度
第3-1回 競馬予測の自動化
第3-2回 様々な賭け方の予測精度 2(競馬予想) 
機械学習による競馬予測ツール (ツールを無料公開しています)



こんにちは。hideです。


先日、競馬なるものをやってみました。



初めてだったこともあり、チキンだったこともあり、200円賭けてみようと適当に馬を選びました。




順調に、200円負けたので二度とやらないと誓いました。




しかし、馬に勝ち逃げされるのも癪なので、どうにかして勝ちたいと思い機械学習による競馬に手を出しました。


最終的には,機械学習による競馬予測ツールを作成しました.メール配信もしているのでよかったらみてみてください.

0 内容


このページでは、自分のやったことを順に記載していきます。特に理論背景等の説明はないので、コードを参考にしたい場合にご使用ください。



下記の流れで紹介します。コードは下記のgihub記載しています。


1 データ収集(スクレイピング)
2 データ処理
3 機械学習(lightGBM)


使用したpythonファイル

https://github.com/hide-dog/horse_racing

1 データ収集



機械学習を行うに当たりデータを収集する必要があります.


そこで,ネット競馬さんからデータを持ってきます.



ここでは,下記のpythonファイルを使用しました.

https://github.com/hide-dog/horse_racing/blob/main/scraping.py



とりあえず適当に17個のデータを持ってきています.

レースID, 順位, 枠, 馬名, 騎手名, 体重, 年齢, 斤量, コース, 距離, 発走時間, 天候, 馬場, 人気, オッズ, コーナー通過順, 馬番



ただ解析には全ての値を使用していません.
当然ながら,レース前に判明する事柄でしか予測できないからです.

そのため,コーナー通過順などは使えません.


今回は、2008年から2021年までのデータ収集を行いました。

効率的にアクセスしているわけではないこと、一回のアクセスに2秒程度かけていることから、3日くらいかかると思います.

速度は上げようと思えば上げれるのですが,短時間で大量にサイトにアタックすることは向こうのサーバーの迷惑になるので気をつけましょう.

2 データ処理



収集したデータには,馬の名前や人の名前が日本語で入っています.


このままでは,機械学習で扱えないので数字に直していきます.


ここでは,下記のpythonファイルを使用しました.

mkdir.py (ディレクトリ作成用)
pre.py (データ処理用)



各項目には次のように処理を施しています.




3 機械学習


機械学習の方法はいくつかありますが、系統の違うものを実施したいので、今回は、「ランダムフォレスト」「ニューラルネットワーク」「lightGBM」を使用します。


「ランダムフォレスト」は、決定木によりその値がどの程度重要か判別する方法になります。

「ニューラルネットワーク」は、誤差逆伝播法により複雑な関数による近似を可能とする方法です。

「lightGBM」は、誤差が小さくなるように学習を進めていく勾配ブースティングの一種で、面白そうなので採用しました。(2016年のもので最近はDeepGBMなるものもあるそうです。)


ここでは、下記のコードで機械学習を進めます。 

https://github.com/hide-dog/horse_racing_1/blob/main/hr_macine_learning_mk_model.py


2020年までのデータを使用し、2021年では単勝でどの程度勝つかしらべてみました。ニューラルネットワークはデータを正規化した方が良いため、各レース毎に正規化しています。(そのため、コースや距離といった各レースで共通の値は死んでいます、全体での正規化は今度すると思います)



結果を以下に示します。
正答率は、1位を当てる確率です。



どの手法でも、回収率が6-7割となっています。

一般的な競馬の回収率は、75%ほどと言われているため、微妙な結果となりました。
そもそも回収率が100%を超えないと挑戦する意味はないのですが……。


ただ、主観としては意外と悪くないのではないのでしょうか。
とりあえず一般人並みの正答率を作ることができました。


今後の方向性としては、賭け方を調整する、ほとんどデフォルトであった機械学習のパラメータをいじるなどが考えられます。



とりあえず次回は、他の賭け方について評価したいと思います。



hide



参考にさせて頂いたサイト

【Python】スクレイピングで競馬のデータを集める【予想準備】

このエントリーをはてなブックマークに追加

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です