22th Place Solution(Public 38th, Private 22th)
はじめに
始めの始めにに運営の方々を始め、皆様に感謝を申し上げます。
とても面白いコンペで、他の方の解法でも学びが多く大変勉強になっています。
自分の解法ですがそこまで上位ではありませんが、トピックに挙げられていた内容を主に用いて22thになれたので簡単にですがsolutionを残します。(補足ですが一切のドメイン知識がありませんでした。)
解法
使用したモデルはCatboostとEntitu Embedding以下の2つです。
カテゴリ変数が多かったので単純にカテゴリ変数に強そうなモデルを選択しました。
使用した外部データはe-toppoさんが挙げられていたブキのカテゴリーやサブウェポン、スペシャルなどが入ったデータを用いました。
特徴量は共通して以下のものを使用しました。
- rankをC-からXまで1,2,3...と順度尺度に置き換えてチーム内で合計したもの
- ↑をAチームとBチームで差を取ったもの
- levelを100刻みでビニング処理をしたもの
- ↑チーム内で合計したもの
- ↑をAチームとBチームで差を取ったもの
またCatboostのみA1からB4全て使ったtarget encodingを使用しました。
以上でそれぞれ単体で0.5589、0.5563のスコアが出せました。
最後にどちらも確率値で予測しているため加重平均(0.52:0.48)でアンサンブルをして域値を調整(0.505)して、PublicScore 0.5599(Public 58位相当)、PrivateScore 0.5602(22位)の予測ができました。
疑問や反省、やってたことなど
一番疑問に思っていることなのですが、target encodingをする際にHoldout TSでするとなぜかPublicScoreが落ち、リークの原因になってしまうGreedy TSでするとPublicScoreが向上しました。(ほんとなぜ?詳しい方がいたら教えてください)
反省ですが、特徴量をうまく見つけられなかったということです。他の方のsolutionを見るとplayerごとに予測してだったり、playerを特定してだったりとplayerに注目して特徴量を作っている印象がありました。後者はコンペ中に試してみましたがスコアが向上することがなかったので採用しませんでした。もう少し検討すればよかったです。
おそらくですがrankはともかくlevelがあまりいい特徴量じゃなかったように思います。
ディスカッションでも挙がっていましたがlevelがそのplayerの強さをそのまま表しているわけではない、ということでしたのでビニング処理をして大まかな数値にした方がスコアが向上しました(モデルにもよると思いますが)。
rankに関しては順度尺度にしてチームごとに合計したり、差を出したりした特徴量はスコアを0.03ほど向上させたのである程度チームの強さと関係はありそうでした。
コンペ中、「同じブキ種で固まってしまうと弱いのでは?」という仮定のもと、大学の生態学系の講義で聞いたシンプソンの多様度指数を用いてチームごとのブキの多様度を特徴量に加えましたがスコアは向上しませんでした。このゲームのアルゴリズム上、同じブキ種とチームになるのが少ないのか、強いブキ同士なら勝てて弱いブキ同士ならもちろん負けるけどその特徴量はすでにあったからなのかは分かりません。
もしブキの多様度を特徴量に入れてうまくいった方がいればぜひ聞きたいです。
またモデルに関してですが始めの方はlightGBMを用いていました。CVが0.5534でしたがPublicScore0.5615(Public38位相当)のモデルが構築できました。ただ今回のtrainデータとtestデータはvalidationをきっちり考えるほどデータが不分離していなさそうでしたのでCVを信じてCVが高いモデルを構築し続けていました。(結果的にこのモデルのPrivateScoreは0.5557でしたので正解でした)
その後lightGBM単体で0.5580程度のモデルができましたので3つのモデルの加重平均をしようかと考えていましたが、lightGBMのモデルを用いない方がスコアが高く最終的には不採用になりました。
ちなみにlightGBMとEntitu Embeddingでの加重平均を0.48:0.52にしたときのスコアは0.5597で0.0003ほど下回っていました。lightGBMとCatboostが同じ勾配ブースティングベースのモデルなので予測が近かったのかなと思っていますが実際どうなんでしょうか。
雑感と終わりに
ドメイン知識がない、特徴量が上手く作れない中で22位と個人的には嬉しい順位でフィニッシュしました。shake downされている方が多そうでしたが、個人的にはモデルを複数試したり域値を調べたり後処理が上手くいったのかなと思います。
特徴量を以下に上手く作るか、というコンペになりそうでしたので上位の方をsolutionをみてすごいなと思うばかりです。lightGBMがメインっぽいのでNN系で上位になられた方のsolutionもみたいなぁと個人的に思うばかりです。
最後にですがとても面白いコンペでトピックも様々なアイディアに溢れていて、運営の方々、参加者の方々に深く感謝します。本当にありがとうございました。