概要
詳しくは前回の記事(https://qiita.com/kai_sana/private/673915b8e88599a407b4)
をお読みください
前回のモデルの問題点
競馬には'着差'という概念がある。
前の馬、もしくは勝ち馬とその馬が何メートル離れているかを評価する指標だ。
競馬の世界では馬一頭分の長さを'1馬身'といい、〇馬身で表す(〇には分数が入る事もある)。
競馬では接戦の決着となることも多くある。
JRAのタイム測定法では1/100秒までしか図れないため、着差がそれ以下となる事も多くある。
そのため、既存のタイムを推定する手法では、そこまでの差を推定できない。
また、それだけでなく、タイムへの影響が最も大きいのは距離だ。
競馬場、距離ごとの基準タイムのようなものを出している場合、すでに実績のあるタイム指数を使う方がよいのであって、機械学習を使うメリットが薄い。
変更点
目的変数を以下の式の計算結果に変更する。
\frac{タイム(s)}{距離(m)}\times10
10倍する理由として、この全データの内99%以上が少数第二位になってしまい、sigmoid系の活性化関数で扱いづらくなってしまう為。
なお、実際にタイムを求める際はこの計算結果に距離の1/10を掛ける。
機械学習モデル
前回と違い、教師データは全て0~1.0の区間にある。
しかし、教師データの99%以上が0.5~0.7の間に収まっているため、それ以外の値は0.4もしくは0.8にスケーリングする。
そして、ニューラルネットワークの構造を単純化させる事にも成功した。
269→100→50→1
なお、最初の層の活性化関数はsigmoid、最後(50→1)の活性化関数は
0.2\times\frac{1}{1+exp(-5(x-0.5))}+0.5
とした。
それ以外の活性化関数は全てreluとした。
なお、損失関数、最適化手法、学習率は前回と変わらない。
学習結果
学習曲線を以下に示す。
また横軸を推定値、縦軸を教師データとしたグラフを次に描く
この時の相関係数は0.85程度になり、うまく推定できている事が分かる。
また、目的変数と説明変数の関係を表したグラフを以下に示す。
これはレース間隔とタイムのグラフで、非線形な関係だと分かる。
だがこれはタイムとの比較の為、距離を考えると、レース間隔が伸びるほどタイムが速くなっている事が分かる。
これは年齢とタイムを表している。
距離に関して同様の事を考えると、地方競馬では能力のピークは早い馬で三歳、そうでなくても四歳時にはピークに達し、九歳以降は落ちていく事が分かる。
これは横軸距離、縦軸タイムのグラフである。
やはりタイムと距離は比例する傾向にあると言える。
最後に、ラスト3ハロン(600m)のタイムと走破タイムを比較したものだ。
同様に距離を考えると、緩やかではあるが、ラスト3ハロンのタイムと走破タイムは相関関係があると言える。
最後に、x軸が前走の目的変数の計算結果、y軸が2走前の目的変数の計算結果、z軸が今走の目的変数の計算結果のグラフを示す。
時折大きく調子を変えている馬がいるが、ほとんどの馬は一定のタイムで能力が変動している事が分かる。
実用
前回と同様に、6日間同条件で馬券を買って検証したが、回収率はほぼ同じだった。
6日間、72レース程度では十分な検証量ではないといえる。
コード
前回のコードのニューラルネットワークの構造を少し変更しただけのため、なし