見出し画像

機械学習歴3ヶ月の素人がAIで競艇を攻略したかもしれない話

このnoteは機械学習歴3ヶ月の素人がAIで競艇を攻略する(1)~(7)(随時更新/2022.05.28最終更新)をまとめたものです。

価格はそれぞれの記事を買うよりも低くなっています。
また、本noteを購入しておけば随時更新される記事を追加料金なしで読めるようになっています。(本記事にどんどん追加していきます)

1. はじめに

こんにちは。ボットレです。
筆者は大学生なのですが、最近授業もなく暇なので機械学習の勉強をはじめました。
とはいえ、普通にやっていてもつまらなかったので、どうせなら競艇でボロ儲けを目指すことにしたわけです。

このnoteではその軌跡を紹介しながらプログラミング初心者の方に向けて機械学習の勉強の一助となるような情報を発信していく予定です。


プログラミング初心者の方や、競艇で勝ちたいために読んでくださっている方々には競艇AIづくりの道標、機械学習上級者の方には初心者の学習奮闘記として楽しんでいただきたいと思っています。


2. ボロ儲けはできたのか

結論ですが、今(2021.09.17)はフォワードテストをしている段階で、
確実に勝てそうだと言えるデータは集まっていません。

しかし、バックテスト (過去データで試してみること) では期待できそうな結果を出すことができたのでご紹介します。

・目標
回収率100%以上を出すこと」

・結果
まだまだモデルのアップデートの余地があるので現状の結果ですが、
約1年ほどのレースで回収率104%程度を出しています。
( 詳細 )
購 入 馬 券 ・・・三連単 (1,2,3位を順番まで当てる買い方)
 的中率 ・・・2.4% ( 舟券1枚あたり )
平均払戻額・・・4,527円 (45.27倍)
最高払戻額・・・18,280円 (182.8倍)
最低払戻額・・・970円 (9.7倍)

インコースが逃げ切って勝つガチガチのレースと予測したレースを買うと配当の低さから回収率95%程度しか出せなかったため、中穴の馬券を狙う買い方にしています。

三連単は全部で120通りなのでランダムに買うと0.8%の的中率となります。
なので、それと比べると的中率をあげられているかなという結果です。

具体的なモデルについては以降で紹介していますのでぜひご覧ください。


3. 本noteの概要

ぶっちゃけるとこのnoteは、邪な気持ち半分で書いています

モデルは作成したので、実際に毎日稼働させるためのコードを書いたりする間に、モチベーションになるような小銭でも集められたらいいなという感じです。

まあ、つくったものをみてもらいたいだけという思いもあるので必ずしもお金が入らなくてもいいのですが...。

残りの半分は、プログラミング初心者の方の役に立ちたいという思いです。
筆者はこれまで何度かプログラミングの勉強に挑戦しましたが、全て速攻で挫折してきました。
しかし、ギャンブルの機械学習という領域は、モチベーションの保ちやすさが段違いです。初めてプログラミング学習が長く続いているこの感動を、これまで挫折してきた同志の方々に分けられたらなと思っています。


このnoteでは、
モデルのコンセプト
使用した特徴量
実際のコード
(・実際の買い目予想 )
などを順次公開していくことを考えています。

実際のコードや使用しているデータなどはダウンロード/コピペできるようにしていく予定ですので、気楽についてきていただければ嬉しいです。

プログラミング初心者で機械学習に興味がある方競艇が好きで勝てるようになりたい方は是非読んでいただけたらと思います。

・なぜ競艇の予測をすることにしたか?
まずはギャンブルが好きだったからです。
初めはもともと好きだった競馬でトライしてみたのですが、あまりうまくいかなかったため競艇に切り替えました。

・競艇の良さ
以下の理由から、個人的に競艇は機械学習に向いていると思っています。

a. 競馬に比べてレース数が多い (毎日100レース超)
b. 毎レース6艇立てのため、出頭数の変わる競馬に比べて学習させやすい
c. 馬と騎手のふたつの要素の影響を受ける競馬より、レーサーの要素が大きいため学習させやすい
d. 同じ選手が何度もレースするため学習データが蓄積されている


4. 筆者のスキルレベル

