かえるのプログラミングブログ

プログラミングでつまずいたところとその解決策などを書いていきます。

PetFinder.my Adoption Prediction で準優勝しました!

こんばんは、kaerururu (@kaeru_nantoka) です。

今回は、5人チームで参加した Kaggle の通称ペットコンペで準優勝し、金メダルを無事獲得できたのでそのポエム簡単な経緯と役割分担のような話を綴っていきます:)

技術的な話(解法など)は、kaggle の discussion に

Summary by upura

kaeru part description

などなど追記されていくと思いますので、そちらをご参照ください。


経緯

きっかけは「かえるさんの転職活動成功のお祝いをしよう」と u++ さんがお声かけしてくださったことでした。

他に誰か誘おうとなったときに kaggle の meet up で ynktk さんと3人でお話ししたことを思い出し、お声かけしたところ OK. すぐに日程調整し、u++ さんが予約してくださった焼き鳥居酒屋「をどり」で会食。

Kaggle のイベントでお会いしたのがきっかけなのでもちろん話題は kaggle .

その時私はソロで参加しており、銅メダル上位くらいの順位でした。

「かえるさんは今何のコンペに参加しているのですか?」

この質問に対し、ペットコンペの簡単な概要(table, image, text を用いたマルチモーダルなコンペであること)、チームで参加してみたいのでぜひやりましょう!という旨をお伝えしました。

「え〜 0 sub だけどいいんですか?」と言っていたが、彼らとチームを組んだら絶対に楽しいと思ったのでそのまま鋭意勧誘、その場でスマホから invite してそのまま accept してもらいました笑

チーム名は、飲み会の会場の名前からとって「Wodori」。簡単にはわからないだろうし、なんか響きと綴りが気に入りました。のちに綴りが Wodori ではなく Odori であることに気づく・・笑

二人の加入で、銀圏まで上昇。当時はお二方とも何やかんや忙しい&キャッチアップの時間が欲しいということで、パッと思いつくアドバイスをいただきながら kaeru が実装するというようなスタイルだった。これで銀と銅を行ったり来たりするくらいで落ち着いた。ちょうど銀圏にいる時、東京大学の入学式に関するツイートを発見し、入学式...新歓!! ということでツイッターでふざけて Wodori チームメンバー募集の旨を呟いた。

何と反応があった。初期に参加していたが 1ヶ月ほどペットコンペの戦線から離れていた takuoko さんだった。

「takuoko さん・・・?!」顔パスだった。 4名になった Wodori は takuoko さんにチーム名の由来を伝えることなく邁進。忙しかったお二方も徐々に(というか急激に)コミット量が増えた。

結果4人でアンサンブル ( kaeru + ynktk takuoko u++) を駆使し金圏手前までいった。

もうひと伸び・・!と思っていたところに開始1週間ほどで金圏手前まで駆け上ってきたペンギンアカウントの gege さんが現れた。u++ さんにより、gege さんのチームマージに成功。

何と彼はシングルで金圏手前まで来ていた。

gege さんのソースをマージし、試行錯誤する中で金圏に到達。

そのまま、金圏で finish.

コンペ期間中は、夜中まで slack が動いているなどそれはそれは楽しい時間だった。

わかったこと

  • 当初 0 sub であってもチームマージしてデータを見るとがっつりやっちゃうのが kaggler だった。

  • チーム戦はめちゃくちゃ勉強になるし、楽しい。

  • チームメイトに迷惑をかけられないといういい緊張感がある。


役割分担

  • kaerururu リーダー、自分のパートをひたすら改善, 手が回らないところを拾う
  • u++ 司令塔, discussion追う, 類似過去コンペの検証、external特徴作成, データクレンジング, u++特徴量作成, catboost検証, 猫カフェ
  • ynktk 提出コードの大枠作成, NN 検証 postprocess、高速化、Stacking
  • takuoko ソースコードマージ、NN実装、LGBM
  • gege gege part の改善, 実務でのデータ分析経験を活かしたinsight で作成した特徴作成

上で書いたのはほんの一例ですが、いい具合に得意分野や使える時間のバランスが取れていたと思います。


ソースコードの管理など

ペットコンペは、kernel 限定コンペという kaggle 上で提供されている実行環境 ( = Kernel ) で書かれたコードにより出力された提出ファイルしか提出できないコンペでした。

従来のコンペでは、 各々がローカル環境やクラウド環境など各々環境を構築し、それぞれが計算し、 npy, feather... などの形式で保存した特徴量ファイルを融通し合い、誰か一人がそれらの特徴を load して model の計算を行うなどしてチーム運営がなされていたと聞きます。(私自身チーム戦が初めてだったので伝聞口調です。)

一方、カーネルコンペでは、特徴量の生成〜モデリング(アンサンブル)〜 postprocess までを一気通貫で行う(しかもGPUカーネルの実行時間制限の2h に収めないといけない)必要があり従来のチーム戦に慣れていたチームメイトは勝手が違うために戸惑っていたようです。

また notebook 形式で書かれた kernel は実行単位でセルが分かれていることもあり、まとまりがない書き方をしても気にならないためソースコードマージが大変だったとチームメイトの takuoko さんは言っていました。

結果的に、kaeru (notebook), gegeさん(noteboook), ynktk & takuoko & u++ 諸氏 (script) で途中まで各々進め、マージするタイミングでとてもとても見やすい ynktk さんの script ( with 文で実行単位ごとに区切るような形で記述 )をベースに takuoko さんが鋭意マージしてくださり、3000~4000行の大作になりました。

それ以降は、with 文で区切られた自分のパートの中を書き換え --> 自分のモデルのスコアを確認 --> 良さげだったら、全体で回してサブミット する流れでやっていきました。

今回のコンペを通じて、script 記法という慣れない記法に慣れることができ(むしろ終盤は script 万歳状態だった)こう言った形での成長もあるんだなーといった感じです。


感想

私は初めてのチーム戦だったのですが、最高の仲間と競技で世界2位になるという最高の結果を得られたのでとても最高な2ヶ月ほどでした。

もっともっと勉強して、また Wodori でコンペに出よう!となったらいいなあと思う深夜3時でした。

以上ポエムでした。