RareJob Tech Blog

レアジョブのエンジニア・デザイナーによる技術ブログです

Kaggle参加してみた話

レアジョブEdTech Lab.の齋藤です。

この1ヶ月程でAPEXにハマりました。人生初FPSなので上位3チームに入れると嬉しいくらいのテンション感で戦っています。
現実ではKaggleで上位10%を目指して戦っていたので、今回はそのことを書いていきたいと思います。

Kaggleとは

ご存知の方も多いと思いますが少し説明させていただきます。
Kaggleとはデータサイエンスコンペティションを提供しているプラットフォームです。1コンペティションあたり約2〜3ヶ月程度の期間で、スコアを競い合っていきます。

www.kaggle.com

目標と参加体制

目標

冒頭に上位10%を目指したと書きました。
では、なぜ今回の目標が上位10%に設定したかというと、単純に銅メダルボーダーであるということです。

Kaggleにはメダル制度が存在しています。コンペの参加チーム総数でメダル獲得基準は若干変わりますが、順位に応じて金銀銅のメダルが与えられます。
詳細はKaggle Progression Systemを参照してください。

ということで、今回参加したコンペでは銅メダルの獲得ラインが全体の10%に入るというものだったので10%を目指しました。
1143チームが出場しているので、114位がボーダーです。

メンバー


チームは3人、全員EdTech Lab.のメンバーで出場しました。それぞれのKaggle経験は以下のような状態で開始しました。

  • 齋藤(私): 2年ぶりくらいのKaggle。
  • Kさん: 初Kaggle。
  • Cさん: しっかりKaggler。

2/3がほぼほぼKaggle初心者の状態での開始となりました。ちなみに私はチーム参加初めてです。

進行


チーム全体としては週に3時間ほど時間を作りコンペに参加しました。
ナレッジや議論、Kaggle上の気になるDiscussion・Notebookなどの情報共有をgoogle meet上で行い、その後個人作業という形で進行しました。
また、それらの情報はGithubでメンバーのみのプライベートリポジトリを作成し管理を行いました。

コンペ概要

参加したコンペ

で、どのコンペに参加したのかですが、 Rainforest Connection Species Audio Detection | Kaggleに参加しました。鳥蛙コンペと呼ばれているコンペです。

www.kaggle.com

課題

熱帯雨林に生息する鳥やカエルの種類を与えられた音声データから分類するもので、いわゆる多クラス分類のタスクになっていました。

データ

60秒の音声データが与えられました。
また、学習データは現行のアルゴリズムが判定した結果に対して

  • 専門家が正しいと判断したもの(train_tp)
  • 専門家が間違いと判断したもの (train_fp)

の2種類が与えられました。

しかし、テストデータは専門家によるアノテーション結果でした。

これにより、ラベルの分布が学習時とテスト時で大きく変わり、データシフトが起きやすい状態が発生しました。

難しい点

  • データをtrain_tpだけにするとデータ数が極端に少なくなってしまう。

  • missing labelなものやノイズが多く含まれている

  • submitすると精度が下がりがち(Validationが機能不全を起こしている)

手法

Submitしたモデル

3人の作成したsubmission用csvを混ぜたものを提出しました。

アプローチ

基本的にはmixupというaugmentation手法を使用してデータをかさ増ししていきました。
簡単な説明としては、2つのデータを混ぜて新しいデータを作成する手法になります。
嬉しい点は、ドメイン知識がなくてもデータが増やせるというところにあります。
そのため、

  • ある程度正しくアノテーションされているデータであるtrain_tp数が少ない

  • 生物の鳴き声音に対するドメイン知識を持っていない

という状態なので非常に助かりました。

詳細な数式や理論は以下の論文を参照してもらえるとわかるかと思います。

arxiv.org

予測はResNetで行いました。画像認識において有用な手法として挙げられている物です。
今回は音声データをメルスペクトログラムに変換したものを使用したので、画像系の分類タスクと捉えられるのでこの手法を取りました。

本音では、このコンペに参加したとき

ResNet34 More Augmentations+Mixup+TTA (Inference) | Kaggle というNotebookが公開されていたためとっつきやすいと思い選択しました。

余談ですが、上位解法として自力でアノテーションをしたというものがあり、”力”を感じました。 www.kaggle.com

結果

肝心の結果ですが... f:id:mag_sn:20210310200509p:plain メダル獲得ならずでした。
取得まで0.08程足りなかったというあまりにも惜しすぎる結果でした。 172位ほどshake upしましたが、全体の13.2%の位置までで止まってしまい、もう一息〜という感じでした。

振り返ってみて

今回Kaggleに参加してみての反省ですが、

  • チームのタスク管理が難しかった
  • データへの理解が足りていなかった

この2点が大きな課題だと感じました。

特にタスク管理は、チーム内の議論が手法共有などKaggleのDiscussionに寄ってしまい、お互い着手しているタスクを認識し切れていない状況を発生させてしまいました。
作業を個人に任せすぎた面もあり、作業報告が「今こういう手法でやってます」という報告になってしまい手法被りも事前に検知できなかったという点もあります。 結果的に近い手法を使用した実験を行っており、アンサンブル時にモデルのバリエーションが少ないという状態となり、スコアを上げ切れなかった原因にも繋がってしまったかなと反省です。

次回は行う作業や使用手法を事前に共有・管理できるようにしくみを作っていきたいと思います。

チーム参加でよかったことは、

  • 情報が追いやすい
  • 日本語で議論可能な場を持てるという安心感
  • モチベーションが維持される

といったものが挙げられると思います。
気になるDiscussionや論文といった情報が逐次的に共有されるので、一人での参加よりも多くの情報を追っていけるのは非常に助かる側面だと思いました。
また、それらの情報に対して日本語で議論できるので思考や理解がスムーズなのも利点だなと感じました。

最後に

今回はかなり悔しい結果に終わってしまいました。
というわけで、新メンバーを1名追加し Indoor Location & Navigation | Kaggle に参加してメダルを目指します。

www.kaggle.com

私たちの戦いはまだまだこれからです。次回の結果にご期待ください。

参考

https://connpass.com/event/204547/presentation/ https://kutohonn.hatenablog.com/entry/2021/02/18/224002 https://nonbiri-tereka.hatenablog.com/entry/2020/01/06/082921 https://qiita.com/iwashi-kun/items/fec710294e01a48c9e5d http://wazalabo.com/mixup_1.html https://openreview.net/forum?id=r1Ddp1-Rb https://www.inference.vc/mixup-data-dependent-data-augmentation/ https://www.kaggle.com/c/rfcx-species-audio-detection/discussion/220522 https://ichi.pro/merusupekutoroguramu-o-rikaisuru-277775661583955 https://www.bigdata-navi.com/aidrops/2611/