AlphaImpact 会社概要 事業内容 開発情報 お問い合わせ

第9回 サポートベクターマシンで非線形な競馬予測に挑む

2017/03/16更新

NUKUI

第9回の理論記事では機械学習アルゴリズムとして広く使われてるサポートベクターマシンを使って競馬予測に挑戦していきます。

サポートベクターマシンとは?

**サポートベクターマシン(support vector machine, SVM)**は機械学習の分野で最も広く使われているアルゴリズムの1つです。SVMは特徴次元数が大きいデータでも高い精度が出るという性質があります。一般に、競馬予測で使えるデータの種類は豊富で、特徴次元数が大きい入力を扱う機会は少なくありません。その点でSVMは競馬予測に適しているアルゴリズムと言えるでしょう。

またSVMは線形回帰やロジスティック回帰とは異なり、非線形なデータも扱うことができます。例えば、馬体重は一般的に軽すぎても重すぎても良くない傾向がありますが、線形モデルだと重ければ強い、または軽ければ強いという単純なモデリングしかできません。そのような非線形な特徴量が多く見られる競馬データに対して非線形モデルであるSVMは有効に働くと期待されます。

マージン最大化問題

はじめに、SVMが解く問題であるマージン最大化問題について説明します。まず、正(+1)と負(-1)のいずれかのラベルを持つサンプルを分類する決定境界を見つける問題を考えます。例として以下の図のようなサンプルが与えられているとします。

svm1

この例で正のサンプル(赤)と負のサンプル(青)は以下のように直線を引いて分けることができます。

svm2

決定境界から最も近い正のサンプルと負のサンプルをサポートベクトルと呼び、サポートベクトルを通る超平面を正の超平面と負の超平面と呼びます。また、正の超平面と負の超平面の距離をマージンと呼び、マージン最大化問題はこのマージンがなるべく大きくなるような境界線を探す問題です。決定境界は式(1)のように表されます。

$$\mathbf{w}^T\mathbf{x} = 0 \tag{1}$$

このときマージンの大きさは $ \frac{2}{\Vert \mathbf{w} \Vert} $ と表されますが、2次計画法で解くためにその逆数をとって2乗した値を最小化します。よって、目的関数は式(2)のように定義されます。

$$ L = \frac{1}{2} \Vert \mathbf{w} \Vert^2 \tag{2}$$

基本的なマージン最大化問題では上の例のように2クラスが線形分離可能であることが前提に置かれています。一方、競馬では同じ特徴を持った馬でも不確定要素により勝つこともあれば負けることもあり、例のように勝ち馬と負け馬を直線で分けることができないのは明白です。そこで使われるのがソフトマージン分類と呼ばれる方法です。ソフトマージン分類では境界からはみ出ることを許す代わりに、はみ出たことに対するペナルティを与えます。境界線からのはみ出し具合は式(3)で定義されるスラック変数 $ \xi_i $ で定義されます。

$$\xi_i = max(0, 1 - y_i\mathbf{w}^T \mathbf{x}_i) \tag{3}$$

ただし、 $ y_i $ は+1か-1をとるサンプル $ i $ のクラスラベルです。スラック変数は、サンプルがマージンの中に入ってしまった場合に $ 0 < \xi_i \leq 1 $ 、決定境界を超えてしまった場合に $ \xi_i > 1 $ の値をとります。ソフトマージンの制約の強さを調整するパラメータを $ C $ とすると、ソフトマージン最大化問題の目的関数は式(4)のように表されます。

$$ L = \frac{1}{2}\Vert \mathbf{w} \Vert^2 + C \sum_i \xi_i \tag{4}$$

SVMで実際に式(4)を最適化するときは、等価な双対問題を導出して2次計画法で解いていきますが、ここでは詳細の説明は省きます。興味のある方は産業技術総合研究所の栗田先生が書かれたこちらの資料がよくまとまっているので是非ご参照下さい。

カーネル法とSVM

