5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

BrainPadAdvent Calendar 2023

Day 22

競馬予測システムの構築とMLOps実践(したかった)

Posted at

本稿はBrainpad Advent Calendar 2023の記事ですが,記事内容は筆者のプライベートな活動・見解に基づくものであることご了承ください.
遅刻投稿&ネタ被り記事です,申し訳ありません🙇

1. はじめに

元々2021年頃から気が向いた時駆動で競馬予測を散発的に取り組んでいました.散発的とは予測したいレースがあれば,それに間に合うようにデータ取得と予測モデル構築をし出走前に予測結果を基に馬券を買うといった流れを繰り返すことを指します.
カジュアルに機械学習でギャンブルを楽しむ分には,これでも遊べるので問題ありませんでしたが,近年エンジニアリングやシステムアーキテクチャに対する個人的な関心が高まったことと昨年のアドカレで社内の競馬AI勢の活動に触発されてシステム構築とMLOps実践にトライしてみました.

2. 要件定義

なぜ競馬予測システムを構築したいのか?その目的は結局儲けたいに行き着くでしょう.
この目的を達成するためには確度の高いレース予測継続的に出力し最適な意思決定をする必要がありますね.うーむ,かなりヘビーですが個人開発だし夢ぐらい見させて欲しいの精神でいきます.
目的を実現するための上記の構成要素をwhatツリーで分解してみると以下の通りでしょうか.

目的からのhowツリー.drawio-2.png

Step1として継続的に焦点を当ててデータ取得~予測まで実行する仕組みを設計・実装しました.

3. 設計・実装

システム構成図は次のとおり

システム構成図.drawio.png

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の各バケットに格納されます.
データレイク・出走表.png

※ 参考: CloudRun上のWebクローラーのメトリクス
CloudRun上のWebクローラーのメトリクス.png

3.2. ELT

データレイクに格納したデータを整形しDWHに格納していきます.
データの更新頻度がレース開催日において10~30分あたりとなる出走表とそのメタデータについてはCloudFunctions上にELT実行関数を実装し,週あたりに1回の頻度で更新するレース結果とそのメタデータについてはBigQueryDataTransferを利用しています.
更新頻度が日単位の粒度であればBigQueryDataTransferで統一できたのだが,やむを得ずこのような構成となりました.

BigQueryDataTransferは指定した時間にGCS上のデータを取得しBigQueryに格納することができます.
BigQueryDataTransfer.png

整形されたデータは下図のようにBigQuery上にて利用でき,これらを用いてドメイン知識理解・予測モデル構築に使用しています.
DWH・BigQuery.png

※ 参考: CloudFunctions上の出走表を対象としたELT関数のメトリクス
ELT・CloudFunctions.png

3.3. 学習〜評価

ローカルマシン下にてDWHからデータを呼び出し予測モデルを構築・評価を行っています.予測モデルについてはjupyter notebookにてプロトタイピングを行い予測モデルを固めたpickleファイルを出力,それを予測モデル用のバゲットにアップロードすることで予測の準備が完了となります.

※ 参考: ローカルマシン上での予測モデルのプロトタイピング
学習と評価.png

3.4. 予測~通知

Webクローラー部と同じようにCloudSchedulerで発火し直前に取得した予測用データとGCS上の予測モデルにて予測結果を出力し,Slackに予測結果を通知する予測実行関数をCloudFunctions上に実装中となっています.

4. まとめ

年内に実装しきりたかったですが途中で力尽きてしまいました.一応競馬予測のシステム構成に関する記事はあまり見かけていなかったので,少しばかりではありますが差別化できたとは思っています.
来年はこの仕組みを運用しつつ学習~予測あたりもVertexAIを活用するなどアップデートを図っていきたい所存です.読んでいただきありがとうございました.

5
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?