競馬編
競馬でのモデルの選び方
1 頭ずつ・2 頭ずつ・レース全体という 3 通りの立て方と、1 着が 1 割弱しかないという不均衡。複数モデルの組み合わせ方も。
この記事の要点
- アルゴリズムの選び方は基礎編と同じです。競馬に固有なのは「レース単位でまとめて扱う」点です。
- 1 頭ずつ(pointwise)・2 頭を比べる(pairwise)・レース全体(listwise)の 3 通りの立て方があります。
- 1 着はおおむね 10 頭に 1 頭前後しかいません。何も学習しなくても正解率は 9 割前後になります。
- 予測値は順序として使うのが基本ですが、期待値の計算に使うなら確率としての正しさも要ります。
アルゴリズムの選択は基礎編と同じ
競馬データは列がそろった表形式なので、基礎編:代表的なアルゴリズムで述べたとおり、勾配ブースティング木(GBDT)が扱いやすい第一候補になります。 ここでは繰り返さず、競馬だから必要になる判断だけを扱います。
レース単位でまとめて扱う
競馬データの行は基本的に馬単位(1 行 = 1 頭)ですが、評価も判断もレース単位で行われます。 そこで、学習の段階から「同じレースの行はひとまとまり」と教える方法があります。
学習のさせ方は、何を 1 件として比べるかで 3 通りに整理できます。 ランキング学習の分野では pointwise / pairwise / listwise と呼ばれる区分です。
| 立て方 | 学習のさせ方 | 向き・不向き |
|---|---|---|
| 1 頭ずつ(pointwise) | 1 頭ごとに「勝つ / 勝たない」や着順を当てる(二値分類・回帰) | 単純で扱いやすい。レース内の比較は相対化した特徴量で補う |
| 2 頭を比べる(pairwise) | 同じレースの 2 頭を組にして、どちらが先着するかを当てる | 比較そのものを学べる。組の数だけデータが増える |
| レース全体(listwise) | レースをグループとして渡し、並び順の正しさを直接学ぶ | 構造にもっとも忠実。設定はやや複雑 |
1 頭 vs 1 頭(pairwise)は、 「この馬は強いか」ではなく「A と B のどちらが上か」を直接学ぶ立て方です。 競馬で知りたいのは各馬の絶対的な強さではなく順序なので、 目的と学習内容のズレが小さくなります。 代償として、1 レースの行数が組み合わせの数(16 頭立てなら 120 組)に増え、 予測時には比較の結果を 1 本の順位に組み直す手順が要ります。 データの作り方はペア単位を参照してください。
どの立て方でも、最後にレース内で並べ替えて使う点は共通です。
1 着は少数派 ── 不均衡の扱い
1 レースで 1 着になれるのは 1 頭だけなので、 全データのうち「1 着」の行はおおむね 1 割前後にとどまります。 つまり全部「勝たない」と答えるだけで正解率は 9 割前後になります(正解率は「(出走頭数 − 1)÷ 出走頭数」なので、10 頭立てで 90%、 16 頭立てなら 94% 近くに達します)。
したがって、正解率でモデルを比べるのは無意味です (基礎編:評価指標の読み方)。 競馬では、
- 並べ替えの良さを見る(レース内で 1 着馬を上位に置けているか)
- 最終的には回収の観点で見る(回収率)
という 2 段構えで評価します。 なお、少数派を水増しする・重み付けするといった不均衡対策もありますが、 競馬では「レースごとに 1 頭だけが勝つ」という構造は正常な性質なので、 無理に均衡させる必要はありません。
複数のモデルを組み合わせる(アンサンブル)
1 つのモデルに絞らず、複数のモデルの予測を組み合わせて 1 つの答えにするやり方があります(アンサンブル学習)。競馬では次のような組み合わせ方が考えられます。
- 異なる目的変数のモデルを混ぜる… 「1 着になるか」のモデルと「3 着以内か」のモデルの見立てを合わせる
- 異なる立て方のモデルを混ぜる… pointwise のモデルと pairwise のモデルでは、順位の付き方の癖が違う
- 学習期間や設定を変えたモデルを平均する… たまたまの当たり外れをならす
競馬で組み合わせるときは、スコアそのものではなくレース内の順位や確率に直してから混ぜるのが扱いやすい方法です。モデルによってスコアの目盛りが違うため、 生の値を平均すると、目盛りの大きいモデルの意見だけが通ってしまいます。
予測値を「確率」として使うとき
モデルの出力は、そのままでは順序を決めるための点数にすぎません。期待値や資金配分の計算に使うなら、確率として信用できる必要があります(キャリブレーション)。
競馬では、レース内の合計が 1 になるようにそろえておくと、 オッズから逆算した市場の勝率と同じ土俵で比較できるようになります。 点数が負の値も取る場合は単純な割り算ではそろわないので、 softmax のように必ず正の値へ直してから配分します。
この比較が、次の記事の中心テーマです。
学習にかかる時間と GPU
数十万行・数百列規模の学習は、一般的なパソコンでも実行できますが、 条件を変えて何度も試すとなると時間が効いてきます。 なお GPU で高速化できるのはニューラルネット系のトレーナーで、 GBDT は CPU で実行されます(使い方ガイド:モデル学習)。
速くなること自体より、試行の回数を増やせることが実質的な利点です。 ただし試行を増やすほど検証成績は甘くなるので、最終確認用のデータには手を付けないという原則は変わりません。