ギークなエンジニアを目指す男

機械学習系の知識を蓄えようとするブログ

分析コンペをチームで戦うための技術

f:id:taxa_program:20201222223932p:plain

こんにちは。takapy(@takapy0210)です。

本記事はKaggle Advent Calendar 2020 22日目の記事です。
明日は、本エントリで紹介するMoAコンペでチームを組んだsinchir0さんの予定です。
タイトルからしてとても楽しみです!(プレッシャー)

qiita.com

はじめに

本エントリは、先日行われたMoAコンペ*1に5人チームで参加したときに行っていたアレコレについて書いたものです。

5人チームで取り組むのは私自身初めての経験であり、どのようにコンペを進めて行ったのか(主に知見共有などのTips)について残しておこうと思います。

今後、分析コンペなどをチームで取り組む際の参考になれば幸いです。
(GithubでのIssue管理などはソロで参加する際にも役立つものになるのではないかと思っています)

ちなみに結果は34/4373 で銀メダルでした。解法については下記を参照ください。
www.kaggle.com

また、後日談としてTawaraさんが興味深い実験を行ってくださったので、興味のある方はこちらもどうぞ。
tawara.hatenablog.com

チームでやったこと

下記リポジトリに歴史が詰まっています。(懐かしい・・・)

github.com

工夫というほどの工夫でもないですが、ざっくり下記のような方針で行いました。

  • 「こんな実験をしようと思っている」「このDiscussionを読んだ」「このnotebookをサブするぞ」はGithubのIssueで管理
  • ローカルCVとPublicLBのスコアはスプレッドシートで管理
    • ここはMLFlowとか使うと楽になるよな〜というのはありつつ、コードコンペということで今回はアナログ管理です
  • 日常のコミュニケーションはslackで行う
    • Githubの対象リポジトリをsubscribeさせて、Issueやコメントなどはslackの方にも自動的に流れてくるようにしました
  • 毎週1回、オンラインでのチームMTGを行う
    • この議事録もGithubのIssueに残しました

※今回はコードコンペだったこともあり、各自のコードをGithubで管理するということは意図的に行っていません。あくまで、情報共有ツールとしての位置付けでGithubを用いました。

コミュニケーション

slackのワークスペースを作成して、そこで諸々やりとりをしました。
ですが、あくまでslackはコミュニケーションツールなので、知見の蓄積などはGithubにて行っていました。

slackのチャンネルは下記の3つを作りました。

  • #general
    • 主に雑談用
  • #kaggle_moa
    • 主にコンペの内容を話す場所。先述したGithubに登録された内容もここに流すように設定。
  • #submission
    • submissionする時に「今日分のサブ使いますね〜」と報告する場所。

submit回数を無駄にしないために

kaggleは日本時間のAM9時に、その日のsubmit回数が初期化される仕様*2になっているため、
#submissionチャンネルでは毎朝8時30分にリマインダーを仕込み、submit回数をなるべく無駄にしないようにしました。
(本コンペでは1日にsubmitできる回数が3回と少なかったため、なるべくこの3回を毎日使い切りたいよね〜という想いもありました)

f:id:taxa_program:20201222210905p:plain:w900
slackに毎朝8時30分に通知してくれるリマインダー

slackのリマインダーは下記を使うと簡単に作れたりします

slack-remind-creator.netlify.app

知見の共有

チームで取り組むメリットはいくつかあると思うのですが、例えばチーム内で同じような実験を複数人がおこなうと、「単位時間あたりの試行回数が増える」というメリットが活かせなくなってしまいます。
そこで、各人がやろうとしていることなどはGithubのIssueを作成するルールにしました。

このIssueの作成ですが、少しでも負担を下げるために Issueテンプレート*3を設定しておくと良いと思います。

今回は下記3つを作成していました。
(後述しますが、submissionは別にIssueにしなくてもexpetimentのコメントに紐づける形で良いかもと思いました)

  • discussion(kaggleで気になるdiscussionの概要を共有するもの。同じdiscussionを複数人で読んじゃった〜という事態を防ぐため)
  • expetiment(どんな実験をしようとしているかを共有するもの)
  • submission(どの実験・notebookをsubmitしたかを共有するもの)
    f:id:taxa_program:20201222212624p:plain
    用意したテンプレート

それぞれのIssueにどのような内容を書いていたかは先述したリポジトリを見ていただきたいのですが、 Issueで管理する方式は、Issue起点でコミュニケーションが生まれたり、関連しているものを簡単に紐付けられたりと、とてもよかったと思います。

f:id:taxa_program:20201222225514p:plain:w700
Github上でもコミュニケーションが生まれて良い感じだった図


submitした結果(スコア)は下記のようにスプレッドシートでアナログ管理していました。
(これは結構煩雑だったので、どうにかしたいところ)

f:id:taxa_program:20201222214359p:plain
ローカルCVとPublicLBのスプレッドシート

また、チームMTGの議事録はこんな感じで残していたりしました。

github.com

次にチームで参加するなら

基本的には上記のやり方で良さそう〜とは思うのですが、細かい点をいくつか改善できるかな、と思っています。

submitのIssueはいらないかも

今回はsubmitする際に、expetimentとは別にsubmissionのIssueを作ろうというルールでやっていましたが、これは結構手間だったりしたので、expetimentのIssueコメントに紐づける形で管理しても良いかもしれません。
(そもそもコードもGithubで管理できれば、Issueに紐づくPRを作れば良いことなのですが、今回のようなコードコンペの場合はそうもいかないと思うので)

Issueのタイトルだけで判断しやすくする

これはatmacupに参加していた時に作ったIssueなのですが、 Issueテンプレートのタイトルに絵文字を入れることで実験やドキュメントの区別が容易になりました。
なので、タイトルには良い感じに分かりやすい印を付けられると良いのかなぁ、と思います。

f:id:taxa_program:20201222222203p:plain:w700

最後に

やっぱりチームで参加するとモチベーションも保てますし、議論もたくさんできたのでとても楽しかったです。
Team90'sで戦ったくださったみなさん、ありがとうございました!!!&またどこかでチーム組めたら嬉しいです!

f:id:taxa_program:20201222223352p:plain:w500
黒魔術でスコアが伸びた時の様子

そして本エントリが分析コンペをチームで戦う人たちの一助になれば嬉しいです!