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

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

Kaggle Master になりました!

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

今回は、3人チームで参加した先日 Freesound Audio Tagging 2019 にて2枚目の金メダルを獲得し、Kaggle Master になることができたので私が kaggle (というか機械学習) を始めてから今までの 10ヵ月を振り返ってみようと思います。

最近 Kaggle 始めたけど titanic の次何すればええの? っていう質問を受けることも多くなったので、私の取り組みが少しでも参考になれば嬉しいです。


目次

・ Titanic, HomeCredit

・ 塩, Two Sigma

・ Quora

・ Petfinder

・ Freesound

・これから


2018年 8~9月 -- Kaggle に出会う, Titanic, HomeCredit --

  • できるようになったこと :
    1. kernel を folk して submission.csv を出力する,
    2. カラム同士をコネコネして新しい特徴を生み出して score の変化を楽しむ
    3. RandomForest
  • できなかったこと : テーブルの結合、Groupby

当時プログラミングをはじめて半年やそこらで周りにプログラミング友達が2, 3人しかいなかった私は Twitter をはじめました。 #プログラミング初心者さんと繋がりたい, や #100DaysOfCode といったハッシュタグもあり所謂プログラミングアカウントみたいなものがどっと増え始めた頃でした。

当時プログラミングアカウント界隈では、バズらせるのを目的に rubyonrails や Django のようなフレームワークで Webアプリを作り、Heroku に公開するのが流行っていました。私も例に漏れず、バズるアプリを作って一発当てようとネタを探している中で、Qiita で見つけた「AI(keras) で画像認識をする Webアプリ」(アイドルの画像分類機の作成) 記事を読み、これ面白いんじゃね?と見よう見まねで実装し、web にあげるのではオリジナリティがないので LINE BOT に仕立てて公開したところそこそこ反響がありました。

4値分類問題を設定し、Google の画像収集API でそれぞれのラベル 100ずつくらい集めました。この時、ディープラーニングで云々することの楽しさとデータを手動で集め、整形することの大変さの両方を知ることができました。 ディープラーニングにせっかく興味が湧いたものの、素人が予測モデルを作るのに必要なデータを自力で集めるのも面倒大変なところがあったので無料で大量のデータを扱えるサイトを探していたところ kaggle に出会いました。

そこでは 公開Kernal や Discussion というやその道の先人たちが知見を惜しまず公開しており、近くにディープラーニングを教えてくれる人などいない私が、独学するのに適した環境でした。

Titanic 問題を使って Kaggle の取り組み方を説明したサイト(日本語)などを参考に見よう見まねで取り組んでいきました。 また、当時アクティブだった HomeCredit コンペにも参戦してみました。 これは、金融機関の顧客データ(複数テーブル)を使い、借り入れ顧客がきちんと借金返してくれるか予測する問題でした。SQL なども使ったことがなかったので 複数テーブルにまたがった情報の取り扱いや、同じID の人が複数の情報を持っていたりと何が何だかわけがわからないまま終わりました。

Kaggle はわけがわかりませんでしたが #100DaysOfCode のタグをつけてその日の取り組みを呟くと優しい人がいいねくれたのでちょっとしたモチベーションになり続けることができました。


2018年 ~10月 -- 塩, Two Sigma --

  • できるようになったこと :

    1. ハイパーパラメータをいじって score の変化を楽しむ
    2. Keras の層を (わけもわからないまま) 追加する
    3. GCP をはじめて使う
    4. LightGBM を使う
    5. 複数テーブルの groupby --> concat
    6. 都度都度更新されるハイスコア Kernel と手元の folk してきた kernel との差分について考える
  • できなかったこと :

    1. Pretrained とか Finetune とか
    2. Predefined モデルの利用

取っ掛かりが Karas を用いた画像判別アプリの作成だったこともあり、 画像コンペに参加しようと引き続き塩コンペに参加しました。

