Predict Student Performance from Game Play振り返り [3位]
はじめに
2023/06/29に終了したKaggleのPredict Student Performance from Game Playコンペ(通称PSPコンペ)で3位入賞した時の振り返り記事になります。データリークやAPIバグに伴う度重なるコンペ延長により5ヶ月近く開催していたコンペでしたが、無事人生二度目の金メダルゲットとなりました。
- 問題設計:教育ゲームにおいて、プレイヤーの行動ログから問題の正解・不正解を予測する二値分類タスク
- 評価指標:macro-F1 score
- 最終順位:3位/2,051チーム
弊チームの解法は以下kaggle discussion上でもまとめてます。
- https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/420235
- https://www.kaggle.com/competitions/predict-student-performance-from-game-play/discussion/420274
コンペ参加に至るまで
2年前にKaggle masterになってからしばらくはKaggleから遠のいており、参加するにしても勉強がてら少しだけサブミットして終わりといった状況が続いておりました。しかし仕事が定時で終わることも多くなり、久々に本腰入れて2枚目の金メダルでも狙ってみるかという気持ちになり、年始にRTX3090を購入&人生初自作PCに挑戦し、コンペに参加する準備を整えました。2月下旬頃にどのコンペに出ようかと探っていたところ、ちょうど良さげなテーブルコンペがあったので参加することにしました。個人的なコンペ選びの主な観点は次の通りです。
コンペ選びの主な観点
- 運ゲーでない
- テストデータの量が十分多い
- テストデータの切り方がまとも
- 評価指標がまとも
- リソース格差の影響が大きすぎない
- 学びが多い
- データの性質上、工夫の余地が多い
- 初めて取り組む技術領域である
正直今回のコンペはデータを見た感じ学びが多いものではなさそうだったのですが、金メダルを狙う上では問題なかったので、こちらのコンペに取り組むことにしました。
コンペ参加からデータリーク発覚まで
データリークが発覚するまでの2,3週間ほどでざっくりと以下を実施しました。
序盤にやったこと
- キャッチアップ
- 公開ノートブック・ディスカッション読み漁り
- 過去類似コンペ上位解法の読み漁り
- ゲームプレイ
- ゲームのソースコード漁り
- ベースライン作成(GBDT)
- アンサンブル効果の確認
- GBDT+NN(公開モデル)
- スタッキング
- 推論余地の確認
- メモリ
- 推論時間
- 特徴量エンジニアリング
- 大量の集約特徴量
- 過去クエスチョンに対する予測値を用いた特徴量
- メタ特徴量
- 全問正解&クリア時間が短いユーザー行動から得た
- 高速化&省メモリ化
- 特徴量選択
- polarsの利用
- ハイパラチューニング用コードの作成
GBDTモデルをメインで作成しており、NNは公開ノートブックのoof予測値を用いてアンサンブル効果を確認したところ芳しくなかったので、特に育ててませんでした。この時点で一気に金圏まで来たものの、正直やることがたくさんあるようなコンペでもなかったので、あとはNNを育てるぐらいしかやることないなみたいな感じでした。
その後、コンペのテストデータのリークが発覚したことがKaggle Staffから通達され、しばらく様子見することになりました。
データリーク発覚からチームマージまで
データリーク問題により以下の対応がなされました。
運営の対応
- コンペの延長
- テストデータの差し替え
- 学習データの追加
- 生のログデータの公開
- APIの仕様変更
やることがあまりない中コンペの延長というのもきつかったのですが、差し替え後のテストデータのボリュームがかなり小さくなっていることがすぐにわかり、次のような懸念点が生じました。
テストデータ差し替えに対する懸念点
- 運ゲーになる可能性が上がる
- Final submission選択に迷いが生じる
- 推論時間が大きく変わるので戦略が変わる
モチベも下がってしまいましたが、とはいえ金メダルも欲しかったので、とりあえず配られた生のログデータの活用を検討しました。ログデータに含まれるプレイヤーと学習データに含まれるプレイヤーを比較したところ、後者に含まれないユーザーが前者に含まれることがわかったので、いわゆるリバースエンジニアリングに取り組み、追加のデータセットを獲得しました。結局、自分のモデルではprivate LBスコアに対してはあまり効果が得られなかったのですが、後述のチームメイトのNNモデルの学習に貢献できたので無駄な取り組みではなかったようです。また他の上位入賞者も同様の取り組みが功を奏したという意見が多かったです。
そんなこんなでコンペ再開後も金圏をうろうろしつつ、コンペ終了2週間前というところで同じく金圏付近の3名チームからチームマージの声がかかり、せっかくだしということで人生で初めてチームを組むこととしました。
チームマージからコンペ終了まで
全員外国の方だったので、コミュニケーションは英語、媒体はdiscordでした。この時点での相手のモデルは同じくGBDTで、NNは試行錯誤中みたいな状況でした。とりあえずマージ後に以下を実施しました。
チームマージ後にやったこと
- 知見やソースコード、追加生成データの共有
- アンサンブルの実施
- 共有してもらった知見を活用した特徴量エンジニアリング
同じGBDTモデルといってもアーキテクチャや特徴量が異なるおかげで多様性が生まれ、CV/LBスコアともにアンサンブル効果がそこそこありました。チームを組むタイミングや取り組み方って様々だと思いますが、中盤以降に組んで、互いのモデルをアンサンブルみたいなのがサブミット上限や多様性の観点からメジャーなのかなという気はしますね。でも日頃から知ってる人と序盤からチームを組んで、ディスカッションしながら進めるのも楽しそうです。
チームマージ後もコンペの再延期等ありましたが、public1位から3位付近をうろちょろしつつ、コンペ終了の日を迎えました。Final submissionsとしては以下の3つを選択し、3番目のsubmissionのおかげで3位入賞が果たせました。
Final submissions
- Best CV(自分のGBDT + チームメイトのGBDT)
- Best Public LB(チームメイトのGBDT)
- その他(チームメイトのNN + チームメイトのGBDT)
ちなみにprivate LB公開当時はpublic2位からのprivate1位だったのですが、public1位のチームがBANされたみたいで、最終的にはpublic1位からのprivate3位への転落になってました。多くのチームがshakeしている中耐えた方だと思いますが、手元にはprivate1位か2位相当のsubmission(自分のGBDT + チームメイトのGBDT)があったので、ひょっとしたらpublic/private両方1位が達成できたかもしれないと思うと、少しだけ悔しいですね。
PSPコンペを踏まえて
久々にガッツリコンペに取り組んだ結果、運ゲーじゃない形で2枚目の金メダルがゲットできて嬉しかったです。また、チームを組んで取り組むのも初めてでしたが、ソロでやるよりもずっと精神的に良く、結果も伴いやすいように感じました。今後もチームマージをする上では以下が重要かなと思うので、意識的に取り組んでみようと思います。
チームマージをする上で重要に感じること
- ソロの段階でLB上で存在感を示すこと
- ノートブックやディスカッション上で活発に活動すること
- 信頼できる人と組むこと
GMまではあと金メダル3つですが、得意そうなコンペでは金メダルを狙いつつ、そうでないコンペでも学びのために参加しようと思います。