0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

個人開発エンジニア応援 - 個人開発の成果や知見を共有しよう!-

【仕様検討】Pythonのお勉強も兼ねて、競馬予想AIを作ってみる 【Part2】

Posted at

長らく放置してしまいましたが、前回の続きです。

仕様の検討ということで、他のサイト様なども参考にしながら、
やりたいことをとりあえず列挙して、そこから内容を煮詰めていけたらと思う。

競馬予想AIでやりたいこと

とりあえず予想AIの機能として、盛り込みたいことを列挙してみる。

  1. netkeiba.com から、過去のレース情報を取得する
  2. 予想するレースの馬場情報・天候・競走馬の情報を取得する
  3. レースに出場する競走馬データを取得する
  4. 取得したデータ類をデータベースに格納する
  5. 過去データを元に学習モデルを作成、レース結果の予想を行う
  6. 予想結果と実際の結果を比較し、乖離が大きい場合はモデルを修正する
  7. GUIでの操作を可能とする

GUIでの操作は正直後回しでいいのかな?
おおまかに、やりたいことが決まったので、詳細を煮詰めていく。

1. netkeiba.com から、過去のレース情報を取得する

過去の情報は開催前日までに、取得することを想定する。

過去の情報の取得と一概に言っても、どの情報を学習に利用するかによって、
取得する内容も変わってくる。

今回、取得予定のデータは以下。

  • (レースID) ←学習には使用しない
  • 日付時刻 (yyyy/MM/dd hh:mmの形式想定)
  • 芝・ダート
  • 距離
  • 天候 (晴・曇・小雨・雨の4択?)
  • 馬場 (良・鞘重・重
  • 着順
  • 枠番
  • 馬番
  • (競走馬ID)←学習には使用しない
  • 馬名
  • 性齢 (性別と年齢で分割予定)
  • 斤量
  • 騎手
  • タイム (mm:flag_ss:fの形式)
  • 上りタイム (ss:fの形式)
  • 馬体重 (当日体重と増減量で分割する予定)
  • 人気

ここから下の情報については、一旦保留。後々、追加していく予定。

  • 着差
  • 調教師
  • 馬主
  • 通過順
  • ラップタイム

ここで取得したデータをエンコードして、DBに落とす方向で考える。
どのDBMSを使うかは要検討
(macとWin両方で使うならmysql? 個人的には勝手のわかるSQLSERVERがいいんけど・・・
Dockerも学ぶの・・・??そうなら、環境全部Dockerに落とし込めよって話になるよな??)

また、エンコードはどの手法を用いるか、実際にデータを取って
試してみた上で最終決定する。

2. 予想するレースの馬場情報・天候の情報を取得する

この内容については、開催日当日でないと、取得が難しい内容なので、
当日の予想直前に動かす想定。

開催予定の全レースを取得してもいいが、私の賭け方的に、個別にレースを指定する
パターンが良いかと思うので、開催場所とレースを指定して、取得する方向で考える。

一応、開催場所の全レース取得のパターンと、開催日にある全レースのデータ取得という
パターンも作っておくか・・・?(この2パターンー作る方が楽な説がなくもない)

ここで取得するデータは以下の想定

  • (レースID)
  • 開催レース場
  • 発走予定時間
  • 馬場情報
  • 枠番
  • 馬番
  • (競走馬ID)
  • 馬名
  • 性齢 (性別と年齢で分割予定)
  • 斤量
  • 騎手
  • 馬体重 (当日体重と増減量で分割する予定)
  • 人気

一旦このデータで取得して、馬の性齢は予想レースのテーブルには格納せず、
後に出てくる、競走馬テーブルのUPDATEに利用する。

予想データについては、開催日を過ぎたら、消去するような仕組みを構築しておいてもいいかもしれない。
ディスクの圧迫にもつながるからね。

3. レースに出場する競走馬データを取得する

競走馬データを取得するとは言うものの、DBのテーブル構成を脳内妄想した感じだと、

'''
競走馬 → 馬とレースの紐づけテーブル → 予想レース

馬とレースの紐づけテーブル

過去のレース

の関係で構築できて、それぞれを競走馬のIDで結合できる。
となれば、競走馬テーブルに必要なデータは、以下のものだけになる。

  • 競走馬ID
  • 競走馬名
  • 性別
  • 年齢

年齢については、予想レースのデータを取得した際に、すでに格納されている
年齢から変更があれば更新する。

ざっくりとこんな形で、競走馬データのデータは取得できるのではないかと思う。

4. 取得したデータ類をデータベースに格納する

3.でも書いたように、データベースの構造は、妄想段階だが、以下の形を想定している。
競走馬 → 馬とレースの紐づけテーブル → 予想レース

馬とレースの紐づけテーブル

過去のレース

テーブルの中身は1,2,3で記載した物になるので、カラムの内容も必然的に同一になる。

実際に作ってみてかな?

5. 過去データを元に学習モデルを作成、レース結果の予想を行う

ここからが、tensorを使ってやっていく部分になる。
まずは過去データを元にモデルを作る過程。

実際できるかどうかは置いといて、芝は芝のモデル。ダートはダートのモデルとして、
2パターンを用意したいと思っている。

余裕があれば、ダート芝関係なく作ったモデルと、芝のみ、ダートのみのデータで作ったモデルで、
評価をしてみるのもありかと思う。これついては余談レベルでの話になるかな?

モデルの作成のための、元データはそれぞれ過去5年分(2017~2021年)のデータを元にする想定。
評価の期間としては1年分(2022年)のデータを用意する。

評価値としては、各馬のタイムと、それをソートして得られる着順を想定。

できたモデルの中で最も的中率高かったモデルを採用。

できたモデルを持って、未来のレースの予想を出力する。

書くのも疲れてきたので、ざっくりとこんな感じということで。

6. 予想結果と実際の結果を比較し、乖離が大きい場合はモデルを修正する

予測結果と予測したレースの結果を突合し、どの程度乖離があるかを確認する。

それぞれ予測と実際をDB上にデータとして保持した上で、乖離度を測るような動きにする。

モデルの修正については正直勉強が足りんので、後々加筆します。

あとがき

あれをやるんなら、これもやらないとできない。
これもやるなら、、、とやることばかりが膨らんでいって、収拾がつかなくなってきている気がする。

それでも、大体の大枠は決まったので、
次回はdockerの環境構築と、docker上でanaconda、tensor、sqlserverを動かす準備をする予定。

早く動かないと秋のGIウィークが終わっちゃう!!

以上

0
2
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
0
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?