競馬を含め現実の多くのデータは都合よく直線や平面でクラスを分類できることは稀です。そこで力を発揮するのがカーネル法です。カーネル法とは、元の特徴ベクトル $ \mathbf{x} $ を非線形写像 $ \phi (\mathbf{x}) $ により高次元ベクトルに拡張する手法です。

カーネル法を簡単に理解するために1次元の特徴ベクトル $ x $ で表されるサンプルの2クラス分類を考えます。以下の左図で表される写像前の空間では、正(赤)と負(青)の2クラスを1点で分離できないため、線形分離不可能であることがわかります。そこで $ \phi (x) = (x, x^2) $ という非線形写像により2次元空間に拡張してみます。そうすると1次元空間では線形分離できなった2クラスが、2次元の超空間では線形分離できるようになりました。この例では1次元の特徴ベクトルを考えていますが、特徴ベクトル $ \mathbf{x} $ が多次元になってとしても、写像先の空間の次元数が増えるだけで基本的な概念は同じです。

kernel_method

このようにカーネル法を利用して非線形写像 $ \phi(\mathbf{x}) $ により拡張した高次元空間内においてSVMを適用する手法を非線形SVMと呼びます。

カーネル法は非常に便利な手法ですが、SVMによる最適化計算に必要なサンプル間の内積 $ \phi(\mathbf{x_i}) \phi(\mathbf{x_j}) $ の計算コストが高いという問題点があります。そこで使われるのがカーネルトリックと呼ばれるテクニックで、内積計算のためにいちいち $ \phi(\mathbf{x}) $ を計算せずに、内積の値を直接カーネル関数によって定義します。よく使われるカーネル関数としては、式(5)で定義される多項式カーネルや式(6)で定義される動径基底関数カーネル(radial bases function kernel, RBFカーネル)が代表的です。

$$ K(\mathbf{x}_i, \mathbf{x}_j) = (\alpha + \mathbf{x}_i \mathbf{x}_j)^p \tag{5}$$

$$ K(\mathbf{x}_i, \mathbf{x}_j) = \exp(-\gamma \Vert \mathbf{x}_i - \mathbf{x}_j \Vert ^2) \tag{6}$$

特にRBFカーネルの場合は非線形特徴ベクトル $ \phi(\mathbf{x}) $ を無限次元にするのと等価であり、高い表現力を得ることができます。ただし、高い表現力ゆえに過学習をしやすくなるので、その点は注意が必要です。

サポートベクター回帰

通常のSVMは2クラス分類しか扱えませんが、目的関数をアレンジすることで回帰問題も解くことができます。サポートベクター回帰(suppor vector regression, SVR)では、 $ \epsilon $ 不感損失関数( $ \epsilon $ -insensitive loss function)を損失関数とします。 $ \epsilon=1 $ のときの $ \epsilon $ 不感損失関数のグラフは以下のようになります。

epsilon_insentive_error

上図の平坦区間がマージン最大化問題におけるマージンに対応し、回帰の誤差が $ \epsilon $ より大きくなったときにペナルティが与えられます。SVRにおけるスラック変数と目的関数はそれぞれ式(7), (8)のように定義されます。

$$\xi_i = max(0, |y_i - \mathbf{w}^T \mathbf{x}| - \epsilon) \tag{7}$$

$$ L = \frac{1}{2}\Vert \mathbf{w} \Vert^2 + C\sum_i \xi_i \tag{8}$$

SVRでも同様にカーネル法を組み合わせることができるため、非線形な回帰を解くことができます。

実験設定

実験設定は前回の記事と同様に東京芝2,400mの古馬戦の条件で、分類問題は複勝圏内に入るかどうかの2クラス分類、回帰問題は走破タイム回帰を解きます。特徴量も前回記事と同様に、以下の14個を用います。

