見出し画像

[競馬予想AI] 深層学習器の構造をhyperasで最適化しよう

前回の記事から、深層学習による競馬予想に着手しはじめました。
深層学習では層の設計やパラメータの設定など多くの設定を行う必要があるうえ、それらの設計・設定方針に明確なものがなく、最適な設計が困難だというお話をしました。

そこで今回は、hyperasを使って層の設計からパラメータの設定まで最適な設定を自動で探索してみようと思います。

hyperasとは

hyperasはKeras用のハイパーパラメータチューニングライブラリです。
使い方の詳細は説明しませんのでこちらの公式をご覧ください。

簡単に説明すると、hyperasを使うと層の数や層のノード数、ハイパーパラメータの値に選択肢を与えることができ、その中から最適なものを選んでくれます。選択肢は0~1の間の値、A, B, Cのどれかなど柔軟に設定できます。
計算時間はこの選択肢の数が多くなるほど長くなります。深層学習では設定したいものがたくさんあるのでよくばって探索したくなりますが、計算時間と相談して設定することになります。hyperasである程度設定した後、手動で細かい設定をすることになると思います。

それでは実際にhyperasを使ってみましょう。

hyperasに探索させる設定

今回は以下の項目について最適化させることにしました。こちらは単勝予想モデルの設定です。複勝予想モデルの設定は少数派クラスの重み以外は同じ設定です。

・層の数:2~5層
・各層のノード数:6種類(32~2048)※層によって異なる
・各層の活性化関数:3種類(Linear, ReLu, sigmoid)
・各層のDropoutの割合:0~0.5
・深層学習の最適化手法:3種類(RMSProp, Adam, SGD)
・バッチサイズ:3種類(1024, 2048, 4096)
・少数派クラスの重み:6~20

これらを調整しようとするとゆうに1,000通りを超える組み合わせになります。ちなみにですが、この最適化には1時間ほどかかります(たしか)。

パラメータの選択肢によっては私たちにとって都合の良い最適化ができない場合があります。例えば、少数派クラスの重みの設定で0~20とした場合、最適化の結果0が採用され、「すべてクラス0だと判定する」学習器ができあがってしまいます。評価関数としてそうしたほうが最適だとhyperasは判断しますが、私たちはそうではありません。よって少数派クラスの重みづけの設定は6~20としています。
このように多少の調整は必要になるかもしれません。

最適化したパラメータで精度を確認

単勝予想モデルと複勝予想モデルのパラメータの最適化を終えたので、実際に最適化したパラメータを使って実際にモデルを学習させてみましょう。
今回、深層学習における正則化(Batch Normalization)の有無による性能の違いを確認するために正則化あり・なしの2パターンの結果を載せておきます。

単勝予測(正則化なし)

▼学習データとバリデーションデータの正解率の推移

画像1

▼学習データとバリデーションデータのlossの推移(0.6325)

画像2

▼テストデータの各種指標

・正解率:63.62%
・適合率(Precision):0.1359
・再現率(Recall):0.7403
・F1スコア:0.2308

▼単勝・複勝馬券の的中率と回収率

単勝的中率:22.47%
単勝回収率:73.18%
複勝的中率:52.06%
複勝回収率:80.15%

単勝予測(正則化あり)

▼学習データとバリデーションデータの正解率の推移

画像3

▼学習データとバリデーションデータのlossの推移(0.3989)

画像4

▼テストデータの各種指標

・正解率:83.05%
・適合率(Precision):0.1910
・再現率(Recall):0.4049
・F1スコア:0.2595

▼単勝・複勝馬券の的中率と回収率

単勝的中率:22.82%
単勝回収率:72.82%
複勝的中率:53.52%
複勝回収率:80.67%

複勝予測(正則化なし)

▼学習データとバリデーションデータの正解率の推移

画像7

▼学習データとバリデーションデータのlossの推移(0.5896)

画像8

▼テストデータの各種指標

・正解率:68.78%
・適合率(Precision):0.3796
・再現率(Recall):0.6628
・F1スコア:0.4827

複勝予測(正則化あり)

▼学習データとバリデーションデータの正解率の推移

画像5

▼学習データとバリデーションデータのlossの推移(0.4957)

画像6

▼テストデータの各種指標

・正解率:75.39%
・適合率(Precision):0.4405
・再現率(Recall):0.4414
・F1スコア:0.4409


正則化なしとありでは適合率と再現率に違いが出ましたが、前回のnoteの各指標の関係を表したグラフと変わらない結果となっています。つまり、最適化せずとも前回のモデルを使えばclass weightの変更だけで再現できるというわけです。また、深層学習は実行の度に精度が変わってしまい不安定さもあります。

ちなみにですが、正則化(Batch Normalization)を使うとL2正則やDropOutを使わなくてもよいという研究があります。これらの関係についての詳細は省略します。


まとめ

今回hyperasによるパラメータ最適化を試してみましたが、正直効果は見られませんでした。
競馬予想AIで試したいことはたくさんありますので地道に開発していきます。

今後の方針
・hyperasによるパラメータ最適化内容の見直し
・特徴量の見直しおよび特徴量作成とその技術について
・アンサンブル学習の手法の変更とスタッキングについて

最後に

競馬予想AIの開発では調査や試行錯誤に多くの時間を取られて実装までのラグが大きいのが現状です。noteの記事ではさっぱりとしていますが、その裏で泥臭い試行錯誤をかなり行っています。なかなか成果も出ずnoteの更新も遅いですが今後ともお付き合いいただければ幸いです。

よろしければサポートをよろしくお願い致します。いただいたサポートは今後の技術向上のために書籍費用等に当てられ、このnoteで還元できればと思います。