第6話では、これまで作ってきた予想ロジックの前提を見直し、「スリット判定AI」を作るという新しい方向性が決まりました。
これまでのように平均スタートのデータからスリット隊形を想定するのではなく、AIを使ってスリット隊形そのものを予測する。
方向性が決まったので、いよいよAI開発です。
……と思っていました。
でも、実際にはそう簡単には進みませんでした。
AIにスリット隊形を学習させるためには、まず「この画像はこのパターン」という正解付きのデータ、いわゆる教師データが必要です。
当時の自分は、AIを作るために何が必要なのか、どこまで準備すればいいのかもよく分かっていませんでした。
ここから、想像していた以上に地道な「AIを作るための土台作り」が始まりました。
まずはスリット画像を12パターンに分ける
スリット判定AIを作るためには、まずAIに学習させるための正解データが必要です。
スリット隊形の分類には、YouTubeで見つけたスリット隊形の12パターンを参考に、分類に使ってみることにしました。
ただ、ここで一つ問題がありました。
大量のスリット画像を一つひとつ自分で見ながら、
「これはパターン1」
「これはパターン5」
と分類し続けるのは大変です。
それだけではありません。
自分自身が毎回同じ基準で、安定した判定を続けられるのかという問題もありました。
そこで考えたのが、
「このスリット画像の分類自体をAIにやってもらえないか?」
という方法でした。
AIに判定させれば解決……とはならなかった
まずはAIと壁打ちをしながら、スリット画像を判定するためのルールを整理しました。
その後、新しくスリット判定専用のチャットを作成。
スリット画像を渡すと、12パターンのどれに該当するのかをAIに判定してもらう形にしました。
これなら、自分ですべての画像を分類するよりも安定して教師データを作れる。
そう思っていました。
ところが、実際にやってみると、ここでも問題が出てきました。
最初は決めたルール通りに判定してくれていても、作業の間が空いたり、何度も判定を繰り返したりしていると、少しずつ挙動が変わってしまうことがありました。
決めたルールを守らなくなったり、指示していない形式で勝手に結果を出してきたり。
「AIに画像を渡せば、あとは同じルールで判定し続けてくれる」
というほど単純ではありませんでした。
AIに同じ仕事をしてもらうための工夫
そこで、スリット判定用のプロンプトを整理して、判定ルールを固めました。
現在はスリット判定の作業を始めるたびに、最初にそのプロンプトを提示し直してから画像を渡しています。
AIが出した判定結果についても、自分で簡単に確認しています。
つまり、
スリット画像をAIに渡す。
↓
AIが12パターンの中から判定する。
↓
自分でも結果を簡単に確認する。
という流れです。
もっと効率のいい方法はあるのかもしれません。
MyGPTのような仕組みを使う方法もありそうです。
ただ、今のところはこの運用で教師データを作れているので、まずはこの方法を続けることにしました。
教師データを増やすほど、手作業も増えていった
こうして、スリット画像を分類する方法はひとまず決まりました。
ただ、教師データを作るために必要なのは、スリットパターンだけではありません。
出走メンバーや選手ごとのコース別平均ST、スコア。
さらに、レース終了後には着順や配当などの情報も必要になります。
以前は、これらのデータを作るために多くの作業を手作業で行っていました。
ネットで対象レースの出走メンバーを確認する。
↓
Pythonistaに読み込ませるためのCSVを作る。
↓
CSVをPythonistaに読み込ませ、選手のスコアを算出する。
↓
必要な情報を教師データ用のスプレッドシートに貼り付ける。
↓
レース終了後、着順や配当を手入力する。
これをレースごとに繰り返していました。
教師データを増やせば増やすほど、当然この作業も増えていきます。
単純に時間がかかりますし、コピペや手入力が増えればミスも起きます。
少しずつデータを作るだけなら、この方法でもなんとかなります。
でも、これからさらに教師データを増やしていくことを考えると、
「この方法のままでは、数を増やしていくのは厳しいな」
と感じるようになりました。
自動化したい。でも、元になるデータがない
データ作成をPythonで自動化すること自体は、以前から考えていました。
ただ、自動化するためには元になるデータが必要です。
Webサイトから必要な情報を取得するためにスクレイピングすることも考えました。
でも、利用規約などの問題もあり、使えそうなサイトが見つからず断念。
自動化したくても、肝心のデータを取得する方法が見つかりませんでした。
そのため、しばらくは手作業を続けていました。
そんな中、たまたまオープンに公開されているCSVデータを見つけました。
「このデータが使えるなら、今まで手作業でやっていた部分をPythonで処理できるかもしれない。」
ここから、教師データ作成の裏側を少しずつ自動化できるようになりました。
Pythonで面倒だった作業をほぼ自動化
現在は、対象のレース場について1日分、もしくは一節間を選び、Pythonistaで専用のプログラムを実行すると、出走メンバーや選手ごとのコース別平均ST、スコアなどを処理して、CSVとして出力できるようになりました。
あとは、そのCSVを教師データ用のスプレッドシートにコピー&ペーストするだけです。
レース結果についても、以前は着順や配当を一つずつ手入力していましたが、現在は専用のプログラムを実行すれば、必要な情報をCSVとして出力できるようになりました。
こちらも、教師データ用のスプレッドシートに貼り付ければ完了です。
以前はレースごとに何度も繰り返していた作業が、プログラムを実行して、出力されたCSVを貼り付けるところまで短縮できました。
Pythonを勉強し始めた頃は、こんなふうに自分が面倒だと感じていた作業を、自分で作ったプログラムで減らせるようになるとは思っていませんでした。
Pythonを勉強すること自体が目的だった頃から少しずつ変わって、今では、
「やりたいことを進めるためにPythonを使う」
という場面が増えてきたように思います。
すべてを自動化したわけではない
ただし、今回自動化したのは、教師データを作るための周辺部分です。
スリット画像の判定そのものは、現在も手作業を残しています。
スリット画像をAIに渡す。
↓
AIが12パターンの中から判定する。
↓
自分で結果を簡単に確認する。
この部分については、今のところ完全に自動化する予定はありません。
すべての作業を無理に自動化するのではなく、まずは大量の手作業が発生していた部分をPythonに任せる。
今は、この形で教師データ作成を続けています。
864レース作って、やっとスタート地点
教師データは、最初から864レースを目標にしていたわけではありません。
ただ、AIと今後の進め方を壁打ちする中で、
「1000レースくらいは欲しい」
という話はしていました。
そこから少しずつデータを増やし、現在は864レースまで来ました。
スリット判定AIを作ろうと決めたときは、正直、何をどこまで準備すればいいのかもよく分かっていませんでした。
実際にやってみると、AIを作る前にもいろいろと準備が必要でした。
今の感覚としては、
「やっとスタート地点に来たかな」
という感じです。
まだどうなるかは分かりませんが、ここから実際に作ったデータを使って試していこうと思います。
次回予告
教師データを作り続け、少しずつAI開発の準備が整ってきました。
ただ、集めたデータをそのままAIに学習させればいいのか。
そもそも、どんなデータが集まっているのか。
まだ分からないこともあります。
次回は、集めた教師データを実際に分析しながら、スリット判定AI Ver.1に向けて進めていく過程を書こうと思います。
あわせて読みたい
ボートレースAI開発シリーズは、前後の記事とあわせて読むことで、試行錯誤や考え方の変化をより分かりやすく追うことができます。
競艇AI開発日記 第6話|ロジックを直す前に、前提を見直す必要があった
従来の予想ロジックVer.1.0の前提を見直し、「レース結果を予想する前に、その原因となるスリット隊形を予測できないか」と考え、スリット判定AIという新しい方向性にたどり着いた経緯を書いています。