筆者のプログラミングスキルは本当に素人です。
授業程度の知識で、pythonはほとんど触ったことがなかったです。
玄人の読者の方々には稚拙なコードをお見せすることになるかもしれませんが、初心者の方を勇気づけられる内容になれば嬉しいです。

用語の使い方やコードの誤り等ありましたらどんどんご指摘ください。

ー競艇で機械学習モデルを作る前にやったことー
・Kaggle (機械学習のコンペ)のTitanicに触れてみる
 友人に教えてもらいながら、ほとんど写経で機械学習を経験
Pandasの基礎を軽く勉強する
Pandas100本ノックを参考
 ※ Pandas:データ分析用のライブラリ
・競馬を題材にモデル作成の練習をする
YouTubeチャンネル「競馬予想で始めるデータ分析・機械学習」を参考
 →スクレイピングとモデル作成の基本を学んだ
 ※ スクレイピング:Web上からデータを収集してくること

以上を二ヶ月程度で行い、一ヶ月ほどで競艇のモデル作成を行いました。

私は以上の流れで勉強しましたが、初心者の方はまずTitanicで機械学習の流れを知ったあと、実際に手を動かしながら悩んだところでググってみることを繰り返していくのがいいかと思います。

Titanicはネットにたくさんやり方が紹介されていますので見てみてください。

あとは、Kaggle用の本ではありますが以下の本も勉強になりました。
こちらは理論的なことは抜きにしてとりあえず機械学習をするにあたって役に立つワザをたくさん教えてくれる本です。
なんとなく難しそうな感じがしますが、読んでみると意外と機械学習の基本的なことから書かれているため初心者でも読みやすいです。

これらに取り組んだ結果、競艇と同時並行で手を出してみた、初めての機械学習コンペで3位に入賞することができました (嬉しい)

スクリーンショット 2021-09-17 16.59.48

やはり競艇はいい教材だと思います。


ただ、本noteではほとんど知識なしでもついてこれるようにしたいと思っておりますのでお気楽に読んでいただければ幸いです。


5. モデルのコンセプト

使用した言語はpythonです。
理由は特にありません。みんな使っているっぽいからです。
(調べたところ、「機械学習のフレームワークやライブラリが豊富にあること」が大きな理由みたいですね)

公式サイトから過去3~4年分ほどのレースデータを収集し、約2~3年分を学習データ、約1年分をテストデータとしてモデルを組みました。

モデルとしては、過去データの各レースにおいて選手1人1人に関するパラメータを特徴量とし、その選手が2着以内に入ったかどうかを目的変数とする二値分類モデルを作成しました。

予測器はLightGBMを使用しました。
理由はLightGBMが非Deepでトップクラスに精度が高く、かつ高速であると聞いたからです。
また、Deep Learningが勉強中であったためです。なんとなく勉強ができたらDeep Learningも使ってみたいと思っています。

予測器からは「その選手がn着以内に入る確率」​が 0~1で出力されるようにしています。
出場する6艇の選手間でこの出力値の偏差値を計算してその大小を元に購入する舟券を決定しています。


6. スクレイピングしてみよう

スクレイピングとは、簡単に言えばプログラムを書いてブラウザを動かし、Web上からデータを取ってくることです。

今回は、学習させるために必要なデータを「BOAT RACEオフィシャルサイト」から取ってくることを考えます。

このサイトは一日単位でレースデータをまとめてダウンロードできるようにしてくれているのでとても助かります。
( 競馬の時は各レースの結果ページなどからひとつひとつスクレイピングしなければいけなかったので本当に助かる!)
(ただ、ダウンロードできるファイル形式の都合上、逆に増えてしまう作業もあってややこしいのですが...)

ここでは、Google Colaboratoryを利用しています。
初心者の方でも取り組みやすいと思いますので是非やってみてください。
(詳しい使い方などは他noteやQiitaにお任せします。ググってみてください)

実際のコードを書こうかと思ったのですが、私自身あるサイトのコードをほとんど丸パクりしてスクレイピングをしたので、ここではそのサイトを紹介させていただきます。

以下のリンクのコードを、適宜ディレクトリ名などを変更してコピペして実行してください。(以降の作業との関係上、他のページの作業は行わないでください。)
非常にわかりやすいブログですので、しっかりと読めば誰でもできるはずです。頑張ってください。

レース払い戻し結果のダウンロード
手順①手順②手順③
番組表(出走表)のダウンロード
手順①手順②手順③
レース結果詳細の取得
手順①