特徴量名 カラム名 説明
出走頭数 num_horse レースに出走する頭数
1着賞金 win_prize レースレベルの指標
馬齢 age 馬の年齢
性別 gender 牡・牝のダミー変数(騙馬は少ないのでダミー変数にしない)
斤量 burden kg
脚質 run_style 逃げ=1, 先行=2, 差し=3, 追込=4
馬複勝率 place_ratio 馬の通算複勝率
前走距離 prev_length メートル
前走タイム差 prev_time_diff 1着との秒差
前走前3Fタイム prev_first3f
前走後3Fタイム prev_last3f
馬体重 horse_weight kg
馬体重増減 delta_weight kg
騎手複勝率 jockey_place_ratio 過去1ヶ月の騎手の複勝率

各特徴量はスケールが大きく異なると上手く学習ができない原因となるので、平均0、分散1になるように標準化処理をします。また、ハイパーパラメータであるペナルティの大きさ $ C $ とRBFカーネルの $ \gamma $ は $ C \in {100, 10, 1, 0.1, 0.01} $ 、 $ \gamma \in {1, 10^{-1}, 10^{-2}, 10^{-3}, 10^{-4}} $ の範囲でグリッドサーチを行ない、Top-1の単勝的中率が最大のパラメータを選択します。

さらに、定性評価として2016年ジャパンカップの予測も行ないます。

ベースラインの評価

評価のベースラインとして、今回も前回記事と同様に単勝人気順位のTop-N Boxの評価を使います。評価値は以下の通りです。

---- Top-1 BOX
              hit      ret      ret_std
win         0.314    0.717        1.132
place       0.629    0.786        0.616

---- Top-2 BOX
                    hit      ret     ret_std
win               0.486    0.680       0.787
place             0.800    0.766       0.466
quinella place    0.314    0.697       1.085
quinella          0.143    0.457       1.168
exacta            0.143    0.527       1.448

---- Top-3 BOX
                    hit      ret      ret_std
win               0.543    0.536        0.561
place             0.914    0.754        0.331
quinella place    0.543    0.634        0.765
quinella          0.200    0.250        0.529
exacta            0.200    0.245        0.539
trio              0.086    0.466        1.690
trifecta          0.086    0.253        0.918

---- Top-4 BOX
                    hit      ret      ret_std
win               0.686    0.669        0.642
place             0.971    0.746        0.254
quinella place    0.743    0.638        0.609
quinella          0.343    0.405        0.696
exacta            0.343    0.381        0.670
trio              0.171    0.416        1.032
trifecta          0.171    0.292        0.773

---- Top-5 BOX
                    hit      ret      ret_std
win               0.800    0.765        0.668
place             0.971    0.741        0.269
quinella place    0.886    0.710        0.642
quinella          0.514    0.608        0.831
exacta            0.514    0.595        0.878
trio              0.314    0.507        1.064
trifecta          0.314    0.513        1.331

SVMによる複勝圏内確率の予測

Top-N Box 評価

SVM(線形カーネル)の評価は以下の通りです。

---- Top-1 BOX
              hit      ret  ret_std
win         0.235    0.568    1.120
place       0.559    0.753    0.701

---- Top-2 BOX
                    hit      ret  ret_std
win               0.382    0.582    0.872
place             0.794    0.790    0.518
quinella place    0.294    0.882    1.996
quinella          0.088    0.250    0.807
exacta            0.088    0.285    0.920

---- Top-3 BOX
                    hit      ret  ret_std
win               0.412    0.409    0.580
place             0.912    0.728    0.394
quinella place    0.412    0.586    0.937
quinella          0.147    0.288    0.970
exacta            0.147    0.282    0.941
trio              0.059    0.356    1.479
trifecta          0.059    0.231    0.953

---- Top-4 BOX
                    hit      ret  ret_std
win               0.529    0.431    0.482
place             0.941    0.699    0.316
quinella place    0.647    0.574    0.643
quinella          0.294    0.513    1.084
exacta            0.294    0.432    0.862
trio              0.118    0.303    0.914
trifecta          0.118    0.232    0.746

---- Top-5 BOX
                    hit      ret  ret_std
win               0.676    0.635    0.823
place             0.971    0.719    0.378
quinella place    0.765    0.712    0.882
quinella          0.471    0.796    1.436
exacta            0.471    0.764    1.476
trio              0.265    0.589    1.526
trifecta          0.265    0.556    1.458

