Kaggle Days Tokyoで初対面のテーブルデータコンペ初心者とチームを組んで戦った話

2019/12/11~12に開催されたKaggle Days Tokyoに参加してきました。

二日目はオフラインコンペで、日本経済新聞社さん*1に提供していただいたデータセットを使って日経新聞購読者の年齢を推測するというテーブルデータ+NLPの課題が与えられました。

ルールは8時間制限で、チームは上限が3人まで参加OK、当日は会場でチームマージを募集するコーナーがあったのでそれに参加して初対面の方々とチームを結成しました。 チームの組み方はその場で集まった人をkaggleの経歴順に並べ番号を1, 2, 3, 4, 1, 2...と振っていくやり方でしたが途中でなんやかんやあっていつの間にかチームができていました。

チームについて

メンバーは

  • 私(nadare): kaggle Expert petfinderから半年休んでたし実質一年で経歴を詐称したにもかかわらずチームで一番経験のある枠に選ばれた
  • Wenyan Ge氏: kaggle Novice テーブルデータの扱いに多少経験はあるが、kaggleには初参加
  • Sunny氏: kaggle Novice 普段は画像認識系のNNを扱うTBD初心者で、kaggleには初参加

チーム名は最後まで決まらず、Sunny氏の名前のままLBにはいました。二人とも海外出身の日本で働くエンジニアだったので、二人は英語で話して自分は日本語で二人に話しかけるという形でコミュニケーションをとりました。私は二人へ日本語でゆっくりはっきり聞こえるよう話しかけていたので自分たちの作戦は周囲に筒抜けだったのではないかと思います。(騒がしくしてごめんなさい🙇)

開始~ランチまで

 自己紹介からはじめ、列名の読解に取り組み日経新聞電子版のドメイン知識とかを共有しつつ全員でデータを眺め意味を探ろう*2としました。その後ランチ開始の十二時まで四十分くらいで各々ベースラインモデルを作って感想を共有する流れを提案し取り組みました。結果は割と散々で、自分のモデルはtrain_df, test_dfのみ縛りでしたがLB13.85のstarter_kernel以下で割と落ち込みました。

ランチ

 ランチをゆっくり食べながら、特徴量についてのアイデアを交換しました。自分のモデルはuser_idが5番目にimportanceの高いハチャメチャモデル*3だったので、ひょっとしてuser_idに秘密があるのでは(例えば振られた番号が日経新聞の会員の登録順になっていて、そこから年齢について推測できるetc)等を推測し盛り上がりましたが、結局targetと相関係数をとったりして無関係そうだということが分かりました。悲しい

ランチ後~二人が完全に初心者だと気づくまで

 今回のkaggle daysはexpert以上が100人くらい参加していて、一日目の発表もかなり高レベルだったので私は全員がかなりの経験者だと考えていました。それなので私はランチ後に全員で別々にモデルを作って最後にアンサンブル形式を提案したのですが、二人の手があまり動いていないようだったので話してみたところ、二人ともテーブルデータの経験が本当の意味で少し*4だったようなので方針を切り替える必要がでてきました。Sunny氏が公開kernelを元に特徴を追加していくことを提案したので、自分はテクニックが必要そうなメタデータ由来の特徴に絞って作り、二人に特徴量をつくるヒントになりそうな内容をどんどん投げていく方針をとりました。

役割分担について

 最初は二人に『記事を読んだ分布の時間が特徴的な形をしているのでこれを基に特徴量がほしい』、『携帯の機種につながる情報は新しい機種を持つ人ほど若い人だと思うからそれにつながる特徴を探してほしいくらい』の粒度でヒントを投げていましたが、これだと少し荒かったので『機種のOSごとにversionがあるからそれをOSごとのリリース順に並び替える関数を作ってほしい』、『携帯の機種名ごとにメーカーっぽさがあるのでシリーズの番号を消して欲しい』くらいの細かさまで落としてリクエストしたところ良い感じに特徴量を作ってもらえました(前者の特徴は効いて後者の特徴は効かなかった)。

Wenyan氏にはこれに加えターゲットエンコーディング*5の実装でモデルの精度に貢献していただきました。結果このターゲットエンコーディングが特徴量の中で一番feature_importanceが高かったです。

また、Sunny氏には作った特徴量をモデルに追加してどうなったかの管理とモデルのハイパーパラメータのチューニングを行っていただきました。彼はpandasの経験自体も浅くLightGBMもその日にDLしていたはずだったのですが、自分たちの作った特徴量に合わせてパラメータをどんどんよくしていただきました(肩にOptuna乗ってんのかい!)。

こうして二人に役割を分担していただいた*6ので、自分はメタデータからの特徴量生成に集中することができました。モデルの詳しいfeature importanceは確認していなかったのですが

  • 記事のジャンルごとに読んだ回数をカウントし、読んだ回数の多い順にTOP3を並べた特徴量*7
  • 記事×キーワード・トピックで作ったスパース行列をSVDで100次元に落とした特徴量

を追加した時にスコアが良くなったので多分これらが効いたんだと思います。

結果

 PBは 33位/88チーム で、マスターの方々ややエキスパート同士で組んだチームに近づけました。おそらく自分一人でやるよりはいい成績が取れたと思うので勝ちだと思います。

チーム戦の楽しさ

 今回は自分の英語力のなさやマネジメント力・チーム経験の薄さから前半がグダグダでしたが、後半は30番台で追い抜き追い越しをやれたので(少なくとも自分は)だいぶ盛り上がれました。また、チームメイトに説明を行う中で自分の中での言語化されていなかったテクニックを再確認できたので学びもありました。一日で終わるにはもったいない、メダル付きで長期間開催してほしい良コンペだったので開催していただいたホストには感謝の気持ちでいっぱいです。

 チーム的には僕より強いMasterの方を入れて実力勾配を良い感じにしてほしいなぁと思うので、これが実現できるよう皆さんもオフラインコンペでは積極的に知らない人とチームを組みましょう。私は次のオフラインコンペでもチームを組む気でいます。

*1:日本経済新聞社さんは今回のコンペだけでなく競技プログラミングでもAtCoderで全国統一プログラミング王を主催するなどもしていただいている素晴らしい会社です。今週末(12/15)にもAtCoderでコンテストがあります。本当にありがたいです

*2:のちにホスト側から説明の入ったexcelファイルが共有されました

*3:user_idもうっかり混入していました

*4:チョットデキルではないほう

*5:1日目のJackさんの発表から会場で関心が高かったです

*6:やや面倒を押し付けてしまった感もあるので申し訳なさもあります

*7:1日目のonoderaさんの発表を参考にしました