見出し画像

機械学習歴3ヶ月の素人がAIで競艇を攻略する (3)【特徴量作成その1】

❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎

このnoteは、プログラミング初心者から機械学習勉強中の方
競艇で不労所得を目指したい方に向けて、
「競艇で機械学習をお試しする」ハードルを下げまくるためのnoteです。

❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎ ❇︎

このnoteは機械学習歴3ヶ月の素人がAIで競艇を攻略する (2)のつづきとなっています。
未読の方は先に読んでいただくと流れがわかりやすいかもしれません。

1. 今回やること

前回は公式サイトからスクレイピングして学習するための過去データを取得しました。
スクレイピング作業がめんどくさいという方は、前の記事筆者がスクレイピングしたのち前処理を施したファイルを載せてありますのでそちらからダウンロードいただけます。


今後は過去データから特徴量を作成し、モデルを構築していきます。

今後の流れ
a. スクレイピングをして過去データを取得する。 ⇦済
b. 特徴量の作成をしていく
 (ここが長くなると思います)
c. 予測を行う
d. 買い目の選択を行う

今回からは b の特徴量作成に踏み込んでいきましょう。
今回は特に、実際のコードではなく作成する特徴量の概要を説明します。
( 実際のコードは別記事で読めるようにします。(後日))


2. 作成したモデル概要の復習

特徴量の紹介に先んじて、改めて学習モデルの説明をすると、
以下のような構造になっています。

画像1

レースコードは全レースに振ったIDで、レースが一意に定まるようにしています。
初心者の方向けにざっくりと説明すると、
右端の「着順」が目的変数と呼ばれ、最終的に予測したいもの。
それ以外の部分が説明変数特徴量と呼ばれ、予測のために学習に使用するものです。

ただし、今回は予測を「2位以内に入っているかどうか」二値分類モデルにしています。

では、特徴量を紹介します。


3. 特徴量の紹介

大まかに、スクレイピングしたデータから加工せずに使用するもの加工するもの新しく作るもの3つに分けて紹介したいと思います。


【加工せずに使用するもの】

「艇番、選手の登録番号、年齢、支部、体重、風速、波の高さ」
はそのまま使用しました。
これらは学習における重要度はあまり高くなかったですね。



【加工するもの】

これはさらに大きく2つのタイプがあります。


① 偏差値を算出するタイプ

「全国勝率、全国2連対率、当地勝率、当地2連対率、モーター2連対率、ボート2連対率、級別」
出走する6艇の中でそれぞれ偏差値を算出したものを特徴量としました。

級別は各選手が戦績の良い順にA1、A2、B1、B2の4段階に分けられているものです。
今回はそれぞれを1、2、3、4の数値型に変換したあと偏差値を算出しました。

これをすることで、単純な勝率の大小ではなく、他の5艇と比較した場合の勝率などの良し悪しを考えることができます。


② 交互作用を明示化するタイプ

交互作用とは、複数の特徴量の組み合わせによる、目的変数に対する相乗効果のことです。

漫画『モンキーターン』で競艇の勉強をしたところ、競艇場によってイン有利や荒れやすさなどが異なるようです。

LightGBMでは何もしなくても交互作用をある程度考慮してくれるらしい(?)
のですが、実際に学習させてみると微妙そうだったので、

「レース場、艇番、風向き」

に関しては交互作用特徴量を追加して明示的に学習させるようにしました。

つまり、「大村のインは強い」を機械が学習してくれるわけです。

現在はこの3つでしか交互作用特徴量を作っていませんが、天候やレース距離、波の高さなどでも作ってみると精度が上がりそうです。

もっと競艇に詳しくなって効果的な交互作用を思いつきたい!


【新しく作るもの】

紹介したいメインです。
今回は概要だけ。詳細は次以降のnoteで書きます!


① 選手、モーターのレート
② 選手の調子指標
を新しく作り、特徴量としました。


① 選手、モーターのレート

勝率や2連対率で選手やモーターの大まかな強さはわかりますが、
レースの瞬間の強さは数字に表れて来づらいです。

そこで、レーティングを算出してその瞬間の強さを数値化しました。

このアイデアは前の記事でも紹介したKaggle用の技術書にも書かれています。


レート算出に使用したのは「TrueSkill」です。

TrueSkillはMicrosoft社が開発したレーティングアルゴリズムで、ゲームのマッチング用に開発されています。
ELOレーティングという、チェスの強さ数値化のために開発されたレーティングアルゴリズムが以前は普及していたようですが、TrueSkillは3人以上でプレーするゲームも想定して設計している点などで優れているようです。

また、コンピューターゲームのレーティング用であるため、回線落ちの影響を考慮することができます
(ex. 回線落ちをして負けたプレーヤーはレート下降の幅が抑えられる)

具体的な使い方は偉大な先人の記事を参考にしてください。
私の実際のコードは別記事で確認できるようにします。(後日)

これを利用して選手のレートとモーターのレートを算出しました。

選手とモーターの強さはどちらも重要な要素なのですが、選手の強さのおかげで勝ったモーターの強さを過大評価すると良くないです。
そこで、回線落ちを考慮する計算を利用することで、一方の強さに依存しない強さを評価するようにしました。

他にも、モーターの交換時期 (各競艇場は年に一回モーターを新しくする)なども考慮するなどしてレートを算出しました。


② 調子指標

各選手がその時参加しているタイトル戦の期間中でどのくらいの調子の良さなのかを数値化したものです。

Youtubeで競艇の動画を漁っていたとき、とあるYoutubeチャンネルさんで紹介されていたものを参考にさせていただきました。

簡単に言えば、イン (1号艇側) 有利である競艇で、艇番からどれだけ着順を上げたかを計算します。
(ex. 6号艇が1着ゴールなら6⇨1に着順を上げている)

具体的な計算内容は下記動画をどうぞ。

実際のコードは後日別記事を公開する予定ですので是非ご覧ください!



4. まとめ

今回はスクレイピングした過去データの内容確認から、作成した特徴量の概要までを紹介しました。

長くなってしまいましたが、次回から実際のコードを紹介しながらモデルを構築していきたいと思います。
初心者の方や、ただ不労所得を目指したい方はぜひ次回からのコードをコピペしてください!

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

ぜひ次回も読んでくださいね。

執筆モチベーションになるのでスキ♡やサポートなどいただけると嬉しいです。


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