本稿はBrainpad Advent Calendar 2023の記事ですが,記事内容は筆者のプライベートな活動・見解に基づくものであることご了承ください.
遅刻投稿&ネタ被り記事です,申し訳ありません🙇
1. はじめに
元々2021年頃から気が向いた時駆動で競馬予測を散発的に取り組んでいました.散発的とは予測したいレースがあれば,それに間に合うようにデータ取得と予測モデル構築をし出走前に予測結果を基に馬券を買うといった流れを繰り返すことを指します.
カジュアルに機械学習でギャンブルを楽しむ分には,これでも遊べるので問題ありませんでしたが,近年エンジニアリングやシステムアーキテクチャに対する個人的な関心が高まったことと昨年のアドカレで社内の競馬AI勢の活動に触発されてシステム構築とMLOps実践にトライしてみました.
2. 要件定義
なぜ競馬予測システムを構築したいのか?その目的は結局儲けたいに行き着くでしょう.
この目的を達成するためには確度の高いレース予測を継続的に出力し最適な意思決定をする必要がありますね.うーむ,かなりヘビーですが個人開発だし夢ぐらい見させて欲しいの精神でいきます.
目的を実現するための上記の構成要素をwhatツリーで分解してみると以下の通りでしょうか.
Step1として継続的に焦点を当ててデータ取得~予測まで実行する仕組みを設計・実装しました.
3. 設計・実装
システム構成図は次のとおり
3.1. Webクローラー
某競馬サイトよりクローリングを定期実行し出馬表・レース結果・競走馬プロフィールを取得しデータレイクに格納していく.データを取得する方法については数多の記事が既に存在するので,ここでは割愛させていただきます.取得するデータ区分名と保存先のバケット名は次の表のとおり.
バケット名 | データ名 | 更新タイミング | 説明 |
---|---|---|---|
keiba-db-manual | 出走馬 | - | 競走馬の所属や血統に関するデータ |
keiba-db-race-cards-meta-* | 出走表メタデータ | 各レース開始10分前 | 出走表の諸条件 |
keiba-db-race-cards-* | 出走表 | 各レース開始10分前 | レースに出馬する競走馬のテーブルデータ |
keiba-db-race-results-meta-* | レース結果メタデータ | 毎週水曜09:00 | レース結果の諸条件 |
keiba-db-race-results-* | レース結果 | 毎週水曜09:00 | レース結果が付与された競走馬のテーブルデータ |
出走表及びそのメタデータについてはレース開催日早朝に出走表を10分前に取得するためのタスクをCloudTasks
に格納しています.
また取得したデータは下図のようにGCSの各バケットに格納されます.
※ 参考: CloudRun
上のWebクローラーのメトリクス
3.2. ELT
データレイクに格納したデータを整形しDWHに格納していきます.
データの更新頻度がレース開催日において10~30分あたりとなる出走表とそのメタデータについてはCloudFunctions
上にELT実行関数を実装し,週あたりに1回の頻度で更新するレース結果とそのメタデータについてはBigQueryDataTransfer
を利用しています.
更新頻度が日単位の粒度であればBigQueryDataTransfer
で統一できたのだが,やむを得ずこのような構成となりました.
BigQueryDataTransfer
は指定した時間にGCS
上のデータを取得しBigQueryに格納することができます.
整形されたデータは下図のようにBigQuery
上にて利用でき,これらを用いてドメイン知識理解・予測モデル構築に使用しています.
※ 参考: CloudFunctions
上の出走表を対象としたELT関数のメトリクス
3.3. 学習〜評価
ローカルマシン下にてDWHからデータを呼び出し予測モデルを構築・評価を行っています.予測モデルについてはjupyter notebook
にてプロトタイピングを行い予測モデルを固めたpickleファイルを出力,それを予測モデル用のバゲットにアップロードすることで予測の準備が完了となります.
※ 参考: ローカルマシン上での予測モデルのプロトタイピング
3.4. 予測~通知
Webクローラー部と同じようにCloudScheduler
で発火し直前に取得した予測用データとGCS上の予測モデルにて予測結果を出力し,Slackに予測結果を通知する予測実行関数をCloudFunctions
上に実装中となっています.
4. まとめ
年内に実装しきりたかったですが途中で力尽きてしまいました.一応競馬予測のシステム構成に関する記事はあまり見かけていなかったので,少しばかりではありますが差別化できたとは思っています.
来年はこの仕組みを運用しつつ学習~予測あたりもVertexAI
を活用するなどアップデートを図っていきたい所存です.読んでいただきありがとうございました.