Colaboratoryで競馬のAI予想

こんにちは。Cu Dhubです。

3月頃から在宅勤務になり、浮いた通勤時間で何かしようと思い立ちました。以前からビッグデータ解析による競馬の予想をしていたのですが、的中率があまりにも低く、そろそろ別のやり方を考えねばと思っていたところだったので、いっそ機械学習を勉強してAI化してしまおうと、この本を買いました。

読んだのは2章の「教師あり学習」までで、3章は「教師なし学習」なのでとりあえずいいかなと後回し。4〜6章は「データの表現と特徴量エンジニアリング」「モデルの評価と改良」「アルゴリズムチェーンとパイプライン」なので、予想結果の分析や改良には読んでおいた方がいい内容なのですが、しばらく運用して課題が見えたところで読めばいいかと思い、こちらも後回しにしています。

今できていること

2章までの学習で、すでに「2クラス分類による予想」をするAIを開発することができています。具体的には、過去のレースデータを訓練データとして、レース結果を「1着になった/ならない」に分類。予想するレースのデータをテストデータとして、その馬が「1着になるか/ならないか」を予測します。「1着になるか」だけだと予測結果を返さないことが多いので、「2着以内に入るか/入らないか」〜「5着以内に入るか/入らないか」をそれぞれ分析するようにしました。特徴量としては「騎乗する騎手の勝率」「調教師の勝率」「父馬の種牡馬としての勝率」「前走の上がり3ハロンタイム」などを渡しています。

今抱えている課題

上記のやり方だと、レースによって予想結果にばらつきが出てしまいます。たとえば有力馬が多く出走するG1レースでは、かなり多くの馬が「1〜5着に入る馬」として返されます。逆に新馬戦や未勝利戦などではほとんど結果が返されません。私が主に予想するのは重賞レースのため、多くの馬を返されてしまうとどれを本命にしていいのか判断できません。最近は本命馬を定めず、返ってきた馬のボックス馬券を買っているのですが、それも5頭までで、それ以上となると別の方法で頭数を絞らざるを得ません。

今回やりたいこと

「クラス分類」ではなく「回帰」を使いたいと思いました。
結果を数値として返すとなると、まず思いつくのは「走破タイム予測」です。「この馬は今回のレースを何分何秒で走るのか」が分かるのなら、それを昇順にソートすれば予想結果の完成です。ただ、タイムによる予測は、AIがない時代でも行われていたので、わざわざAIを使わなくても、という思いもありますが、使用する特徴量などを工夫することでオリジナリティを出そうと考えています。

また、今までは自分のパソコン上に開発環境を構築していましたが、最近Googleの「Colaboratory」が非常に気になっているので、使ってみようと思います。※詳しくは後述

前提となる知識・スキル

プログラミング、数学、競馬などに対して、私と同程度の知識やスキルを持っている人向けの記事です。AIや機械学習に精通した方には馬鹿馬鹿しい内容かもしれませんのでスルーしてください。現在の私の知識・スキルは以下の通りです。

・プログラミング歴はJavaを中心に25年
・競馬歴は15年
・大学(工学部/情報工学科)時代の専攻は統計学と離散数学
・Pythonの経験は上記テキストの2章までの演習のみ
・Colaboratoryは初めて

Colaboratoryについて

詳しい説明は上記のリンクから。コードとテキストをひとつのドキュメント(ノートブック)に記載できるのが特徴的です。自分のために作るプログラムの場合、ドキュメントをほとんど残さない(せいぜいソースコメントのみ)ため、これは画期的だと思いました。

ここから先は

せっかくテキストを残せるなら、ここから先はColaboratoryで書こうと思います。以下のリンクから参照してください。閲覧権限のみ付与しています。

TARGET frontier JVからのCSV出力方法

Colaboratoryに画像を貼り付けるのが大変(ローカルの画像をアップロードできない)だったので、こちらに記載します。

画像1

メインメニューから「開催成績CSV出力」を選択します。

画像2

開催成績選択を開き、出力したい年の開催を選択します。上記は2020年のすべての開催成績を出力する場合です。

画像3

出力内容として「成績フルセットデータ」を選択し、出力ファイル名を入力して「出力開始」ボタンを押します。

画像4

次に出馬表の出力です。メインメニューから出馬表を開き、画面下の「一括出力」ボタンを押します。

画像5

「出馬表分析(CSV形式)」を選択します。

画像6

対象レースの選択画面でOKを押します。

この記事が気に入ったらサポートをしてみませんか?