はじめに
xgboostを用いた競馬予測システムを作成しました。順位予測モデル(AI)の作成から予測順位のツイッター投稿まで行うことができます。予測精度の向上/冗長なコードの修正/使い勝手など、まだまだ改良したいところはありますが、実施したいことができるようになったので、リリースすることにしました。試された方はコメントをいただければ改良版への追加を検討します。
競馬予測AIプログラムの配布はダウンロード形式にしていますが、今後はgithubでの公開を検討しています。
中央競馬の順位予測システム
中央競馬で開催されるレースの順位予測を行うモデル(AI)を作成して、レース情報を基にレースの順位を予測するシステムです。
競馬予測AIプログラムのダウンロード
本システムで必要なプログラムが含まれている下記のzipファイルをダウンロードし、任意の場所に展開してください。
競馬予測AI_v1.0.0
1 ファイル 178.46 KB
システムの概要
- レースの順位予測を行うモデルを作成する際の学習データは、netkeiba.comから過去のレース情報を取得させてもらっています。
- 作成した順位予測モデルでレース発走の10分前に順位予測を行い、順位予測結果をtwitterに投稿します。
- 最終レース後に当日に予測した順位の複勝的中率を算出し、算出結果をtwitterに投稿します。
レースの順位予測を行うモデル(AI)作成の作業フロー
大まかな作業フローは下記となります。緑の箇所以外はプログラムで実施します。
システムの動作概要
システムを開始するプログラムを実行すると、あとはプログラムが全て実行します。
動作環境
動作環境は下記のとおりです。
項目 | 内容 |
動作環境のOS | Windows10 22H2 |
Python | 3.10.8 |
xgboost | 1.7.3 |
webdriver-manager | 3.8.5 |
selenium | 4.8.0 |
requests | 2.28.2 |
その他のライブラリ | requirements_keiba_ai.txt |
実行環境の作成方法
作業フローと作業詳細を下記にまとめました。
作業フロー
- 本システムのコードを一式をダウンロードして展開したあとに、Pythonの仮想環境を構築します。
- 仮想環境を有効にして本システムの実行に必要なパッケージを仮想環境にインストールします。
作業詳細
- Python 3.10.8にアクセスします。
Windows installer(64-bit)
をダウンロードします。
- ダウンロードした
python-3.10.8-amd64.exe
を実行します。
実行する際は、Add python.exe to PATH
にチェックを入れておきます。
- 本システムのプログラムのコード一式をダウンロードします。
競馬予測AI_v1.0.0
1 ファイル 178.46 KB
- ダウンロードしたコード一式を任意の場所に展開します。
展開すると以下のフォルダができます。
│ .gitignore
│ call_program.py
│ config.ini
│ LICENSE
│ main.py
│ README.md
│ requirements_keiba_ai.txt
│
├─img
│ Python3.10.8のインストール.svg
│ Python3.10.8のダウンロード.svg
│ 競馬予測モデルの作成フロー.svg
│ 競馬順位の予測フロー.svg
│
├─log
│ logging.conf
│
├─make_model
│ calc_win_rate.py
│ create_evaluate_models.py
│ make_model.py
│
├─my_module
│ fnc.py
│
├─predict
│ predict_rank.py
│
├─tweet
│ twitter.py
│
└─web_scraping
get_cellTime.py
get_raceInfo.py
get_raceResults.py
get_raceResults_after_finalRace.py
prepare_raceResults.py
- フォルダ/ファイルの意味は下記となります。
フォルダ名 | ファイル名 | 種別 | 内容 |
.gitignore | 設定ファイル | githubの管理対象外のファイルを記載 | |
call_program.py | プログラム | 各開催場所の発走時刻を読み込んでレース情報取得のプログラム、順位の予測プログラム、ツイッター投稿プログラムを呼び出す | |
config.ini | 設定ファイル | 本システムで使用するパスや設定値を記載 | |
LICENSE | ライセンスファイル | 本システムのライセンスはMIT LICENSE | |
main.py | プログラム | レース当日に実行するプログラム。このプログラムが起点 | |
README.md | 本ファイル | 最初に読んでもらいたいファイル | |
requirements_keiba_ai.txt | 設定ファイル | 本システムを動作するために必要なパッケージ一覧を記載 | |
img | フォルダ | README.mdで使用している画像を保存 | |
Python3.10.8のインストール.svg | 画像ファイル | Pythonインストールダイアログ | |
Python3.10.8のダウンロード.svg | 画像ファイル | Pythonダウンロード画面 | |
競馬予測モデルの作成フロー.svg | 画像ファイル | 競馬予測モデルの作成フロー | |
競馬順位の予測フロー.svg | 画像ファイル | 競馬順位の予測フロー | |
log | フォルダ | ログ出力の設定ファイルとログを保存 | |
logging.conf | 設定ファイル | ログ出力の設定を記載 | |
make_model | フォルダ | モデルを作成するプログラムと作成したモデルを保存 | |
calc_win_rate.py | プログラム | モデルの的中率を計算するプログラム | |
create_evaluate_models.py | プログラム | モデルの作成と評価をするプログラムを呼び出すプログラム | |
make_model.py | プログラム | モデルを作成するプログラム | |
my_module | フォルダ | 自作モジュールを保存 | |
fnc.py | プログラム | 自作モジュールをまとめたプログラム | |
predict | フォルダ | 順位予測のプログラムと結果を保存 | |
predict_rank.py | プログラム | レース情報から順位を予測するプログラム | |
tweet | フォルダ | ツイッターに投稿するメッセージと投稿プログラムを保存 | |
twitter.py | プログラム | ツイッターにメッセージを投稿するプログラム | |
web_scraping | フォルダ | Webから取得したレース情報と取得するためのプログラムを保存 | |
get_cellTime.py | プログラム | レース発走時刻の一覧を取得するプログラム | |
get_raceInfo.py | プログラム | レース情報を取得するプログラム | |
get_raceResults.py | プログラム | 過去のレース情報を取得するプログラム | |
get_raceResults_after_finalRace.py | プログラム | レース当日の全レースの結果を取得するプログラム | |
prepare_raceResults.py | プログラム | 取得した過去のレース情報を整形するプログラム |
- コマンドプロンプトを起動し、下記のコマンドを実行してPythonの仮想環境を作成します。
C:¥tmp
にコード一式を展開した場合の仮想環境の作成手順
> cd C:¥tmp
> python -m venv keiba_ai
- 下記のコマンドを実行して作成した仮想環境を有効にします。
> cd C:¥tmp¥keiba_ai
> Scripts¥activate.bat
(keiba_ai)>
- 下記のコマンドを実行して競馬予測システムのプログラムを実行するために必要なパッケージをインストールします。
(keiba_ai)> python.exe -m pip install --upgrade pip
(keiba_ai)> pip install -r requirements_keiba_ai.txt
以上で実行環境の作成は完了です。
実行方法
作業の流れ
- 【1.過去のレース情報取得】で順位予測モデルで使用する訓練データを取得します。
- 【2.取得した過去のレース結果の整形】で訓練データで使用できるデータに整形します。
- 【3.順位予測モデルの作成】でレース順位予測で使用する順位予測モデルを作成します。
- 【4.使用する順位予測モデルを設定ファイルに登録】でどの順位予測モデルを使用するかを設定します。
- 【5.twitterのAPIのトークンを設定ファイルに登録】でtwitter APIを使用するための設定を行います。
- 【6.実際のレースの順位予測を実行】でレース当日の順位を予測します。
作業手順
【1.過去のレース情報取得】
- 使用するプログラム:get_raceResults.py
- プログラムの概要:モデルを作成するために過去のレース情報を取得します。過去のレース情報は1年単位で取得します。
get_raceResults.py
の下記の箇所を適宜変更して1年単位でレース情報を取得します。
# 取得する期間を指定する
start_year = str(2023)
end_year = str(2023)
start_month = str(1)
end_month = str(12)
- 取得期間の編集を行ったら下記のコマンドで
get_raceResults.py
を実行します。
(keiba_ai)> cd C:¥tmp¥keiba_ai¥web_scraping
(keiba_ai)> python get_raceResults.py
- 実行完了までには、実行環境によって変わってきますが、3~5時間ほどかかります。
- 正常に実行が完了すると、下記フォルダにレース情報が保存されています。
(keiba_ai)> dir C:¥tmp¥keiba_ai¥web_scraping¥data¥raceresults
2023_1_2023_12_raceresults.csv
- 取得する期間を変更して、モデルを作成する際に使用するレース情報を取得します。
1年分のレース情報でモデルを作成することも可能です。5~10年分のレース情報があれば、モデル作成と検証に事足ります。
以上で【1.過去のレース情報取得】は終了です。
【2.取得した過去のレース結果の整形】
- 使用するプログラム:prepare_raceResults.py
- プログラムの概要:取得したレース結果にはモデル作成時に使用しないデータが含まれています。タイムの表記を分秒となっています。使用しないデータの削除、タイムの表記を秒、欠損している行の削除、馬体重が計不になっている行の削除、などを実施します。
- 事前に
get_raceResults.py
を実行して、過去のレース結果を取得しておきます。 - 下記のコマンドで
prepare_raceResults.py
を実行します。
(keiba_ai)> cd C:¥tmp¥keiba_ai¥web_scraping
(keiba_ai)> python prepare_raceResults.py
- 正常に実行が完了すると、下記フォルダに整形したレース情報が保存されています。
(keiba_ai)> dir C:¥tmp¥web_scraping¥data¥raceresults¥prepared_raceresults
2023_2023_prepared_raceresults.csv
以上で【2.取得した過去のレース結果の整形】は終了です。
【3.順位予測モデルの作成】
- 使用するプログラム:create_evaluate_models.py
- プログラムの概要:整形したレース結果を基にモデルを作成し、そのモデルの評価結果を記録します。
- 事前に
prepare_raceResults.py
を実行します。 - GPU搭載の端末であれば、
make_model.py
の下記箇所(210行,211行と246行,247行)のコメントアウトを外すことでGPUを使用してモデルを作成することができます。
# 'tree_method': 'gpu_hist', # gpuを使う設定
# 'predictor': 'gpu_predictor', # gpuを使う設定
- 下記のコマンドで
create_evaluate_models.py
を実行します。
(keiba_ai)> cd C:¥tmp¥make_model
(keiba_ai)> python create_evaluate_models.py
- 実行が完了すると下記のファイルが生成されます。
ファイル名 | 内容 |
的中率.csv | 順位予測モデル作成時の評価データに対しての単勝、複勝、馬連、ワイド、3連複の的中率と作成したモデルの保存パス |
比較結果.csv | 順位予測モデル作成時の評価データと予測結果の比較 |
予測結果.csv | 順位予測モデル作成時の評価データから予測した順位 |
gbm.pkl | 作成した順位予測モデル |
oe_x.pkl | エンコードモデル |
ハイパーパラメータ.txt | 順位予測モデル作成時に使用したハイパーパラメータ |
実タイムと予測タイムの散布図.svg | 実タイムと予測タイムの散布図 |
的中率_整形後.txt | モデル評価時のレース数、単勝、複勝、馬連、ワイド、3連複の的中率 |
評価結果.txt | R2、MAE、RMSEの値 |
予測タイムの重要度分析.svg | 予測タイムの重要度分析 |
以上で【3.順位予測モデルの作成】は終了です。
【4.使用する順位予測モデルを設定ファイルに登録】
- 使用するファイル:config.ini
- ファイルの概要:本システムで使用するフォルダパス、変数定義、twitterのAPIで使用する値を設定するファイルです。
- 【順位予測モデルの作成】で作成した
的中率.csv
を参照して、実際のレースで使用する順位予測モデルを決めます。 config.ini
をテキストエディタで開きます。model_path
に順位予測モデルを保存しているファイルパスを記入します。
以上で【4.使用する順位予測モデルを設定ファイルに登録】は終了です。
【5.twitterのAPIのトークンを設定ファイルに登録】
- 使用するファイル:config.ini
- ファイルの概要:本システムで使用するフォルダパス、変数定義、twitterのAPIで使用するトークンを設定するファイルです。
- twitterのAPIを使用して順位予測を投稿します。twitterのAPIを使用するために、twitter Developer Portalサイドで
BEARER_TOKEN
、API_KEY
、API_SECRET
、ACCESS_TOKEN
、ACCESS_TOKEN_SECRET
を取得してください。 - 必要な情報の取得が完了したら、
config.ini
をテキストエディタで開きます。 - [twitter]セクションに記入します。
以上で【5.twitterのAPIを設定ファイルに登録】は終了です。
【6.実際のレースの順位予測を実行】
- 使用するプログラム:main.py、call_program.py
- プログラムの概要: レース情報の取得プログラム、順位の予測プログラム、twitterへの投稿プログラム、を呼び出すcall_program.pyを実行します。開催場所が複数するある場合は、call_program.pyをマルチスレッドで実行します。
- 制限事項:
- main.pyの実行はレース当日に実行してください。
- 順位予測には馬体重が必要です。レースの順位予測を開始するタイミングは、馬体重を取得できるタイミングにしてください。
- タイミングの設定は、下記の手順に記載してあります。
- レースの発走時刻の何秒前に予測を開始するかを設定することができます。call_program.pyの下記の箇所を変更することで設定できます。ただし、順位予測には馬体重が必要です。JRAのレース情報に馬体重が表記されるのは、レースの1時間前です。そのため、予測開始をレース発走時刻の1時間以上前に設定することはできません。下記の場合は、レース発走時刻の10分前に順位予測を開始します。
specify_seconds = 600
- 下記のコマンドで
main.py
を実行します。
(keiba_ai)> cd C:¥tmp¥
(keiba_ai)> python main.py
- ラウンドごとに生成されるファイル
ファイルパス | ファイル名 | 内容 |
./keiba_ai/predict/data/ | 1~3位の順位予測(開催場所)(日付).csv | 開催場所ごとの1~3位の順位予測結果。ツイッターへの投稿で使用する |
predict_result_(開催場所)(日付).csv | ラウンドごとに予測した1~3位の情報を追記する。最終レース後の的中率を算出するときに使用する | |
./keiba_ai/predict/data/today_raceresults/ | predict_real_result_(開催場所)_(日付).csv | 開催場所のラウンドごとの予測した1~3位と実際の1~3位の馬名の一覧。最終レース後の的中率を算出するときに使用する情報 |
- ツイッターへの投稿メッセージの例
- ラウンドごとに投稿するメッセージ
■1回東京6日目 4歳以上2勝クラス 12 R
1.ジョンソンテソーロ
2.アポロプラネット
3.ワーズワース
- 最終レース後に投稿するメッセージ
■20230212 予測結果のまとめ
tokyo 複勝の的中率:42%
hanshin 複勝の的中率:42%
ogura 複勝の的中率:25%
以上で【6.実際のレースの順位予測を実行】は終了です。
作成情報
- 作成者:sakurater
- 作成過程:https://relaxing-living-life.com/
- ライセンス:MIT License
コメント