競艇AI開発日記 第8話|データを分析してみると、思ったより単純ではなかった

第7話では、スリット判定AIを作るための教師データ作りについて書きました。

少しずつデータを増やし、この時点で集まったのは864レース。

自分の中では、

「これで、いよいよAIを作るのかな。」

と思っていました。

しかし、AIと今後の進め方を壁打ちしていると、その前にやることがありました。

まずは、これまで作ってきた教師データに問題がないか確認する。

そして、そのデータがどんなものなのかを分析する。

そこで初めて聞いたのが、

「EDA」

という言葉でした。

正直、この時点では何をするものなのかも全く分かっていませんでした。

AIを作る前に、まずは自分が作ってきたデータの中身を見る。

今回は、そんなところから始まりました。

まずは教師データをチェックする

最初に行ったのは、864レース分の教師データのチェックでした。

例えば、

「一部の選手のスタートデータが空欄になっているレース」

「設定した判定ルールと、記録されている内容が合っていないように見えるレース」

などをプログラムで探しました。

いくつか問題になりそうなデータが見つかりましたが、これはある程度想定していました。

教師データを作っている段階から、

「ここは後でチェックしたら引っかかりそうだな。」

と思っていたケースがあったからです。

実際に元のデータを確認してみると、スタートデータが空欄だったのは、そのレースに欠場した選手がいたためでした。

判定内容に問題があるように見えたレースも、実際には「進入変更」と「フライング」が同時に起きていたケースでした。

単純な入力ミスではなく、特殊な条件が重なったことで、チェックに引っかかっていたわけです。

そこで、実際のデータに合わせてチェック方法を整理。

ひとまず、この864レースを使って次に進むことにしました。

「EDA」というものを初めて知る

次に行ったのがEDAです。

EDAは「Exploratory Data Analysis」の略で、日本語では「探索的データ分析」と呼ばれるそうです。

……と言われても、この時の自分にはよく分かりませんでした。

この言葉を聞いたのも初めてです。

簡単に言えば、いきなりAIにデータを学習させるのではなく、

「そもそも、どんなデータが集まっているんだろう。」

と中身を見ていく作業です。

例えば、

どのスリットパターンが多いのか。

パターンごとに、どんな特徴があるのか。

レース前に分かる情報と、実際のスリット隊形に関係はありそうなのか。

そんなことを一つずつ調べていきました。

これまで教師データを作るために864レースを見てきましたが、「分析するためのデータ」としてじっくり見るのは、これが初めてでした。

まずは12種類のスリットパターンを見てみる

最初に調べたのは、12種類に分類してきたスリットパターンの割合です。

今回の教師データでは、スリット隊形を大きく12種類のパターンに分けています。

例えば、内側の艇ほど前に出ている隊形をPattern 1、6艇がほぼ横一線に並んでいる隊形をPattern 2、反対に外側の艇ほど前に出ている隊形をPattern 11といった形です。

この分類をもとに、864レースがそれぞれどのパターンに当てはまるのかを記録してきました。

その分布を集計してみると、最も多かったのは内側の艇が先行するPattern 1。

308レースで、全体の35.6%を占めていました。

12種類のパターンが均等に存在しているわけではなく、パターンによって数にかなり違いがあることが分かりました。

ただ、この時点では、

「これは問題かもしれない。」

とは思っていませんでした。

教師データを作っている途中から、内側の艇が先行するPattern 1が多い感覚はありましたし、競艇という競技を考えても、それほど違和感のある結果ではなかったからです。

この時点では、この偏りがAIにどんな影響を与えるのかまでは考えていませんでした。

作ってきた教師データは使えそうなのか

次に確認したのが、自分が分類してきた12種類のスリットパターンと、それぞれのスリット隊形の特徴との関係です。

教師データを作るときには、12種類のパターンだけではなく、

「内側の艇が速い」

「外側の艇が速い」

「中央の艇が前に出ている」

といった、スリット隊形の特徴も一緒に記録していました。

この二つを比べてみると、パターンによって特定の特徴が多く出ていることが分かりました。

例えば、あるパターンでは「外側の艇が速い」という特徴がほとんどを占めている。

別のパターンでは「ダッシュ勢が速い」という特徴が多い。

