8th Place Solution
本コンペを開催してくださった運営の皆様、誠にありがとうございます。
私自身データ分析のコンテストに参加するのは今回が初めてでしたが、コンペ終盤まで非常に楽しく取り組むことができました。
初心者の知見で恐縮ですが、コンペでの取り組みをまとめさせていただきます。
質問や当記事に含まれる嘘など見つけられた場合はスレッドに書き込んでいただると助かります。
外部データ
以下の外部データを使用しました。
wikiのデータは手打ちしたので辛かったです…。
特徴量
- 外部から取ってきた武器の数値データについて、チーム内での基本統計量を算出
- チームを入れ替えることによるデータセットの水増し
- 武器の、単純な使用回数、モードごとでの使用回数をカウントエンコーディング
- masato8823さんが投稿されたA1ユーザ特定のアルゴリズムを拝借しました
- 武器(stat.inkのcategory1, category2, mainweapon, subweapon, spacial)のワンホットエンコーディング
- チーム編成(stat.inkのcategory1, category2, mainweapon, subweapon, spacial)のカテゴリ変数化
- mode, stageとその他のカテゴリ変数の直積
このうち、水増し、カウントエンコーディング、mode × 武器のアイデアはチームメイトのsylkさんから拝借したものです。ありがとうございました。
モデル
LightGBM, CatBoostを主に使っていました。
LightGBMはローカルCVがpublicより低く、CatBoostは高いといった状態だったので、最終的にCatBoostを採用しました。
パラメータ調整は面倒だったのでlr以外していません。
またCVはモード×目的変数の割合が同じになるように分割しました。
Stacking?
CatBoost単体だと予測値中の1の割合が0.58程度と、テストデータでの1の割合よりも多くなってしまい無駄の多いサブになっているように思われました。(トピックでtakaitoさんがpublicでの1割合は0.52程度であると述べており、ランダムにprivateと分割されているなら全体の1の割合も0.52程度であろうと思いました。)
そのためcaribrationの意味も込めて、CatBoost30器の予測値を特徴量として浅いNN1器に学習させ、1の割合を0.54程度に落としました。これがprivateで最も高いスコアとなっており、効果的だったのではないかと思います。
そのほかに試したこと
ターゲットエンコーディングを試しましたが、ローカルCVの改善に対しpublicが悪化しました。フォールドでの勝率とテストデータでの勝率に乖離が生じてしまったからだと思いますが、CatBoostが良いスコアを出せていたことからも、この点に関してはもっと工夫する点があったと思います。
Pseudo Labelingを試しました。予測確率が0.2以下のものと0.8以上のものを混ぜましたが、publicを悪化させたたため途中で断念しました。しかしprivateはかなり改善されており、(PB:0.551164、 PR:0.563162)publicに振り回されてしまいました。出し得なコンペだったのでもっと積極的に試せばよかったと後悔しています。
雑感
初めてのコンペ参加かつランダム性の高いデータだったので、自分の施策がどれくらい効いているかわからずかなり苦労しました。特に後半はpublicスコアをあげることに注力してしまい、方向性としてはよくなかったと思います。ですがコンペを通して試行錯誤を繰り返し、色々なスキルやテクニックに触れられたので、とてもためになりました。
謝辞
多くのドメイン知識を共有してくださったjo-kwsmさん、知見を共有してくださったsylkさん、チームメイト2人の協力のおかげで今回の順位を取れたと思います。ありがとうございました。