長らく放置してしまいましたが、前回の続きです。
仕様の検討ということで、他のサイト様なども参考にしながら、
やりたいことをとりあえず列挙して、そこから内容を煮詰めていけたらと思う。
競馬予想AIでやりたいこと
とりあえず予想AIの機能として、盛り込みたいことを列挙してみる。
- netkeiba.com から、過去のレース情報を取得する
- 予想するレースの馬場情報・天候・競走馬の情報を取得する
- レースに出場する競走馬データを取得する
- 取得したデータ類をデータベースに格納する
- 過去データを元に学習モデルを作成、レース結果の予想を行う
- 予想結果と実際の結果を比較し、乖離が大きい場合はモデルを修正する
- GUIでの操作を可能とする
GUIでの操作は正直後回しでいいのかな?
おおまかに、やりたいことが決まったので、詳細を煮詰めていく。
1. netkeiba.com から、過去のレース情報を取得する
過去の情報は開催前日までに、取得することを想定する。
過去の情報の取得と一概に言っても、どの情報を学習に利用するかによって、
取得する内容も変わってくる。
今回、取得予定のデータは以下。
- (レースID) ←学習には使用しない
- 日付時刻 (yyyy/MM/dd hh:mmの形式想定)
- 芝・ダート
- 距離
- 天候 (晴・曇・小雨・雨の4択?)
- 馬場 (良・鞘重・重
- 着順
- 枠番
- 馬番
- (競走馬ID)←学習には使用しない
- 馬名
- 性齢 (性別と年齢で分割予定)
- 斤量
- 騎手
- タイム (mmfの形式)
- 上りタイム (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ウィークが終わっちゃう!!
以上