機械学習を実生活に(その2)
どーも管理人です。
特徴作成をする
まずはデータから特徴作成を行います。特徴量としては、オッズ、馬番、性齢、馬体重、斤量、天候、距離、コース種類などを馬ごとに作成します。他にも開催地、騎手、タイム、調教師、厩舎なども得られますが、今回は使いません。
これらはクローリングでちょいちょいと簡単に集めてできたのですが、オッズに影響を与えそうな過去のレース結果がクローリングで上手く集められませんでした・・・。
なので少々力業で何とか収集。とりあえず馬ごとに過去5レース分の着順データを集めています。そしてターゲットは”着順”としています。
LightGBMで学習する
とにかく細かいことはまったくわかりませんので、ハイパーパラメータはありのまま(デフォルト)設定で行います。他のサイトを参考に最適化の指標に二乗誤差(RMSE)を用いることと、学習比率を0.1にする、決定木の深さを最大4にすることだけ指定しました。
それからイテレーション学習の回数を1000回、過学習を判断する回数を100回で指定しました。ここらはそのまま丸写しでやってます。

結果がこちら。RMSEは低いほど良いので3.4891って相当悪いみたい。イテレーションも36回しか回っていない。
MAPE(平均絶対誤差率)に至っては79.64~85.26%です。予測値が平均で80%くらい外れてるってことですね。(これ使えるの?)

特徴量の重要度です。
重要度は”odds_rank”と”odds”が圧倒的に高い。その他の特徴量はほとんど貢献していないみたい。苦労して集めた過去のレース成績もほとんど貢献していない…。

ここで疑問。
多くの人がこの馬が1着になると予想した結果によるオッズや人気順を特徴量に組入れるってことは、108レースのうち30%しか当たっていないデータに基づくということになりはしないかってこと。
それからここまで”odds_rank”と”odds”が突出していると、結局、1番人気が勝つっていう予測結果しか出ないのでは。
まぁよくわからんけど。
ハイパーパラメータはいじってもあんまり変わらなかったので、これはもう特徴量を加えたり削ったり、そしてなによりデータ数を増やすしかないようです。
予測してみる
1月のデータで作成したLightGBMのモデルで試しに2月のレースを予測してみます。(シミュレーションです、お金賭けてません。)
[ 2月23日 東京1R 3歳未勝利 1400ダート 晴 ]

”or”が予測結果で低い順に着順になります。やはり、ある程度人気順になってはいますが、5番人気と6番人気とかで逆転している。つっても5着、6着を当ててもしょうがないですよね。
結果は、予測どおり1番人気のプリマジアが1着でした。オッズは2.8。
で結局、2月23日に行われた12レースすべてで1番人気が1着になるとの予測になりました。この日は例外的に?12レースのうち7レースで1番人気が1着でしたのでかなりの的中率(58%)ってことになりますが、ただ1番人気を選んだだけなので機械学習の予測効果とは言えないですよね…。単勝オッズも平均1.97くらいでかろうじてプラス。
ただ2着馬は、3レースで2番人気以外が来る(3番人気と4番人気)と予測してます。全部はずれましたけど。
この日は例外かもしれませんが、1番人気と2番人気が1着・2着になったレースが4レースありました。もし馬連で賭けていたとすると平均オッズは3.75くらいになるので更にプラスってことに。あと第9レースは1・2・3番人気順で予測もその通りになっていたので、もし三連単で買っていればオッズ24.4だからこの1レースだけで元が取れる。
なるほど、なるほど。やはりオッズや人気を特徴量に組み入れることは意味がありそう。(あたりまえか)
よしっ!少しでも予測精度を上げるためにデータを増やして特徴量と追加してみよう。次回は実際に参戦してみますよ~。
*2月23日の第11レース フェブラリーS(G1) は16番人気が2着に入って馬連362.3倍でした。機械学習ではこういう大穴は難しいのですが、こんなの当ててみたいよね。