ProbSpace 対戦ゲームデータ分析甲子園(スプラコンペ)参加記(pop-ketle版)[最終順位97位]
はじめに
2020年8月19日(水)〜2020年10月18日(日)に開催されたProbSpaceの対戦ゲームデータ分析甲子園に参加してました。
OverwatchやR6Sなどチーム戦系のゲームはそこそこやっていますが、スプラトゥーンはやったことがなかったためドメイン知識は皆無でした。スプラトゥーンは用語が独特で正直辛かったです。
最終順位は大して高くないですが、自分の勉強になるので恥を忍ばず、取り組みを書きます。 あと、言ってしまうと上位30位くらいまではともかく、割と運ゲー感強めのコンペだったと思ってるので、この順位でも取り組みを晒すのは意味があると思っています。
コンペ概要
面倒なのでコンペページからそのまま引用してきます。
コンペティション概要
本コンペでは、オンライン大会があることでも有名なゲームの対戦データを用いて、勝敗予測モデルの開w発にチャレンジいただきます。
背景課題・目的
eスポーツは、2019年時点で既に$957.5M、2023年には~$1,600Mにまで拡大が予想されている急成長市場です
国内では任天堂・コナミといった企業が発売している、スプラトゥーン・ウイニングイレブン等が有名で、 スプラトゥーンにおいてはスプラトゥーン甲子園、プレミアリーグが開催されるほどの大きな広がりを見せています。
そこで本コンペにおいては、ある有名ゲームのオンライン対戦データを用いて、勝敗を予測するアルゴリズム開発にチャレンジいただきます。
学習データの中には、ステージ、武器、ウデマエ、レベル、勝敗といった情報が含まれております。 対戦を優位に進めるために、どの武器を選択すべきか、今後の対戦に役立てられるようモデル化できればと思います。 今までプレイ経験のない方も、ぜひこのコンペをきっかけに参戦いただけますと幸いです。
評価指標
目標は、テストデータセットのバトルの情報にもとづき、勝敗を予測することです。y(勝敗)を二値で予測してくだい。
評価指標
モデルの予測性能は評価関数accuracyで評価されます。
評価値は0以上1以下の値をとり、精度が高いほど大きな値となります。
取り組み
やったことを書いていきます。
前処理
ブキ関係
武器の名前を変換
ベッチューやらデコみたいな同じ性能で、違う名前の武器が存在しているので、全てオリジナルの武器名に変換する。ブキのelo-ratingを計算
フォーラムの実装を元にして、モード別+全モード合計のelo-ratingを計算する。 これをメインブキ、サブブキ、スペシャルごとに行う。ブキのカテゴリー1(メインカテゴリー)ごとのチーム別出現頻度
フォーラムのスプラコンペ 勝率検証EDAにて、チャージャーが偏ると弱いなどの知見が得られていたので、チームごとにどのタイプのブキでチームを構成しているかを、出現頻度の特徴量を作成した。 実際にFeature Importanceでもチャージャーのカウント数は特徴量として寄与度が大きかったのでこれは効いていたと思われる。ランクごとの武器の出現頻度数を特徴量として、武器の使いやすさみたいなものを特徴量とできないだろうか
高ランクほど強い武器を使いがちや、高ランクの人しか上手く扱えないブキのような情報を入れたかった。
モード別、モード関係なしで分けてそれぞれでブキの出現頻度をランクごとに出すことで、ブキの使いやすさ的なものを考慮できないか試した。Feature Importanceはそこそこ高く出てるけど、直感的にはそこまで効きそうなイメージは持てなかった。
レベル関係
レベルの最大値、最小値、合計、平均、中央値、分散、標準偏差
チームごと、2チーム合わせてそれぞれ計算して、とりあえず、レベルで手軽にできそうな処理は一通り行った。これは中央値とかが意外とFeature Importanceで寄与度が高かった。レベルが一番高い人/低い人
レベルが一番高い人/低い人がAチームにいるのか、Bチームにいるのか、どっちにもいるのか(例: レベル84が全体で一番レベルが高くて、かつどっちのチームにもレベル84の人がいる)この3つに分類する特徴量を作った。これをターゲットエンコーディングしたものがFeature Importanceで寄与度が高かった。A/Bチームの最大レベル - B/Aチームの最小レベル
ちょっと言葉は悪いが、チーム戦のゲームではキャリーしてくれる人と、お荷物枠みたいなものが言われることがあり、最大レベル - 最小レベルのレベル差の特徴量を作ることで、どっちのチームにキャリー枠/お荷物枠がいるのかを考慮できないか考えた。 これはFeature Importanceで寄与度が高かった。
ステージサイズ
- ステージサイズの情報
外部データのステージサイズの特徴量をそのまま加えた。
これにプラスして、ステージサイズがデカければチャージャー系が役立つなどが考えられたため、平均との差をintに丸めて特徴量とすることで、平均よりステージのサイズが大きいかどうかを考慮させようとした。 平均との差を入れて精度がちょっと上がった気もするが、Feature Importanceは確認してないのでどこまで寄与したかは知らない。
その他
各特徴量に対して、ワンホットエンコーディングやらラベルエンコーディングやらターゲットエンコーディングやら色々なエンコーディングを試してみた
今回のコンペ、ターゲットエンコーディングに一番時間をかけたのだが、振り返ってみると、結局ターゲットエンコーディングはあまり効いてなくてワンホットとかが一番効いていた感じはあった。モード別学習
フォーラムでも出たが、モード別に学習モデルを分けた場合の結果(参考)lobby-mode別に学習した場合の結果モードを分けて学習させることを考えていた。
割と有力なアイディアだったのだが、publicでのスコアが0.548906と結構落ちたので、元々ナワバリは予測しやすいのから分けると精度高く出るように見えるだけで、結局合計すると結果は変わらなくなるのではないかと考えて使わないことにした。(余談だがprivateでは結局一番のスコアを出した。)
作成したモデル
とりあえずシングルモデルで
Lightgbm(binary_errorを目標指標)
CV: 0.550くらいLightgbm(binary_loglossを目標指標)
CV: 0.553くらいcatboost(デフォルトパラメータ)
CV: 0.552くらいcatboost(optunaで最適化)
CV: 0.547くらい(optuna使うとデフォパラメータより精度が落ちた)Entity Embeddings
フォーラムの実装そのままEntity Embeddings + MLP による実装および質問(LocalCV: 0.5454 PublicLB:0.5517)
これらを実装した。
ランダムフォレストとロジスティック回帰も試していたが、ランダムフォレストはあまり精度が向上せず、めんどくさくなったので途中で使わなくなり、ロジスティック回帰は精度が高いなと思っていたが、よくよくみてみると1ばかり出力してtrainのデータが1が多めだから精度が高いだけぽかったので使うのをやめた。
これらをランダムシード10 x フォールド数5の計50個のモデルを作成して、stackingしてaveragingしたものを提出してコンペを終えた。(ちなみに、public: 0.554975 でpublicのベストサブではなかった)
最終的にpublicでのベストモデルはlgbmだけで平均アンサンブルしたものでpublic: 0.556528だった。
今回のコンペは全提出がprivateでも評価されるものだったので、目立ったモデルをいくつか上げる。
ランダムシード10 x フォールド数5の計50個のモデルを作成して、stackingしてaveragingしたもの
public: 0.554975、private: 0.548906lgbmだけで平均アンサンブルしたもの[public best]
public: 0.556528、private: 0.546460lgbmだけでモード別に学習させたもの[private best]
public: 0.548906、private: 0.552294
二つしかサブを選べなかった場合、上の二つを選んでいたのでルールに助けられたと言えなくもない。 とはいえ結局、public: 81位、private: 97位とshake downしてるので、他の人が受けた恩恵のほうが大きそうだが。
感想戦
2nd Place Solutionについて
2位の人の効いた特徴量について(Public3位、Private2位)での
- プレイヤーが2時間の中で同じ武器を何回使ったか
- プレイヤーが2時間の中で何個の武器を使ったか
で、プレイヤーの調子を考慮するというのは素直になるほどなあという感じで感心しました。
とはいえこんな感じなので、自分では一生でなかったアイディアです。
武器変更はなるほどなーという感じだけど、別ゲーだけど自分は割とキャラやら武器カチャカチャ毎試合変えるので、いくら時間かけても自分では思いつかなかっただろうな
— KEN(pop-ketle) (@ken7272popqjim) 2020年10月19日
特徴量を加えるほど下がるCV
途中まで実装がバグってたのか、特徴量を加えるほどCVが下がる悲しい現象に1週間ほど見舞われていました。気合入れて特徴量作成含めて、実装を1から作り直したら、精度が上がり始めたので助かりました。 やはり心を込めた手作り特徴量は大切ですね。(は?)
昨日の真心込めて、1から作り直した温かい手作り特徴量のおかげで、スプラコンペのLBを167位から72位までぶち上げた
— KEN(pop-ketle) (@ken7272popqjim) 2020年9月18日
フォーラムへの参加
今回は結構フォーラムへの積極的参加も心がけていました。自分の存在が他に人の役に立ったかは知りませんが、データを探索するということに関して、他の人と話しながらデータについて考えられたのは僕はすごく楽しくてよかったです。
A1プレイヤーについて
A1プレイヤーの特定についてフォーラムで上がっていました。自分は扱うのが面倒そう(ドメイン知識がないため、レベルアップに必要な試合数の肌感覚がなくあんまり信用できなさそう)、かつあまり直感的に予測に効いてくる気がしなかったので早々に使うのをやめてしまいましたが、この情報を生かして何かうまい特徴量を作った人がいるのかすごく気になります。
ブキのDPSの細かい値について
外部データとして上がっていた、ブキのDPSの細かいデータについても、使うのが面倒そう、かつ使用可能範囲が割と曖昧で手をつけたくなかった(もっと言ってしまうと、自分でスクレイピングするなり、コピペするなりしてのcsvファイル作成をしたくなかった)ので触りませんでした。これらが効いたのかも気になります。
個人的には流石に細かすぎて、あまり効果はなさそうだよなと思っていましたが...?実際はどうだったのでしょう?
もう少し詳しく書くと、FPSではダメージ1の差でキルに必要な弾数が変わってきたりして、DPSも重要だとは思うのですが、スプラトゥーンは武器の種類で情報の雰囲気?が結構違っていたのと、あんまりルールを理解できていないため何が重要なのかよくわからなかったので上手くいかせなさそうだなと思って触りませんでした。(例えばキルフレーム(ヒト)、キルフレーム(イカ)のヒトとイカの違いが分からなかった。)
ブキの強さの尺度はelo-ratingで入ってるはずだからそれで十分かなと思ったのもあります。
まとめ
カテゴリカル変数ばかりで、そこからうまいこと順序をもたせた特徴量を作るのが難しいなという感想を持ったコンペでした。 ゲームの方でマッチングの勝敗が五分五分になるようにマッチ組んでるはずだから勝敗予測なんて難しそうだし、くじ引きコンペだろと正直思っていましたが、やはり上位30くらいまでは安定して上位にいられるモデルを組んでる方が多く、さすがだなという感想を持ちました。
途中、結構長い時間をターゲットエンコーディングの調整に割いたのですが、これがあんまり効かなくて取り組みとしては失敗だったかなという気はします。とはいえ思いつく特徴量も時間内に実装できそうな範囲ではやり尽くしていたので、これが自身の現時点での限界かなという感じで上位との壁を感じたコンペにもなりました。
やはり特徴量作成は大切なので、もっと引き出しを多く持ちたいなと思いました。
完
今後はしばらくatamCupで頑張りつつ、論文書くのと発表の準備を進めていきます。