見出し画像

プログラミング知識ほぼゼロの自分が競馬AIを作ってみた話

AIすごい

ずっと前から「競馬AIを作ってみたい」と思っていました。
とはいえ、プログラミング経験は大昔に学校で触ったBASICのみ(古い!)。何度かチャレンジしてみたものの、延期という名の放置プレイ。

そんな中、彗星のように現れたのがAI。
「なんだコイツ……コード書いてくれるぞ!?」という衝撃から始まり、気づけばPythonで競馬AIを作っていました。
今年に入って本格的に取り組み始め、ようやく形になってきたところです。

※正確には「競馬AI」というより、単なる機械学習ですが、ここでは便宜的に競馬AIと呼びます。
※コードなどの詳細な記述はありません。サラッと書いていますが、実際は相当な悪戦苦闘をしてます

作業環境

・python
・jupyter notebook
・型落ちPC
・JRA-van, ターゲットフロンティア

情報収集

 まず必要なのは「競馬データ」。
Copilot様に相談して、最初は netkeibaのスクレイピング に挑戦しました。

……が、挫折。

理由は、サイトの構造が変更されており、動的スクレイピングが必要になったためです。
処理が重すぎてPCが唸るし、過去数年分のデータを集めるには時間も手間もかかりすぎました。
(※しかもアクセスしすぎるとブロックされます。 1〜2日おきが限度っぽいです)

というわけで、現在は**JRA-VAN(有料)**を使っています。

データ整形

 せっかくお布施をしているので直近5年分の効きそうなデータを取得。なぜ5年かは勘です。

学習させるエクセルデータ

ターゲットで取得したいカラム(特徴量)を選択し、こんな感じのデータを取得する。これを数値として学習させたい特徴量→numeric, カテゴリとして学習させたい特徴量→categoricalに変換し、LightGBMに突っ込む。

そのままでは効果の無さそうな特徴量も掛け合わせたりして新特徴量にしたりすると効いたりします。(例えば種牡馬x馬場→馬場適性とか)
LightGBMの仕組みは……正直ふんわりしか分かっていません。
そこはAI様に頼りましょう。うむ。

学習

 自分の場合は、
・場所(中山とか阪神とか)
・距離
・芝orダート
を掛け合わせてコースを作成し、コース別に学習。

クラスは競馬AIで定番の3クラス分類
・1着確率
・2-3着確率
・4-着確率
としました。ちなみにオッズを学習させてしまうと予想がオッズに寄りすぎになってしまったのでオッズは抜いています。

重要度

重要度(どの特徴量が分類にどれくらい効いているか)はこんな感じ。jra-vanの提供している指数が効きまくってます。もう指数で買えばいいんじゃね?……と思いきや、それでも拾えない馬がいるのが競馬の奥深さ。

だからこそ、次は「指数で拾えない穴馬」の話をしていこうと思います。
続く…つもり(続いた↓)


先日の皐月賞の予想】
中山 11R 皐月賞G1
◎ 5 ジョバンニ(odds 23.4)
○ 6 マスカレードボール(odds 13.7)
× 12 ドラゴンブースト(odds 244.6)
× 1 ニシノエージェント(odds 91.1)
× 18 マジックサンズ(odds 201.5)
結果11-10-6-5-16
 当たってねえ…でも3,4着と6着の18を拾っているので結構満足。

↓予想は以下で公開したりしなかったりしています。


いいなと思ったら応援しよう!