Python初心者が、自分の予想をAIにしていくまで
「自分の競艇予想を、Pythonで再現できないかな?」
そんなところから始まったのが、この競艇AI開発日記です。
Pythonを学び始めた初心者が、自分で考えていた競艇予想のロジックをPythonで形にし、そこからデータ分析や機械学習を使ったAI開発へ進んでいく過程を記録しています。
最初からAIを作る知識があったわけではありません。
実際に開発を進めてみると、
「思ったよりうまくいかない」
「この考え方で合っているのかな?」
「数字を増やせば良くなると思っていたけど、そうでもない」
ということが何度も出てきました。
また、開発を進める中で、当初考えていた目的やアプローチそのものを見直す場面も出てきました。
このシリーズでは、そうした「仮説→検証→違和感→次の試行錯誤」を、その時点で考えていたことと一緒に残しています。
完成したAIを紹介するシリーズではありません。
現在も開発途中です。
最初は「自分の予想をPythonで再現する」ことから始まりましたが、現在はAIやデータ分析を活用しながら、自分が競艇予想で重視している考え方を、どこまでデータやプログラムで形にできるのかを試しています。
「Python初心者が、AI開発を進めていくとどうなるのか」
その過程そのものを楽しんでもらえればと思っています。
現在地
現在は、スタートに関するデータを分析しながら、それを最終的な競艇予想にどう活用するのかを検証しています。
これまで、選手ごとの過去のスタート特性を調べたり、6艇それぞれのデータを比較したりしながら、スタート順位を予測する方法を試してきました。
その結果、過去のスタート特性からある程度の傾向を考えることはできました。
一方で、6艇のスタート順位を高い精度で正確に予測することは、思っていたより簡単ではありませんでした。
そこで現在は、
「スタート順位を正確に当てるAIを作る」
ことだけを目的にするのではなく、
「スタートに関する情報を、実際の予想に使えないか?」
という方向へ考え方を変えています。
すでに作っている予想ロジックにスタート・スリットに関する情報を組み合わせ、
「このレースは予想を支持できそうか?」
「このレースは見送った方がいいのではないか?」
といった、レース選別にも活用できないかを検証しています。
また、単純に的中率を高めるだけではなく、
「買う価値のあるレースを選び、最終的な回収率を高める」
という考え方も、今後のAI開発で重要なテーマになってきました。
まだ答えが出ているわけではありません。
これからもデータを見ながら、どんな情報を予想に使うべきなのかを試していきます。
最新話
競艇AI開発日記 第31話|AIを予想に組み込んだら、回収率が下がった
※シリーズは現在も継続中です。今後の開発結果によって、内容や方向性も変わっていく予定です。
競艇AI開発日記の流れ
このシリーズは、現在までの開発過程を大きく5つのPhaseに分けています。
※Phaseは、このページでシリーズ全体の流れを分かりやすくするために設定した編集上の区分です。
Phase 1|予想ロジックをPythonで形にする
第1話〜第4話
まずは、自分がこれまで競艇予想で使っていた考え方をPythonで再現するところから始めました。
「Pythonで予想ロジックを作る」と言っても、最初からきれいなプログラムが書けたわけではありません。
実際に形にしてみると、「意外とそれっぽいもの」ができました。
ところが、実戦で使ってみると少しずつ違和感が出てきます。
ここから、「作る」だけではなく「本当にこれでいいのかを確認する」という段階に入っていきました。
Phase 1の記事
競艇AI開発日記 第1話 | 自分の予想をPythonで再現してみようと思った話
競艇AI開発日記 第2話 | Ver.1.0が完成。「意外とそれっぽいもの」ができた日
競艇AI開発日記 第3話 | Ver.1.0を実戦投入。「これ、意外といけるかも」と思った日
競艇AI開発日記 第4話 |「何かおかしい。」Ver.1.0に初めて違和感を覚えた日
Phase 2|ロジックを直す前に、前提を見直す
第5話〜第6話
第4話で感じた違和感をきっかけに、すぐにロジックを修正するのではなく、
「そもそも自分は何を予測しようとしているのか?」
という前提を見直していきました。
作ったものが思ったように動かないとき、すぐにコードを直すのではなく、一度立ち止まって考えてみる。
この段階が、その後のAI開発へ進むきっかけになっていきます。
Phase 2の記事
競艇AI開発日記 第5話|ロジックを直す前に、理解することが必要だった
競艇AI開発日記 第6話|ロジックを直す前に、前提を見直す必要があった
Phase 3|競艇AI開発へ進む
第7話〜第10話
ここから、いよいよスリット判定AIの開発へ進みます。
まずはAIに学習させるための教師データ作りからスタート。
そのデータを分析し、実際にAIへ学習させてみるところまで進みました。
ただ、ここでもすぐに精度が上がったわけではありません。
AIを作ることそのものだけではなく、
「AIをどう評価するのか」
や、
「特徴量を増やせば本当に良くなるのか」
といったことも、一つずつ試しながら進めていきました。
Phase 3の記事
競艇AI開発日記 第7話|スリット判定AIへの第一歩。まずは教師データ作りから始めました
競艇AI開発日記 第8話|データを分析してみると、思ったより単純ではなかった
競艇AI開発日記 第9話|初めてのAI開発。最初に学んだのは「評価の仕方」でした
競艇AI開発日記 第10話|特徴量を増やせば精度は上がると思っていました
Phase 4|AIに何を渡すかを探す
第11話〜第19話
AIを実際に動かしてみると、次に考える必要が出てきたのが、
「そもそもAIに何を渡せばいいのか?」
という問題でした。
そこで、データを分析しながら、スリットを予測するために使えそうな特徴量を探していきます。
平均スタートを見たり、標準偏差を見たり。
そこからAIへ実際に特徴量を渡して、結果を確認します。
うまくいくものもあれば、思ったほど変化しないものもあります。
Accuracyが上がっても、手応えがなかったこともありました。
さらに、
「12種類に分類したスリットを、そのまま予測する必要があるのか?」
という疑問も出てきました。
そこで、選手ごとの過去のスタート特性を使い、6艇の中で誰がスタートで優位になりそうなのかを考えるところまで検証を進めました。
まだ「これを使えばいい」という答えが見つかったわけではありません。
ただ、この一連の検証を通して、AIの精度を上げることそのものが、最終的な目的ではないということも少しずつ見えてきました。
Phase 4の記事
競艇AI開発日記 第11話|AIに渡す情報をデータから探すことにしました
競艇AI開発日記 第12話|特徴量探しは、平均スタートから始めることにしました
競艇AI開発日記 第13話|平均スタートを分析してみると、それだけでは足りない気がしました
競艇AI開発日記 第14話|標準偏差を調べてみても、まだ答えは見つかりませんでした
競艇AI開発日記 第15話|Accuracyは上がったのに、手応えはありませんでした
競艇AI開発日記 第16話|STの速さを別の角度から見ても、あまり変わりませんでした
競艇AI開発日記 第17話|ST中央値を試してみても、やっぱり大きな変化はありませんでした
競艇AI開発日記 第18話|12種類のスリットを予測することが、本当に必要なのか?
競艇AI開発日記 第19話|過去のスタート特性から、今回のスタートを考えてみる
Phase 5|スタート予測を「予想に使う」へ
第20話〜
ここから、少し開発の考え方が変わってきました。
これまでの検証では、
「過去のデータから、今回のスタート順位をどこまで予測できるのか?」
ということを考えてきました。
しかし、スタート順位を正確に当てること自体が、競艇AIの最終目的ではありません。
最終的に作りたいのは、
「競艇のレース結果を予測し、買う価値のあるレースや買い目を判断できるAI」
です。
そこで、スタート予測を単独で完成させるのではなく、
既存の予想ロジック × スタート・スリット情報
という形で活用できないかを考えるようになりました。
さらに、すべてのレースを予想するのではなく、
「予想しやすいレースを選ぶ」
というレース選別の考え方も取り入れていきます。
この段階では、
「的中率を高めること」
だけではなく、
「買う価値のあるレースを選び、回収率を高めること」
も重要なテーマとして考えています。
まだ検証途中なので、この考え方が本当に有効なのかは分かりません。
ただ、実際のデータを使って試してみることで、
「当てるAIを作る」
だけではない、別の方向が見えてきました。
Phase 5の記事
競艇AI開発日記 第20話|過去のスタート特性から、6艇のスタートを予測してみる
競艇AI開発日記 第21話|スタート予測を「当てる」から「予想に使う」へ
競艇AI開発日記 第22話|「イン逃げ有利・不利」をどう定義する? スリットから考えてみる
競艇AI開発日記 第23話|「イン逃げ不利」の仮説をデータで検証してみました
競艇AI開発日記 第24話|「イン逃げ有利・不利」を予測するための材料を探す
競艇AI開発日記 第25話|平均STに「ばらつき」を加えれば、予測は良くなる?
競艇AI開発日記 第26話|競艇のスタートは本当に「6艇それぞれ独立」なのか?
競艇AI開発日記 第28話|選手同士の「連動性」をAIに入れてみる
競艇AI開発日記 第29話|グループ全体ではなく1号艇を見る
競艇AI開発日記 第30話|特徴量探索を止めてVer.1を作る
競艇AI開発日記 第31話|AIを予想に組み込んだら、回収率が下がった
この先も続きます
ここまで読んでいただくと、
「じゃあ、結局どんなAIができたの?」
と思うかもしれません。
でも、まだ完成していません。
むしろ現在は、
「スタートに関する情報を、最終的な予想にどう使うのか」
を探している途中です。
これからも新しい特徴量を試したり、データの見方を変えたり、レース選別の方法を考えたりしながら、開発を進めていきます。
もちろん、試した結果がうまくいくとは限りません。
「この方法なら良さそう」と思っても、実際にデータを確認するとそうでもないことがあります。
逆に、あまり期待していなかった方法から、思わぬ結果が出ることもあります。
それでも、
「仮説を立てる → データを見る → AIで試す → 結果を見る → また考える」
という過程そのものを、このブログに残していくつもりです。
最初はPythonで自分の予想を形にするところから始まりました。
そこからデータ分析や機械学習へ進み、現在は、
「自分が予想で重視している考え方を、AIやプログラムにどこまで落とし込めるのか」
というところまで来ました。
この先、どんなAIになるのか。
自分自身もまだ分かっていません。
最初から読むなら
このシリーズを初めて読む方は、第1話から順番に読むのがおすすめです。
最初は「自分の予想をPythonで再現してみる」というところから始まり、少しずつデータ分析やAI開発へ進んでいきます。
途中から読んでも内容は分かりますが、最初の「自分の予想をPythonで形にしてみたい」というところから追っていくと、現在の開発状況までの変化がより分かりやすいと思います。
第1話から読む