競馬予測AIのバージョン1.0.0のリリース

機械学習

はじめに

xgboostを用いた競馬予測システムを作成しました。順位予測モデル(AI)の作成から予測順位のツイッター投稿まで行うことができます。予測精度の向上/冗長なコードの修正/使い勝手など、まだまだ改良したいところはありますが、実施したいことができるようになったので、リリースすることにしました。試された方はコメントをいただければ改良版への追加を検討します。

競馬予測AIプログラムの配布はダウンロード形式にしていますが、今後はgithubでの公開を検討しています。

中央競馬の順位予測システム

中央競馬で開催されるレースの順位予測を行うモデル(AI)を作成して、レース情報を基にレースの順位を予測するシステムです。

競馬予測AIプログラムのダウンロード

本システムで必要なプログラムが含まれている下記のzipファイルをダウンロードし、任意の場所に展開してください。

システムの概要

  • レースの順位予測を行うモデルを作成する際の学習データは、netkeiba.comから過去のレース情報を取得させてもらっています。
  • 作成した順位予測モデルでレース発走の10分前に順位予測を行い、順位予測結果をtwitterに投稿します。
  • 最終レース後に当日に予測した順位の複勝的中率を算出し、算出結果をtwitterに投稿します。

レースの順位予測を行うモデル(AI)作成の作業フロー

大まかな作業フローは下記となります。緑の箇所以外はプログラムで実施します。

システムの動作概要

システムを開始するプログラムを実行すると、あとはプログラムが全て実行します。

動作環境

動作環境は下記のとおりです。

項目内容
動作環境のOSWindows10 22H2
Python3.10.8
xgboost1.7.3
webdriver-manager3.8.5
selenium4.8.0
requests2.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にチェックを入れておきます。
  • 本システムのプログラムのコード一式をダウンロードします。
  • ダウンロードしたコード一式を任意の場所に展開します。
    展開すると以下のフォルダができます。
   │  .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連複の的中率
評価結果.txtR2、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_TOKENAPI_KEYAPI_SECRETACCESS_TOKENACCESS_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. ツイッターへの投稿メッセージの例
  • ラウンドごとに投稿するメッセージ
   ■1回東京6日目 4歳以上2勝クラス 12 R
   1.ジョンソンテソーロ
   2.アポロプラネット
   3.ワーズワース
  • 最終レース後に投稿するメッセージ
   ■20230212 予測結果のまとめ
   tokyo 複勝の的中率:42%
   hanshin 複勝の的中率:42%
   ogura 複勝の的中率:25%

以上で【6.実際のレースの順位予測を実行】は終了です。

作成情報

コメント

タイトルとURLをコピーしました