また、SVM(RBFカーネル)の評価は以下の通りです。

---- Top-1 BOX
              hit      ret  ret_std
win         0.294    0.718    1.203
place       0.559    0.759    0.708

---- Top-2 BOX
                    hit      ret  ret_std
win               0.324    0.415    0.652
place             0.824    0.812    0.504
quinella place    0.265    0.562    0.976
quinella          0.088    0.250    0.807
exacta            0.088    0.285    0.920

---- Top-3 BOX
                    hit      ret  ret_std
win               0.471    0.668    1.147
place             0.912    0.787    0.468
quinella place    0.471    0.647    0.979
quinella          0.176    0.575    1.866
exacta            0.176    0.649    2.262
trio              0.029    0.129    0.743
trifecta          0.029    0.088    0.507

---- Top-4 BOX
                    hit      ret  ret_std
win               0.588    0.622    0.855
place             0.941    0.812    0.434
quinella place    0.735    0.864    1.084
quinella          0.353    0.986    2.202
exacta            0.353    0.921    2.169
trio              0.176    0.718    2.379
trifecta          0.176    0.795    3.170

---- Top-5 BOX
                    hit      ret  ret_std
win               0.706    0.711    0.879
place             0.971    0.787    0.377
quinella place    0.853    0.821    0.936
quinella          0.471    0.856    1.480
exacta            0.471    0.856    1.559
trio              0.265    0.706    1.720
trifecta          0.265    0.747    1.859

まず線形カーネルとRBFカーネルを比べると、RBFカーネルの方では単勝的中率が0.294でより高い精度が出ています。またRBFカーネルはベースラインと比べてもTop-2, 3の複勝的中率で優っており、強いモデルであると言えるでしょう。

SVRによるタイム予測

予測走破タイムと実際の走破タイム比較

テストデータにおける予測走破タイムと実際の走破タイムをグラフで示します。

まずはSVR(線形カーネル)の結果です。

finish_time_svr_linear

次にSVR(RBFカーネル)の結果です。

finish_time_svr_rbf

前回記事の線形回帰によるタイム予測で示したグラフと比べてみるとSVR(線形カーネル)とロジスティック回帰の散布図がほぼ同じ形になっています。これはどちらも決定境界が線形であるので、似たような結果になるのは不思議ではないでしょう。一方、RBFカーネルではサンプルのバラつきが滑らかな右肩あがりの曲線を描いています。

Top-N Box 評価

SVR(線形カーネル)の評価結果は以下の通りです。

---- Top-1 BOX
              hit      ret  ret_std
win         0.294    1.456    4.262
place       0.529    0.868    1.084

---- Top-2 BOX
                    hit      ret  ret_std
win               0.353    0.975    2.339
place             0.706    0.847    0.723
quinella place    0.265    0.829    1.743
quinella          0.088    0.253    0.815
exacta            0.088    0.253    0.843

---- Top-3 BOX
                    hit      ret  ret_std
win               0.471    0.810    1.570
place             0.853    0.779    0.542
quinella place    0.382    0.651    1.248
quinella          0.147    0.244    0.815
exacta            0.147    0.218    0.666
trio              0.059    0.685    2.904
trifecta          0.059    0.584    2.638

---- Top-4 BOX
                    hit      ret  ret_std
win               0.471    0.607    1.178
place             0.912    0.750    0.513
quinella place    0.500    0.816    1.708
quinella          0.235    0.466    1.144
exacta            0.235    0.343    0.806
trio              0.118    1.346    5.457
trifecta          0.118    0.863    3.083

---- Top-5 BOX
                    hit      ret  ret_std
win               0.559    0.563    0.935
place             0.941    0.702    0.425
quinella place    0.676    0.719    1.052
quinella          0.353    0.476    0.850
exacta            0.353    0.420    0.806
trio              0.176    0.660    2.214
trifecta          0.176    0.413    1.245

次にSVR(RBFカーネル)の評価結果は以下の通りです。

---- Top-1 BOX
              hit      ret  ret_std