そんな関係が、実際のデータからも見えてきました。

この結果を見て、

「少なくとも、分類したパターンとスリット隊形の特徴は、ある程度つながっていそうだな。」

という感覚でした。

これだけで教師データの精度が分かるわけではありません。

ただ、少なくとも、今まで作ってきたデータが全く使えないものではなさそうだという感触はありました。

スリット隊形に関係する特徴を探してみる

ここからは、レース前に分かる情報と、実際のスリット隊形にどんな関係があるのかを調べてみました。

例えば、選手ごとの平均スタート。

内側3艇と外側3艇のスタートの差。

隣り合う艇同士のスタートの差。

6艇の中で、どのコースの選手が平均スタートでは最も速いのか。

さらに、これまで自分が作ってきた選手スコアについても調べました。

自分としては、

「この数字に違いがあれば、このスリットパターンになりやすい。」

そんな分かりやすい特徴が見つかれば理想でした。

最初の分析で、いきなり当たりを引ければ万々歳です。

パターンによって多少の違いはありました。

ただ、

「この数字を見れば、どのスリットパターンになるか分かる。」

というほど、はっきりした関係は見つかりませんでした。

やっぱり、そんなに簡単ではなかった

平均スタートを見る。

内側と外側の差を見る。

隣り合う選手同士を比べる。

選手スコアも見てみる。

いろいろな角度からデータを見てみて、一番印象に残ったのは、

「思っていたより単純じゃないな。」

ということでした。

最初に当たりを引ければ万々歳でしたが、

「やっぱり、そんなに簡単じゃないよね(笑)」

というのが率直な感想です。

ただ、実際に分析してみたことで、

「単純な一つの特徴だけでは説明できなさそうだ。」

ということは分かりました。

事前に分かる情報だけで、どこまで実際のスリット隊形に近づけるのか。

それを調べていくことには、面白さも感じていました。

最初のAIは通常条件だけで試すことにした

EDAを進める中で、もう一つ考えたことがありました。

それは、

「最初のAIから、すべてのレースを対象にする必要があるのか。」

ということです。

競艇には、通常とは違う条件で行われるレースがあります。

例えば、

進入コースが変わったレース。

風が強かったレース。

荒天などで安定板を装着したレース。

通常より周回数が短くなったレース。

欠場した選手がいたレース。

ただでさえ、スリット隊形は単純な要因だけでは説明できそうにありません。

そこに、こうした特殊な条件まで加わると、さらに複雑になります。

最初からすべてを対象にするより、

「まずは通常の条件で試してみよう。」

そう考えました。

864レースから特殊な条件のレースを除外した結果、最初のスリット判定AIに使うデータは704レースになりました。

せっかく集めたデータを減らすことへの抵抗は、それほどありませんでした。

まずは条件を絞って試してみる。

その方が、自分としてもしっくりきました。

まずは704レースで試してみる

最初の分析で分かりやすい特徴が見つかれば万々歳でしたが、やっぱりそんなに簡単ではなさそうです。

それでも、事前に分かる情報からどこまでスリット隊形を予測できるのか。

そこは試してみたいと思いました。

楽しみな反面、

「これ、本当にAIとして形になるのかな。」

という不安もあります。

とりあえず、まずは通常条件の704レースを使って、実際にスリット判定AIを作ってみることにしました。

次回予告

いよいよ、スリット判定AI Ver.1を実際に作ってみます。

PCに機械学習を動かすための環境を整え、最初のモデルを動かしてみました。

出てきた正解率は、約35%。

一見すると、それなりに予測できているようにも見えます。

でも、予測結果を詳しく見てみると、思っていたものとは少し違っていました。

次回は、初めてスリット判定AIを動かしてみたときの話を書こうと思います。

あわせて読みたい

ボートレースAI開発シリーズは、前後の記事とあわせて読むことで、試行錯誤や考え方の変化をより分かりやすく追うことができます。

競艇AI開発日記第7話 | スリット判定AIへの第一歩。まずは教師データ作りから始めました

スリット判定AIを作るために必要な教師データをどのように作ったのか。AIによるスリット画像の判定や、Pythonを使ってデータ作成の一部を自動化し、教師データを集めていった過程を書いています。

タイトルとURLをコピーしました