2019.09.11

【AITech #2】競艇順位予想AIを作ってみた

はじめに

初めまして、AI事業開発部の湯原と申します。
私たちAI事業開発部では、社内に向けたAIの啓蒙活動と、社外への情報発信を主な目的として、「AIを使ってとにかく面白そうな事をやってみる」という活動を本気で実施しています。
今回はランク学習というアルゴリズムを利用して「競艇順位予想AI」の開発にチャレンジしました。

※前回の記事:【AITech #1】AIに本気の作詞をさせてみた

なんで競艇?

さて、読者の皆さんは「競艇順位予想AI」と聞いて一つ疑問が浮かび上がると思います。「なんで競艇を選んだのか?」と。

競艇を選んだ一番の理由として「年間のレース回数が多いこと」が挙げられます。調べてびっくりしたのですが競艇は雨が降ろうが雪が降ろうがレースが行われており、また全国各地のボートレース場でほぼ毎日どこかでレースが開催されています。
こちらで2018年のレース数を集計したところ、54511回のレースが開催されているようです。

一般的にデータが多ければ多いほど機械学習に向いています。ほぼ毎日のレース結果がある=データが大量に存在するということは競艇はAIでの予測に向いていると考えました。

そして、2番目の理由は「モーターボートは機械であるため不確実性が低いこと」です。

レーサーの成績や勝率はその日のコンディションなどの様々な要素が絡み合い、左右されるのではとなんとなく想像できると思います。(もちろんレーサーはプロであるため一定の成績を残せるよう訓練して不確実性を減らしているということは認識しています)
それとは対象的にモーターとボートの性能が日によって変わるのではなく、ある程度一定の性能を発揮できると仮定できると考え、予測しやすくなるのではと考えました。

余談になりますが2012年4月より以前の競艇では持ちペラ制度という選手個人でカスタマイズしたプロペラを持ち込んでよかった時期がありました。またその持ち込んだプロペラの性能が競技結果に大きな影響を与えていたそうです。2012年4月以降持ちペラ制度は禁止になり、各競艇場がプロペラを用意するルールに変更されました。という話も上記の理由の一因になっています。

2012年4月より現行の選手持ちペラ制度を廃止し、各競艇場がモーター一基につきナカシマプロペラ・ヤマト発動機のプロペラを1枚ずつ配備する制度が施行された

Wikipedia – 競艇 – 持ちペラ制

ランク学習とは

冒頭でお伝えした通り、今回は「ランク学習」というアルゴリズムを利用しています。
ランク学習というワードは聞き慣れないかと思いますが、皆さんが日常的に使われているGoogle検索のような検索システムが具体例に挙がります。
例えば「トライフォート」と検索したときに検索キーワードと関連度が高い順に並べられたWebページのURLが結果として表示されます。

google_trifort

このように、あるクエリに対する結果の順序(ランク)を予測をすることがランク学習の目的となります。

クエリというものは自由度が高く、検索システムではキーワードでしたが競艇では1レースをクエリとして考えます。検索システムでは大量の記事の順位を結果として返すものでしたが競艇の場合はレーサーが6人で固定されているため、1位から6位までの順位を結果として返します。
rank

なんでランク学習を使うのか

ではなぜ、今回のチャレンジで、ランク学習を選んだのか。
それは、「順位」を学習してほしいと考えたからです。もちろん分類問題として1位や2位の確率をそれぞれ求めたり、回帰問題として1位から6位までの値を0から1までの値に正規化した値をある閾値毎に例えば0から0.5までを1位・・・とおいて解くこともできます。ただそれらは結果を見た僕らが順位毎の確率を見て並び替える必要があったり閾値を設定したりと、最終的に予測したい順位を求めるまでに一工夫する必要があります。
ご説明した通り、ランク学習はクエリに対して順位を返します。さきほど挙げた一工夫も含めて学習してくれるわけです。これが分類問題や回帰問題ではなく、ランク学習を選んだ理由です。

学習に至るまでの準備

