効いた特徴量について(Public3位、Private2位)
はじめに
まずはコンペを開催してくださった運営様に感謝します。
私自身スプラトゥーンは1も2も1000時間以上プレイしており、今まで参加したコンペの中で最もドメイン知識を持って取り組むことができました。
また、EDAをするうちに様々な発見があり、とても解析のしがいがありました。
効いた特徴量
自分が2位になることができたのは、以下で説明する2タイプの特徴量のおかげです(どちらもCount Encodingです)。
プレイヤーが2時間の中で同じ武器を何回使ったか
スプラトゥーンは2時間毎にステージ(ガチマッチの場合はルールも)が変更されるのですが、この2時間のうちにあるプレイヤーが同じ武器を何回使ったかをカウントして特徴量を作りました。
2時間で同じ武器を使い続けるプレイヤーは好調なのではないかと思ってこの特徴量を作りました。
プレイヤーの特定はmodeとlevelと武器名が同じであれば同一プレイヤーであるとみなしました。特徴量の作り方としてはざっくりですが、下のようにして作りました。
rensen_count = df.groupby(["period", "mode", "level", "weapon_name"]).size().rename("rensen_count")
df.merge(rensen_count, on=["period", "mode", "level", "weapon_name"], how="left")
プレイヤーが2時間の中で何個の武器を使ったか
1と似ているのですが、1が同じ武器を何回使ったかに対し、こちらは何種類の武器を使ったかをカウントしました。
自分も経験があるのですが、不調なときは負けるたびに武器を変えたりしていたので、何個も武器を使う→勝率が低いという考えがありました。
こちらもざっくりとしたコードを下に記します。
weapon_count = df.groupby(["period", "mode", "level"])["weapon_name"].nunique().rename("weapon_count")
df = df.merge(weapon_count, on=["period", "mode", "level"], how="left")
雑感
効いた特徴量について
1についてはaccuracyを1%程度、もしくはそれ以上上昇させてくれました。
2についてはaccuracyを0.2~0.3%上昇させてくれました。
ただ、この特徴量はtrainとtestが時間で区切られていなかったから効いたと考えています。例えばtrainが2019年, testが2020年のデータみたいな状況だと効果は薄れる or 効かなくなると思います。
プレイヤーの特定について
プレイヤーの特定について、A1についてはある程度特定できると思います。自分はA1を時系列でソートして、levelの情報を最長増加部分列(LIS、競技プログラミングでよく用いられる手法)を繰り返し適用して同一プレイヤーの推定を行いました。この部分はやろうとすればさらに正確に特定できるかと思います。
下に、自分のA1のプレイヤーの推定結果を示します。横軸が時間で縦軸がlevelです。
しかし、自分は残念ながらこの特定結果をうまく活用できなかったです。
モデリング関連
全部のデータを使ったり、ナワバリとガチマッチで分割したりしてモデルを作りましたが、自分の中ではどれも同程度でした。
また結果論ですが、LightGBMやCatBoostのシングルモデルがPublic, Private共に優れており、重みつき平均は微妙な結果になってしまいました。
うまくいかなかったこと
データ中にカテゴリデータが多く、EmbeddingやTarget encodingを試してみたのですが、いずれもCV, LBの改善につながらず、断念しました。
うまくいった方がいれば解法を楽しみにしています。