対戦ゲームデータ分析甲子園

目指せ"Another" バトル優勝!

賞金: 100,000 参加ユーザー数: 605 約4年前に終了

10th Place Solution

コンペに参加された皆様、お疲れさまでした。 また、運営の皆様、トピックで情報共有くださった皆様、ありがとうございました。 自分用メモを少し改定したもので伝わりづらい点もあるかと思いますが、ご参考になればと思い投稿させて頂きます。

モデル概要


LGBMのみ。

lobby-mode(ガチ/レギュラー)でモデルを分けた。modeやrankでモデルを分けることも試みたが、CVもLBも大差は無かったが下がったのでやめた。

2000ほど特徴量を作り、そこから使用する特徴量を組み替えたものを3つアンサンブル(重み同じで多数決)した。


特徴量エンジニアリング


外部データの結合

  • ブキ性能、ブキ情報、ステージ広さ
    • 各情報を以下にあげる様な処理をしたが、特に射程については、攻略サイトを参考に各ブキを前衛/中衛/後衛に振り分け、各チームの射程の組み合わせとステージの広さとをカテゴリ変数として結合するなど、様々な処理をした

基本的な数値変数の処理

  • 合計、平均、最大、最小、チーム間差/比など

基本的なカテゴリ変数の処理

  • One hot(+Count) Encoding
    • 1/0フラグではなく、トピックを参考にCountとOne hotが融合したもの
  • Label Encoding
    • 単体の情報ではどちらかのチームの有利不利に影響しなそうなmode,stageなど
  • 数値変数への変換
    • +/-/無印が混在するC~Aランクを0,1,2で変換。S以上は差が無いので999に

このコンペならではの処理

  • 複数列を使ってTarget Encoding
    • トピック で書いたもの
      • lobby-modeとブキだけでなく、modeとカテゴリなど、様々な組み合わせの特徴量を作った
      • 各種結果を乗算したものも加えた
    • 同じ考えの特徴量を作りすぎて、overfitしてしまっていた感もある
  • カテゴリ変数をソートしつつ結合
    • チーム毎のブキ/カテゴリー他ブキ情報について、A1~B4の順番に影響を受けないようにソートしながら結合してそれぞれ1変数にまとめた
    • カテゴリ以下の組み合わせは良かったが、ブキの組み合わせはパターンが多く(null含めると140^4)、Target EncodingするとほとんどNaNになってしまった。組み合わせの微妙な違いを表現するために文字列の距離を特徴量に加えようといくつか試したが、効果は出なかった(直感的には効果がありそうなので、単純に知識&実装力不足かも知れない)

特徴量選択


feature importanceの違いはあるが、null importanceを見るとほとんどの特徴量が除外候補になっていまい、非常に迷った。 おそらく、使用した特徴量(ほとんどTarget Encoding)のせいだと思うが、0.5に近い特徴量ばかりだったのでランダム分割と大差がなかったため?

結局、2000ほど特徴量を作成したが、各種重要度は気にせず、直感的に勝敗に影響するものや冗長にならないように100以下程度まで手動で選択したもののほうが精度が良かった。

直感的には重要と思われたが、subweaponやspecial、One hot特徴量も除いた方が精度が高かった(残した他の特徴量との組み合わせによる)。subweaponやspecialについてはブキ本体にも情報が含まれるのでoverfitしてしまう?One hotはパラメータとの兼ね合い?

どこまで減らせるか試したが、6特徴量でも0.553までは精度が出た。 (チームトータルレベル比、チーム平均射程比、カテゴリ2の勝率乗算、ブキの勝率乗算、lobby-mode、stage)


パラメータ


汎用性を意識しつつ、CV/LBを見ながら手動で調整。基本は以下。

params = {
    "objective": "binary",
    "metric": "binary_logloss",
    "boosting_type": "gbdt",
    "num_iterations": 1000,
    "max_bin": 255,
    "learning_rate": 0.01,
    "num_leaves": 31,
    "max_depth": 5,
    "min_sum_hessian_in_leaf": 1,
    "lambda_l1": 0,
    "lambda_l2": 1,
    "subsample":0.9,
    "colsample_bytree":0.9
}

CV


最初は単純なKFold(5-Fold)でやっていたが、LBとCVが全然相関しなかった。 特徴量の作り方(Target Encodingが多め)のせいも大きいと思うが、trainとtestで勝率が異なっていた?

最終的に、CV/LBを見ながらFold数は4、SEEDを複数個用いることで比較的安定した。


その他


少量のリーク(?)

トピック で指摘したところ別々の対戦とのことだったが、ほとんどの試合結果は同じものだった。trainとtestを跨いで、Aチームと Bチームの入れ替えも含めて見ると(Bチーム側にもA1にあたるプレイヤーがいた?)約200ほど同じ組み合わせの試合があった。

勝敗が異なるものもあるので実際に別々の試合だった可能性が高いが、別々の試合だったとしても同じ組み合わせなら同じ結果になる可能性が高いだろうと考え、予測結果に関わらずtrainで結果が見えている勝敗で上書きしたところ、LBが上がったので採用することにした。


結果


Public:0.566549(13th)
Private:0.563914(10th) ※Publicと別モデル

Favicon
new user
コメントするには 新規登録 もしくは ログイン が必要です。