適当な Kernel を folk (U-Net + Residual module)してきて最初は seed とか epoch数, train_test_split の比率などをいじったり最新のハイスコアカーネルとの差分についたり考えてはスコアの変化を楽しんでいました。 この頃には discussion も読むようになり、みんながやっている計算重くね? Kernal でできないぞ・・と思い立ち GCPで初のGPUインスタンスを立ててみたりしました。結局どんなインスタンス立てればいいかわからず、CPU 2core + NVIDIA TESLA P100 * 2 とかいうアホなインスタンスを立て、計算を回すも一向に計算が終わらず、無料$300クーポンを溶かすなどしてました。 discussion に出てくる ResNet34 がどうとか理解できないまま、これ以上は計算機が足らん・・となり撤退。

次は、元証券勤務ということで同じ期間に始まっていた Two Sigma コンペ(株価予測コンペ)に参加しました。 新聞記事のテキスト情報と直近10年分の株価情報という2つのテーブルが与えられていました。この時の公開カーネルをみて groupby や concat を扱えるようになりました。金融のドメインが多少あったので移動平均線ゴールデンラインといったドメイン由来の特徴量を作成し実装して LGBM に投げるなどして初のPublic銀圏に到達するなど(*1month to go) Twitter に呟いてはいいねがもらえることが楽しくてやって行きました。 リークやげきつよカーネルの登場で 2度LBが崩壊し、モチベーションが保てなくなり撤退。ただ基本的なことは結構身についた気がします。(気がする)


2018年 ~12月 -- PLAsTiCC コンペ --

  • できるようになったこと :

    1. ソロ銅メダルを入手!
    2. 巨大データを扱う (20GB)
    3. wikipedia で得た知識を特徴量にする
    4. ライブラリの実装を見に行って手元でそれっぽく再現実装する
    5. discussion の「情報」をコードにする
  • できなかったこと : GCP で適切なインスタンスを立てる

Twitter で色々な kaggler をフォローするようになった頃、TL の強強な方々が参加されるという PLAsTicc コンペに私も参加してみることにしました。この頃の私は 「LightGBM に何かしらの特徴量を渡して出てきた予測値を to_csv して submit する」ことには慣れていたのでひたすら特徴量のアイデアをひねり出すことに執心しました。

そのため discussion で皆が使っているらしいライブラリ (tsfresh) を Kernel で利用しようとして落ちて使えなかった時はドキュメントを見に行って使えそうな関数を手元で再現してみたり、wikipedia やよくわかる天体観測みたいな web ページみては特徴を作っていました。

これがなかなか面白く、特徴量を思いつくたびに LB を更新し、一時は銀圏まで行きました。 結局は public で80位くらいで Finish し、shake down の洗礼を受け Private 103位のなんとか銅メダル獲得で終えました。


2019年 ~2月 -- Quora コンペ --

  • できるようになったこと :

    1. ソロ銀メダルを入手!
    2. 初の NLP
    3. 初の PyTorch
    4. Kaggle Expert になった
    5. 過去類似コンペを参考に特徴量を生成
  • できなかったこと :

    1. 高速化等の solution にある工夫
    2. NN レベルでの工夫

やったことのない領域にチャレンジしてみようということで自然言語処理に挑戦する目的で Quora コンペに参加しました。

最終的にはソロ銀メダルを獲得することができましたが、今思うとげきつよカーネルに過去類似コンペでやっていた text特徴の追加と NG辞書の拡充といったくらいの変更しかできなかったこと、評価指標が f1 score というちょっとした閾値の違いで差が出るものであったことこともあり運の要素が強かったなという所感ですが、何より自力で Expert にまで慣れたのは嬉しかったです。


2019年 ~3月 -- Pet コンペ --

  • できるようになったこと :

    1. 初チーム参加、初入賞
    2. 初の Multi-modal コンペ
    3. PyTorch に慣れた
    4. Predefined model の利用

またまたやったことのないことにチャレンジしてみようということで、複数データソース(teble, text, image) かつ外部データありの Pet コンペに当初はソロで参加しました。