以上を実行することで、3つのCSVファイルを作成することができたかと思います。

めんどくさい方向けに完成品 (+前処理をしたもの)をこの後に載せていますのでそちらからもどうぞ!

7. スクレイピングしたデータの確認

スクレイピングした過去データの内容を確認しておきます。

プログラミング初心者の方などはあまりしっかり見なくても大丈夫です。

色々出てきてややこしいかもしれませんが、太字にした項目をモデル作成に使用します。

【results.csv】

名前は違うかもしれませんが、払い戻しデータが入ったCSVファイルです。
pd.read_csvをしてcolumsを見てみると、下のようになっていると思います。

'タイトル', '日次', 'レース日', 'レース場', 'レース回', '3連単_組番', '3連単_払戻金', '3連複_組番', '3連複_払戻金', '2連単_組番', '2連単_払戻金', '2連複_組番', '2連複_払戻金'

これは最後に回収率をシミュレーションする際に使います。


【results_YYYYMMDD-YYYYMMDD.csv】

名前は違うかもしれませんが、レースの詳細データが入ったCSVファイルです。
pd.read_csvをしてcolumsを見てみると、下のようになっていると思います。

'レースコード', 'タイトル', '日次', 'レース日', 'レース場', 'レース回', 'レース名', '距離(m)', '天候',
'風向',
...
'6着_艇番', '6着_登録番号', '6着_選手名', '6着_モーター番号', '6着_ボート番号', '6着_展示タイム',
'6着_進入コース', '6着_スタートタイミング', '6着_レースタイム'

カラムが100個もありますが、レースの情報として以下の情報があり、

'タイトル', '日次', 'レース日', 'レース場', 'レース回', 'レース名', '距離(m)', '天候', '風向', '風速(m)', '波の高さ(cm)', '決まり手'

1着だった艇から6着だった艇のそれぞれに関して以下の情報があります。

'着順', '艇番', '登録番号', '選手名', 'モーター番号', 'ボート番号', '展示タイム', '進入コース', 'スタートタイミング', 'レースタイム'

あとは[results.csv]と重複する内容が入っていますね。


【timetable_YYYYMMDD-YYYYMMDD.csv】

名前は違うかもしれませんが、番組表データが入ったCSVファイルです。
pd.read_csvをしてcolumsを見てみると、下のようになっていると思います。

'タイトル', '日次', 'レース日', 'レース場', 'レース回', 'レース名', '距離(m)', '電話投票締切予定',
'1枠_艇番', '1枠_登録番号',
...
'6枠_今節成績_2-2', '6枠_今節成績_3-1', '6枠_今節成績_3-2', '6枠_今節成績_4-1',
'6枠_今節成績_4-2', '6枠_今節成績_5-1', '6枠_今節成績_5-2', '6枠_今節成績_6-1',
'6枠_今節成績_6-2', '6枠_早見'

これも176種類のカラムがあって頭が痛くなりますが、
レース情報として以下の情報があり

'タイトル', '日次', 'レース日', 'レース場', 'レース回', 'レース名', '距離(m)', '電話投票締切予定'

1枠から6枠までの選手に関して以下の情報があります。

'艇番', '登録番号', '選手名', '年齢', '支部', '体重', '級別'
'全国勝率', '全国2連対率', '当地勝率', '当地2連対率'
'モーター番号', 'モーター2連対率', 'ボート番号', 'ボート2連対率',
 '今節成績_1-1', '1枠_今節成績_1-2', '今節成績_2-1', '今節成績_2-2', '今節成績_3-1', '今節成績_3-2', '今節成績_4-1', '今節成績_4-2', '今節成績_5-1', '今節成績_5-2', '今節成績_6-1', '今節成績_6-2', '早見'

早見とは、同じ日に複数のレースに出走している場合にそれが何レース目かわかるものです。


以上が前回スクレイピングして取得した過去データの中身です。

めんどくさい方向けに完成品 (+前処理をしたもの)を下に載せていますのでそちらからもどうぞ!

次回からは、上記の太字にした項目をベースに特徴量を用意していきましょう。


↓↓ 配布用CSVファイルはコチラ! ↓↓

ここから先は

41,516字 / 6画像 / 3ファイル

¥ 2,780

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