競艇AIの機械学習モデルとしての精度
・機械学習に興味がある人
・実際に競艇モデルを作ってみたい人
・自分で作ったモデルの性能比較をしたい人
はじめに
ここでは「艇ラボ」で使われている機械学習モデルについて記載します。
モデルの具体的な作成方法(コーディング等)についてではなく、特徴量の種類や得られる性能についてがメインとなります。
また、機械学習を経験した人を対象として言葉を使いますので、不明な単語等はググってください。とはいえ検索しやすいように、少しはリンクも貼るように留意します。
学習モデル
特徴量
まず、いくつかモデルを作成していますが、入力している特徴量は全て同一のものを使用しています。特徴量の種類としては下記です。
- 選手関連
- 身体情報(年齢、身長、体重)
- 階級
- 勝率
- 平均スタート
- 平均周回タイム
- モーター
- モーター勝率
- モーター展示タイム
- レース
- グレード
- タイトル種別(女子戦とか)
- レース種別(優勝戦とか)
これらを、年間とか場別とか節間とかで平均や順位や分散を算出し、特徴量としています。
同一の特徴量を使用している点に関して、自分の感覚ですが、基本的には機械学習アルゴリズム側で使える特徴量を選択できるように詰め込むだけ詰め込んでおけば良い、という考えの人間です。
※重複している項目は相関係数とかでカットしてくださいね!
また、別の記事でも述べましたが、当日のあらゆるデータ(前日から決定しているものは除く)は使用していません。例えば下記のようなデータです。
- 天気、気温、水温
- 部品交換、展示コース取り、展示時スタートタイム、展示タイム
- 最終オッズ、本番スタート、本番コース取り
※使った方が良くなるのはわかっていますが、最終目標としては当日の朝に期待できるレースを買って収支を稼げないかなあと思っています。
モデル概要
次にモデルの種類ですが、教師ありのニクラス分類モデルです。多クラスや回帰は学習が難しくなりやすく、一番シンプルなのがニ値分類(という個人的な感覚)なのでそうしています。
回帰は時間がかかりますしね…。比較したわけではないので、いつか比較検証します。
ちなみにざっくりモデル概要を表にすると
アルゴリズム | LightGBM |
---|---|
モデルタイプ | 教師あり2値分類 |
特徴数 | 10000 |
学習データ数 | 400000(2012年〜2018年) |
テストデータ数 | 30000(2019年1月-6月) |
学習時間(20コア) | 5時間 |
アルゴリズムはkaggleで人気(やったことはないです)のLihhtGBM。欠損値を扱えるのが個人的に一番強いと思います。
また、学習時は全部のデータを使うのではなく、下記の場合は省いています。
- 決まり手が「恵まれ」のレース
- 転覆ありやスタート事故など、全艇がゴールしていないレース
もし完璧な学習が可能であれば、そういった現象的に発生し得る全てのデータを学習させて、なんなら一つのモデルで単勝や二連単・三連単や買い方までも全て出力できるようなモデルが一番理想でシンプルです。
しかし、現段階でそんな複雑で(非線形すぎるという意味で)難しい学習はできないので、ある程度こちらでコントロールしたデータや目的に設定しています。
ディープラーニングじゃないの?
あれ、ディープラーニングじゃないの?って思われた方当然いらっしゃると思います。
まあリソースが少なくてやってないのが主な理由ですが、他にも単純なネットワーク(感覚で多層パーセプトロン5層ぐらいとかまで)だと正直ブースティングの方が強い気がします。
あと、もっと複雑な損失関数を定義する場合は、ディープラーニングの方がカスタマイズ性に優れているので(pytorchとかのツール的に)、そっちを使った方がいいと思っています。
例えば舟券の買い方を学習させるとか、ですかね。まだ漠然としたアイデアしかないので記載はしませんが。有名なAI予想のサイトの人たちは賢いこと考えて実装してるんだろうなあ、と思います。知りたい…。
・本サイトのAIは(基本的に)教師ありの二クラス分類
・ディープラーニングではなく決定木のアンサンブル学習を使用
・特徴量には当日に得られるデータは使用していない
モデル性能
的中率や回収率はこちらで日々の平均を出しているので、ここではROC AUCと混同行列についてまとめてみました。正直、AUC高くないので公開するの恥ずかしいんですが…。
単勝モデル
モデル | AUC | TP | FP | TN | FN |
---|---|---|---|---|---|
単勝1号艇 | 0.73 | 11452 | 5583 | 7080 | 3377 |
単勝2号艇 | 0.75 | 380 | 289 | 23197 | 3626 |
単勝3号艇 | 0.74 | 114 | 86 | 24099 | 3193 |
単勝4号艇 | 0.75 | 55 | 67 | 24752 | 2618 |
単勝5号艇 | 0.76 | 9 | 14 | 25904 | 1565 |
単勝6号艇 | 0.82 | 14 | 14 | 26572 | 906 |
上記の表では単勝モデル性能をまとめました。テストデータでの結果です。※学習には一切使っていないデータ。
混同行列はスコアが0.5以上のラベルを予測値としていますが、そのスコアは過去の学習時の交差検証のデータを使用してキャリブレーションしているので、確率(%)とほぼ同じ意味を持ちます。
例えば、5号艇の場合、50%以上の確率で勝利するとモデルが予想したレースは2019年半期の中で23件あって、内9件は正解した、ということになります。
二連単モデル
二連単はAUCだけ記載します。
↓1着|2着→ | 1号艇 | 2号艇 | 3号艇 | 4号艇 | 5号艇 | 6号艇 |
---|---|---|---|---|---|---|
1号艇 | 0.70 | 0.70 | 0.72 | 0.73 | 0.76 | |
2号艇 | 0.71 | 0.76 | 0.77 | 0.80 | 0.81 | |
3号艇 | 0.73 | 0.75 | 0.76 | 0.77 | 0.78 | |
4号艇 | 0.75 | 0.74 | 0.74 | 0.76 | 0.77 | |
5号艇 | 0.75 | 0.77 | 0.75 | 0.73 | 0.81 | |
6号艇 | 0.82 | 0.83 | 0.82 | 0.81 | 0.80 |
AUCというのは、二値の分類能力に等しいです。
例えば単勝モデルで見たとき、6号艇のAUCが一番高いです。少し違和感があると思いませんか? 6号艇が勝つというのは、競艇予想的には予想しにくいでしょう。
ただ、勝つか負けるかというのは、負けるという予想も正解です。1号艇が勝つか、6号艇が負けるか、の学習においては、後者のほうが特徴を得られやすいと思いませんか? そういった結果が、AUCには表現されています。
・分類モデルの性能はROC AUCで評価する
・本サイトのAI性能は、0.73〜0.82 程度である(そんなに高くない)
まとめ
機械学習の性能についてまとめてみました。3連単とかも作成する予定なので、作成したらまたまとめます。