このことについては別のエントリでも書きましたが、ひとりで銅メダルけん上位くらいまで行ったタイミングでつよつよな kaggler のみなさまとチームを組ませていただくことになりチームとしてガンガンスコアを伸ばして行くことができました。

一方で個人の取り組みでいうと、自分が最初に伸ばしていた model を強化することと、チームメイトの一人が discussion でこんな情報出たと共有してくれたもののうち、優先順位の低いものを1つ1つ潰していくことの両輪でした。最終的な weight は 0ではないくらい (シングルスコアはかなり悪かったが、抜いたら抜いたでスコアが落ちる)ということでチーム準優勝という輝かしい実績に反して、個人の力の及ばなさを強く実感する出来事でした。

とはいうもののこの pet コンペを通して、つよつよ kaggler の取り組みや思考、コンペを進める上でのスケジュール感、そして何より、自分の取り組みに対してフィードバックがもらえたことが自分の成長を加速させました。Wodori (その時のチーム名)のみなさまには感謝しかないです。

この Pet コンペでの取り組みを通して PyTorch でいい感じにできるようになったことが今の仕事や、後述の音声コンペにとても活きました。


2019年 4~6月 -- 音声コンペ --

  • できるようになったこと :

    1. 金メダルを入手!
    2. Kaggle Master になった
    3. PyTorch かなり慣れた (個人比)
    4. 論文を元に augmentation を実装
    5. Predefined の model のソースをいじって実装

理論を強化しようと参加したとある勉強会でツイッターのアカウント名と顔が一致した某氏と意気投合し、一緒にコンペに参加することになりました。.wav のデータを扱うの初めてだし面白そうという理由で音声コンペを選びました。その実態は画像コンペで個人的には塩コンペのリベンジかつPyTorch で色々やれてよかったです。Shirogane (当時のチーム名) のみなさまありがとうございました。

画像コンペということもあり、よく耳にする 〇〇 Net を片っ端から実装してみたり、同時期にやっていて先に終わった壺コンペの solution をみながら試していない Network や augmentation, Layer を実装してみたりするなど自分の中にかなりの知見が貯まりました。一方でチームでの weight はというとパッとせず、総合 7位金メダルという素晴らしい結果とは裏腹に、正直なところ自分の中で少なからず悔しい想いも残りました。この気持ちとチームで得られた知見を糧に精進していくつもりです。


これから何するの

tier 的には Kaggle Master になることができました。しかし、その瞬間瞬間で Kaggle Master たる働き・貢献ができていたのか? と自問自答するとうーんというのが正直なところです。(Weight は少なかったかもですが、投入時間は負けず劣らずだったはずです・・) 従って、まずは真の Kaggle Master を目指して以下の内容に取り組んでいこうかなーと思っています。

  • コード資産の拡充、画像、NLP コンペで使うベースライン notebook の作成

  • NLP コンペの solution であった network を再現実装して GitHub に草を生やす

  • NLP コンペの solution の手法リストを作成する

  • NLP コンペは(できるだけ)ソロ参加する

  • discussion 投稿、BaseLine Kernel 投稿

今までかなり場当たり的にやっていたのですが、そろそろ自分のやり方のようなものを確立したいなと思っています。特に NLP のコンペではどのコンペでもやっているような共通の処理があったり, 画像コンペでは predefined model の使用して色々な augmentation を試して~ などやることの大筋が変わらないなど一度きれいにまとめておくと、あのコンペの何位の手法と試すぞ!と行った実験を高速に回せるようになったり、どのコンペに出ようかなと思った時のとりあえずの 1st sub がすぐに実装できるのは判断の上で重要だと思います。

またせっかく業務で自然言語処理に取り組んでいるので、NLP系のコンペはしばらくソロで参加して力をつけたいと思っています。

最後に tier 的には Master になったのでできる範囲でコミュニティへの貢献できるように努めていこうと思っています。kaggle コミュニティだけでなく kaggler-ja での発言も増やしていきたいなあ。


以上です、ありがとうございました。