選手個別モデルを作ってスタッキングしてみた

2020年3月3日人工知能, 機械学習, 競艇

こんな人にオススメ!

・競艇データを機械学習モデルを使って予測している人
・アンサンブル学習(スタッキング)について知りたい人

スタッキングについて

機械学習のアンサンブル学習の一つにスタッキングという手法があります。こちらのページとか詳しいです。

よくKaggle などで使われている、精度向上につながる手法のひとつです。

スタッキングの概念図。上図ではホールドアウト的に学習データを分けてスタッキングしている。
特徴Xは、モデルの予測結果や予想スコアに当たる。

なぜスタッキングが必要なのか?

様々な人(様々なアルゴリズム)が作ったモデルは、それぞれが学習している特徴が異なるので、それらをアンサンブルすれば精度向上につながる事が期待できます。

しかし、なぜスタッキングする必要があるのかというと、その様々な特徴をひとつのモデルで獲得するのは困難だからです。

理想のモデルとは?

私が考える理想のモデルとは次の要件を満たします。

  • 関連する様々なタスクについて予測できる
  • モデルが一つである ※予測プロセスが単一のモデルのみ使用する

様々なタスクを予測するというのは、例えば、単勝・二連単・三連単・買い方・配当期待値・本番ST などを同時に予測できるということです。つまり、マルチタスク的に学習する事です。

モデルが一つである、というのは、タスク別にモデルを分ける以外にも、想定される全ての状況で予測できる、という意味があります。

例えば、あらゆる競艇場でどんな季節や温度や天候でもひとつのモデルで予測するという事で、それは汎化性能が高いと言えます。

基本的に、同じ学習データから特徴(内部表現)を得るとして、アルゴリズムに依存しない究極の特徴を学習できれば(そういったアルゴリズムが開発されれば)、私はスタッキングを必要としなくて良いと考えます。

しかし、 様々な機械学習アルゴリズムは同じデータで同じ学習をしても、獲得できる特徴は原理的に異なります。そのため、従来のアルゴリズム以上に、汎用的な特徴を獲得できるアルゴリズムが発明されるまでは、原理的にスタッキングは有効であると言えます 。

スタッキングしたいモデル

それで、私がスタッキングで何をしたいかというと

選手個別のモデルを混ぜれば精度向上するはず!

という事です。もう絶対選手個人個人の特徴が違うことは明らかなんです。それなのに全てのデータを使って学習させると、ある意味競艇競技としての平均化された特徴を学習しちゃう気がしまして。

じゃあ、選手ひとりひとりのモデルを作ってスタッキングしてやれば、選手個々の特徴も参考にして学習できて、絶対精度向上するはずだ! と。

ポイント!

・理想の特徴が得られるのであればスタッキングは必要ない
・選手個別のモデルを作ってスタッキングすれば精度向上につながるはず
・全体の学習だけでは選手個別の特徴までは学習できていないはず

モデル構築

今回検証した手順は次の通りです。

※検証環境のリソースと時間的な都合で、本来は交差検証(上図でいうと、学習データを交差検証して各交差毎のValidationデータの結果を保存しておき、学習データ全体の特徴Xを得ること)すべきですが、上図の通りホールドアウト法的にデータを作成しました。

  • 学習データを①と②に分ける
  • ①を学習する。各選手が(枠番に関係なく)何着をとるかを正解ラベルとする
  • ①に存在する全ての選手毎にモデルを作成する(選手番号が入った名前のファイルが大量にできる)
  • そのモデルを使って②を予測させ、その予測確率を含めて②全体でモデルを作成する

上図のモデル1~モデルXが選手個別モデルです。選手個別モデルは全て同一のハイパーパラメータのLightGBMで学習させました。

結果

スタッキングしない場合と比べてほとんど結果は変わらなかった…

モデル精度

厳密な検証はしていませんが、こちらの記事の精度とほぼ同じか、-0.5%程度の悪化になりました。

不労所得に一歩近づく!と期待していただけに残念な結果でした。

改善すべき点

その壱

①は2017年までのデータ、②は2018年のデータを使っていますが、最終的に学習する②のデータ数が現行モデルの学習データ数(①+②)と違いすぎて、データ不足なのかスタッキングに使ったモデルが有効じゃなかったのか、判断できません。

データ不足に関して、正しくは①+②のデータで各選手毎のモデルで交差検証を行い、validationデータに付けれた予測確率を保持しておき、やはり①+②のデータで再度学習すべきです。

※これは、時間とサーバスペックの観点で難しかったので今は検証できません。

その弐

また、選手毎に出場しているレース数が違いすぎて、LightGBMの(面倒くさくて統一した)ハイパーパラメータでは不適切なのかうまく学習できない選手モデルもありました。

こちらも正しくは各選手モデル毎にハイパーパラメータを調整すべきと思います。

ポイント!

・今回の方法ではスタッキングしてもしなくても精度に変化は無い
・交差検証でのデータ作成やモデル毎のハイパーパラメータなどの課題を解決しない限り、選手毎のモデルをスタッキングする効果があるかどうかは検証できない

考察

モデル精度が同程度もしくは少し悪化している点に関して、各選手毎のモデルが全体で学習したモデルの特徴より優れていない(新たな特徴となっていない)事がわかります。

そもそも選手毎のモデルが特徴を反映するという前提が合っているか?という点に関してはどうでしょうか。

選手毎のモデルが各選手の特徴を捉えているか、というのは"イエス"でしょう。ただ、その特徴(選手毎のモデルで予測した結果※予測確率)が、他の特徴量に比べて有効かというと、それは分かりません。

何故なら、特徴量には年間勝率など選手毎に統計した数値を使っているからです。

統計した数値というのは、選手毎の特徴が反映されている直接的な数値といえます。なので、それ以上の特徴をモデルに求めるのはどうなんだろう、と思うわけです。

思うに、深層学習(ディープラーニング)などの強力なアルゴリズムを使うことが予測精度の向上に繋がることは間違いないのですが、それ以上に、もっと特徴量を工夫すべきです。

今回のケースでいうと、選手の特徴をモデルで得るのではなく、もっと別の視点での統計や別のデータを入力して特徴を表現すべきなんです。

クソな特徴をいれてもクソなモデルしかできない、と誰かが言っていました。今回の検証ではそれを再認識させられたという感じです。

とはいえ選手毎のモデルという発想は捨てきれませんので、別の機会にアップデートして検証したいと思います。では

2020年3月3日人工知能, 機械学習, 競艇