win         0.235    0.500    0.936
place       0.559    0.824    0.864

---- Top-2 BOX
                    hit      ret  ret_std
win               0.294    0.472    1.155
place             0.765    0.687    0.501
quinella place    0.088    0.168    0.554
quinella          0.059    0.176    0.706
exacta            0.059    0.200    0.800

---- Top-3 BOX
                    hit      ret  ret_std
win               0.529    0.910    1.594
place             0.853    0.751    0.500
quinella place    0.412    0.517    0.900
quinella          0.118    0.109    0.299
exacta            0.118    0.113    0.318
trio              0.000    0.000    0.000
trifecta          0.000    0.000    0.000

---- Top-4 BOX
                    hit      ret  ret_std
win               0.588    0.808    1.232
place             0.941    0.843    0.495
quinella place    0.588    0.845    1.104
quinella          0.235    0.307    0.707
exacta            0.235    0.283    0.655
trio              0.118    0.452    1.433
trifecta          0.118    0.301    0.922

---- Top-5 BOX
                    hit      ret  ret_std
win               0.647    0.727    0.998
place             0.971    0.725    0.402
quinella place    0.676    0.616    0.929
quinella          0.324    0.270    0.512
exacta            0.324    0.271    0.576
trio              0.147    0.539    2.107
trifecta          0.147    0.476    2.058

