Kaggle Riiidコンペに参加した(銀メダル 105位)

Kaggleで10/6-1/7に開催されたRiiid! Answer Correctness Predictionに参加しました。Mochoppyiとチームを組んで、Public 100位 Private 105位(3406チーム)でした。

Kaggle初メダルです🥈💪!!!

f:id:nori0724:20210108093137p:plain

コンペの概要

TOEIC対策アプリの学習履歴を元に、ユーザーが新しい問題に対して正解するかの確率を予測するテーブルコンペでした。trainデータが1億行以上あること、testデータは公開されておらずTime Series APIが提供されていた点などは他のテーブルコンペとは違うユニークな点でした。testデータが公開されていないので未来の情報は使えず、実運用に近い形のコンペだったように思います。

チームマージまでの流れ

最初の2ヶ月はソロで参加していて銀圏銅圏を行ったり来たりしていました。ちょうどその時に#8 [初心者向] atmaCupが行われていてMochoppyiからチームを組まないかと誘われました。しかし、お互いのsub数の合計がatmaCupのチームマージ条件を満たしておらず、結果Riiidでマージする流れとなりました。

チームマージ前はカーネルで特徴量・モデル作成をやっていたため、特徴量生成に1億行全てのデータを使うことができずスコアは0.775でした。マージ後はMochoppyiの潤沢なメモリ環境のおかげで1億行全てのデータを特徴量生成に使え、モデルの学習にも4000万行のデータを使用することができました。カーネル縛りで銀メダルを取れるほどまだまだ技術がないので、このマージがなければRiiidで戦えてなかったと思います。本当にメモリの余裕は心の余裕でした!感謝!

作成した特徴量

最終的に作成した特徴量は68個です。以下はその一部です。

  • 問題の正答率
  • ユーザーの現時点の正答率
  • ユーザーが各partを解いた累積回数
  • ユーザーが現在のpartを解いた累積回数
  • ユーザーの現在のpartの正答率
  • ユーザーが過去その問題を解いたことがあるかのフラグ
    (参考:An interesting Pattern detected for Repeated Questions)

ちょっと工夫したやつ

  • 上記正答率系特徴量の移動平均(N=10, 30)
  • カテゴリ共起系
    (参考:LDAを用いたカテゴリ変数からの特徴抽出)
  • ユーザーが同じ問題を2回目解く時に、前回の解いた時間からの経過時間
  • timestampの差分
  • 問題の解答の散らばりに着目した特徴
    (例:4択問題で1つの解答に答えが集中している場合その問題は簡単とみなせる。解答が1,2,3,4と散らばっていたらその問題は難しいなど。max, min, std, max - minを算出)
  • Seq2Dec
    (参考:IEEE-CIS Fraud Detection 13th place solution)

カテゴリ共起系や時間の差分を取る特徴量は#7 CA x atmaCup 2nd#8 [初心者向] atmaCupでのディスカッションを参考に作成しました。

使用した特徴量はシンプルなものが多いですが、ユーザーごとの情報をdictionaryで保持してtestのバッチごとに特徴量を更新していくようなコードを書くのは初めてだったのでバグをとるのに多くの時間がかかりました。一からこのコードを書くのは無理だったので、titoさんのnotebookには大変お世話になりました。

www.kaggle.com

モデル・CV戦略

モデルは LightGBMで2種類のweighted averageでした。cv戦略もtitoさんのnotebookを参考にしました。

www.kaggle.com

その他学び

このコンペは提出の時間が9.5時間に制限されていたため、testのループを素早く特徴量を処理するコードを書く必要がありました。普段は気分でコードを書いてたのでコードの高速について学ぶことができたのは貴重な経験となりました。

www.kaggle.com

最後に

今回のRiiidにより初めてKaggleでメダルを取ることができました。Kaggleには過去4回(Sanander, ASHRAE, M5, MoA)参加したことがありましたが、公開notebookのコピペをしてみるが意味が分からず撤退し最後まで完走したことはありませんでした。今回最後まで完走できた要因としては、コンペ開催初日から参加しディスカッションとnotebookを読むことを3ヶ月間毎日コツコツ積み重ねたからだと思います。(11月, 12月に1週間ずつ空きがありますが、この時はatmaCupにフルコミットしていたためです。)

f:id:nori0724:20210108001220p:plain

次参加するコンペはまだ決まってませんが、まずは修論に集中したいと思います。終わり次第コンペを再開し、銀メダル・Expertを目標にやっていきたいと思います。

 

最後に初Kaggle完走までの一喜一憂の記録