学習に用いるデータは競艇公式サイトのBOAT RACE – ダウンロード・他、こちらのリンク先にあります競走成績を使いました。
1レース毎の結果がこんな感じに表データとして格納されています。こちら順位でソートされていますので上から1位、2位、3位・・・6位という順位になっています。
boat_race_result
この表にのっているデータ全てを学習に使ったわけではなくスタートタイミングとレースタイムはレースが終わらないとわからない情報なので学習には使っていません。

またコース場毎の特性を考慮する必要があると考え、学習に使うデータのレース場は唐津に固定しています。

さらっと流しましたがこちらの表データ、もともとテキストファイルに表データっぽく出力されているものでこれをCSV形式に変換させる処理にだいぶ苦労しました(汗

実際にレース結果を予測してみた

予測対象のレースはこちらにしました。ブログ執筆時が8月15日でしたので当日のレースを対象にしています。
BOAT RACE 唐津 – 2019/08/15 – 1R出走表

結果は・・・・
・・・
・・・
1位と2位を当てることができました!すごい!

AIが出した予測と実際のレース結果との比較表を掲載しておきます。
boat_race_result_1

実際のレース結果はこちらになります。
BOAT RACE 唐津 – 2019/08/15 – 1Rレース結果

さすがにまぐれ当たりじゃないかと言われそうなので8月15日に行われた別の2レースも予測してみました。

こちらが2レース目の結果になります。
あれ?・・・3位と6位は当てられているのですがこれはさすがに外れですね・・・残念。

boat_race_result_2

こちらは実際のレースの出走表とレース結果です。
BOAT RACE 唐津 – 2019/08/15 – 2R出走表

BOAT RACE 唐津 – 2019/08/15 – 2Rレース結果

最後に3レース目の結果になります。
うーん・・・ぴたりと順位を当てているわけではないですが3位まで入賞する選手を予測できています。
この場合舟券の買い方を工夫(3連複など)してていれば儲けが出てくれていそうですね。
boat_race_result_3

こちらは実際のレースの出走表とレース結果です。
BOAT RACE 唐津 – 2019/08/15 – 3R出走表

BOAT RACE 唐津 – 2019/08/15 – 3Rレース結果

別のレースの結果はどうなのと気になるところですが今回は「予想AIの序章」ということでこの程度でとどめておきます。
私の感想として簡単な特徴量のみを使うだけでそれなりに予測が当たってくれていて大満足な結果でした。

振り返り

この競艇順位予測AIを作ったあとに気づいたこととして、1コース(一番内側のコース)の選手が1位になる確率はコースごとにばらつきはありますが約50%あり、とりあえず1コースを選んでおけば約50%の確率で当たるわけですね。(ただしそんなことは周知の事実のためオッズ(倍率)は低くなりリターンもあまり期待できません)
参考情報として多摩川ボートレース場のコース別入着率のリンクを貼っておきます。

2019/08/15 現在1コースの入着率は56.5%

BOAT RACE – 多摩川コース場 – コース別入着率

そういう情報を加味すると1位から6位まで全てを当てるという課題設定をするのではなく、1位は1コースがなるとし2位3位を当てるような課題設定をしたほうが精度が出るのではないかという仮説が湧き上がってきました。
また今回学習に使ったデータとしてレーサーの登録番号やモーターやボート、コースの長さなどの簡単なもののみを使って予測したということもあり精度が出なかったと考えています。出走表も見るとレーサー毎に体重や年齢、級(レーサーランクのことです)、モーター・ボード毎の勝率も記載されており、これらを追加のデータとして使うだけでも精度が上がりそうだと思いました。

以上の反省を踏まえまして次の記事ではパワーアップした競艇順位予想AIをお披露目したいと考えております。

最後まで読んでいただきありがとうございました。

トライフォートで働きませんか?

トライフォートで働きませんか?
弊社ではエンジニア、デザイナー、ディレクター、プランナーを随時募集しています。
ゲームやサービスが好きで、新しいことにチャレンジしたい、世界に強いインパクトを残したい、という人を探しています!
我こそは、という人は是非ご応募ください!