SVR(線形カーネル)がTop-1の的中率で0.294、回収率1.456と高い数値を叩き出しました。前回の線形回帰のTop-N Box評価と比較しても、Top-1の的中率、回収率で上回っています。一方、RBFカーネルはランキング上位の的中率・回収率において線形カーネルよりも低い精度でした。今回の実験設定のような特徴量では線形モデルで十分な性能が出ることがわかります。機械学習でタスクを解く時は単純なところから試していくのが王道であり、今回は非線形モデルの出番は無かったかもしれません。`

2016年ジャパンカップを予測する

最後にSVM(線形カーネル・RBFカーネル)とSVR(線形カーネル・RBFカーネル)で2016年ジャパンカップを予測してみます。

まず、レース結果は以下の通りです。

着順 馬番 馬名 人気 走破タイム
1 1 キタサンブラック 1 2:25.8
2 12 サウンズオブアース 5 2:26.2
3 17 シュヴァルグラン 6 2:26.3
4 3 ゴールドアクター 3 2:26.4
5 16 リアルスティール 2 2:26.4
6 14 レインボーライン 8 2:26.4
7 5 イキートス 16 2:26.4
8 7 ワンアンドオンリー 14 2:26.6
9 4 ルージュバック 7 2:26.8
10 6 ラストインパクト 13 2:26.9
11 10 トーセンバジル 12 2:26.9
12 15 ナイトフラワー 9 2:26.9
13 9 ディーマジェスティ 4 2:27.1
14 8 イラプト 10 2:27.1
15 13 ヒットザターゲット 17 2:27.2
16 2 ビッシュ 11 2:27.2
17 11 フェイムゲーム 15 2:27.3

次にSVM(線形カーネル・RBFカーネル)による予測複雑確率です。

▼ SVM(線形カーネル)

予測順位 馬番 馬名 予測複勝確率
1 1 キタサンブラック 0.703
2 16 リアルスティール 0.676
3 14 レインボーライン 0.651
4 12 サウンズオブアース 0.636
5 17 シュヴァルグラン 0.627
6 3 ゴールドアクター 0.605
7 10 トーセンバジル 0.582
8 9 ディーマジェスティ 0.579
9 6 ラストインパクト 0.564
10 2 ビッシュ 0.537
11 4 ルージュバック 0.528
12 7 ワンアンドオンリー 0.505
13 15 ナイトフラワー 0.466
14 8 イラプト 0.429
15 11 フェイムゲーム 0.407
16 13 ヒットザターゲット 0.390
17 5 イキートス 0.360

▼ SVM(RBFカーネル)

予測順位 馬番 馬名 予測複勝確率
1 1 キタサンブラック 0.822
2 16 リアルスティール 0.776
3 14 レインボーライン 0.736
4 12 サウンズオブアース 0.728
5 17 シュヴァルグラン 0.687
6 3 ゴールドアクター 0.653
7 6 ラストインパクト 0.610
8 10 トーセンバジル 0.601
9 9 ディーマジェスティ 0.587
10 7 ワンアンドオンリー 0.488
11 4 ルージュバック 0.452
12 2 ビッシュ 0.432
13 15 ナイトフラワー 0.361
14 8 イラプト 0.323
15 13 ヒットザターゲット 0.271
16 11 フェイムゲーム 0.269
17 5 イキートス 0.192

最後にSVR(線形カーネル・RBFカーネル)による予測走破タイムです。

▼ SVR(線形カーネル)

予測順位 馬番 馬名 予測タイム
1 1 キタサンブラック 2:24.2
2 16 リアルスティール 2:24.3
3 14 レインボーライン 2:24.3
4 12 サウンズオブアース 2:24.5
5 10 トーセンバジル 2:24.5
6 9 ディーマジェスティ 2:24.6
7 17 シュヴァルグラン 2:24.6
8 6 ラストインパクト 2:24.6
9 3 ゴールドアクター 2:24.7
10 2 ビッシュ 2:24.8
11 7 ワンアンドオンリー 2:24.9
12 11 フェイムゲーム 2:25.1
13 13 ヒットザターゲット 2:25.2
14 4 ルージュバック 2:25.2
15 8 イラプト 2:25.9
16 5 イキートス 2:26.0
17 15 ナイトフラワー 2:26.0

▼ SVR(RBFカーネル)

予測順位 馬番 馬名 予測タイム
1 3 ゴールドアクター 2:25.9
2 16 リアルスティール 2:25.9
3 6 ラストインパクト 2:26.1
4 17 シュヴァルグラン 2:26.1
5 9 ディーマジェスティ 2:26.1
6 10 トーセンバジル 2:26.2
7 1 キタサンブラック 2:26.3
8 12 サウンズオブアース 2:26.3
9 13 ヒットザターゲット 2:26.5
10 7 ワンアンドオンリー 2:26.5
11 15 ナイトフラワー 2:26.6
12 4 ルージュバック 2:26.6
13 8 イラプト 2:26.6
14 14 レインボーライン 2:26.8
15 2 ビッシュ 2:26.8
16 11 フェイムゲーム 2:26.8
17 5 イキートス 2:27.1

SVR(RBFカーネル)を除く3つのモデルでキタサンブラック、リアルスティール、レインボーライン、サウンズオブアースを順に高評価するという興味深い結果となりました。複勝確率と予測タイムという異なるタスクだとしても同じ結果となるというのは予想外でした。またSVR(RBFカーネル)は定量評価でもあまり精度が良く無かったですが、やはりキタサンブラックやサウンズオブアースを低評価しており、ジャパンカップにおいてもあまり良い予測をしているとは言えないでしょう。

おわりに

今回は非線形モデルの代表格であるサポートベクターマシンを使った競馬予測を試してみました。複勝分類問題では非線形カーネルを使うことに性能がやや向上した一方、タイム予測では非線形カーネルが悪い方向に働くという結果となりました。

非線形モデルは線形モデルにはない大きな自由度があり、我々含む多くの競馬AI開発者はそこに競馬攻略の答えが何か埋まっているはずだと夢見ていることでしょう。しかし、非線形モデルはときにその自由さゆえに、いつも期待通りの働きをしてくれるわけではありません。手懐けるには理論の深い理解や経験を積み、AIの"気持ち"を理解するスキルを身につける必要があります。

我々AlphaImpactも非線形モデルの1つであるニューラルネットワークを使っていたときに、思い通りにコントロールができず精度が伸び悩んでいた時期がありましたが、そのとき足りなかったものがまさにそれです。それでも、諦めずに、地道に競馬AIとの対話を重ねていくことで、今現在AlphaImpactが運用しているような優秀な競馬AIを作ることができるのです。

次回は決定木を使った競馬予測を解説していきます。 ご期待下さい。