Kaggle Grandmaster になるまでを振り返る

このたび Kaggle Grandmaster になることができたので振り返ります。

https://www.kaggle.com/yasufuminakama

はじめに

この記事では、自分が kaggle を始めてから Grandmaster になるまでの道のりを振り返りたいと思います。kaggle 始めたての時は機械学習初心者みたいなものだったので、どのように成長していったかをコンペごとに振り返っていけたらと思います。技術的なところまで掘り下げた内容ではないのでご注意ください。

Kaggle を始めたきっかけ

大学では理工学部管理工学科というところで、OR・IE・人間工学・統計学金融工学・情報システム・機械学習などを幅広く学んでいました。そして学部3年の3月あたり(つまり学部4年になる直前)に、3日間の短期インターンみたいなやつで kaggle の House Prices に取り組んだのが kaggle との初めての出会いでした。その時点では大学では、 R を使って train に fit させて test を predict するくらいしか経験していなかった(いわゆる機械学習初心者だった)ので、実データに対する Feature Engineering だったり、Validation の構築だったりと、初めて機械学習の実践というものをそこで体験して、kaggle を通してもっと知識を身に付けたい(あとは単純に競争が楽しい)と思ったのが、kaggle を始めたきっかけでした。

初期は何で勉強したのか

初期は python を扱うのも初めてだったので、まずは kaggle learn をやりました。

https://www.kaggle.com/learn/overview

また機械学習初心者向けの本でも勉強しました。

最近は kaggle 初心者向けの書籍もあるので、「kaggle を始めたい!」という方はこちらの書籍もいいと思います。

kaggle スタートブックの次のステップとしては、こちらの書籍がいいと思います。

メダルが取れない時期(学部3年3月〜学部4年2月)

Home Credit コンペや TGS Salt コンペや Elo コンペに出てみて、Public Notebook や Discussion を参考に試行錯誤するものの、試行錯誤するにもまだまだ経験不足でメダルも取れないような時期でした。いま振り返ると、当時は取れる手数も少なかったので、まあメダル取れないよねという感じです。ただ、コンペに参加するだけ経験知はたまっていくので(ちゃんとコミットすればの話ですが)、この時期は地道に経験知をためる時期だったと言えると思います。(ポケモンで例えると、アチャモのレベルが上がった程度のもの)

メダルが取れるようになってから(学部4年3月〜)

PetFinder コンペ(チーム銀メダル)

メダル獲得への転換点となったのが PetFinder コンペでした。Public Notebook や Discussion の特徴量を組み合わせたり、自身の EDA から編み出した特徴量を加えたりすることで、なんとかソロで銀圏につけていたところ、金メダルを目指してチームマージをすることになりました。結果は銀メダルでしたが、そのチームマージのおかげで学びのスピードが何倍にもなり、多くのことを学ぶことができました。(ポケモンで例えると、ここでアチャモからワカシャモに進化できたイメージ)

このコンペは以下の記事で振り返っています。

nmaviv.hatenablog.com

ここで一つ言えるのは、優秀な方とのチームマージは学びのスピードが何倍にもなるので、自分の学びになりそうなチームマージは積極的にした方が良いということです。

Santander コンペ(ソロ銀メダル)

PetFinder コンペの後は Santander のよくわからないコンペに出ました。Discussion や Public Notebook を注意深く追って Fake を除去する必要があるということに気づけば、あとは基本的な特徴量を作るだけで銀メダルを取ることができ、ここで Expert になることができました。

このコンペは終了後に上位勢のコードを見ることで NN のモデリングなど学ぶことができました。

壺コンペ(チーム銀メダル)

このコンペは以下の記事で振り返っています。

nmaviv.hatenablog.com

このコンペを始めようと思ったきっかけは、メダルを取りたかったからではなく PyTorch を書けるようになりたかったからです。ちなみにこの時 PyTorch の勉強には PyTorch Tutorials の他に以下の書籍を参考にしていました。

このコンペでは PyTorch の実践をしたいということで、最終的には以下のコードを参考に圧倒的成長が得られました。強者のベースラインはとてもありがたいです。

https://github.com/lopuhin/kaggle-imet-2019

チームメイトにも色々教わって、とても勉強させていただきました。

Jigsaw コンペ(チーム銀メダル)

このコンペも、メダルが取りたいというよりも NLP ができるようになりたいと思い参加していたものでした。結果的には PetFinder コンペでライバルとして競っていたチームの人たちとチームマージして、NLP 初心者の身で色々教えていただき、NLP で取り組むべき定番なアプローチなど、多くのことを勉強させていただきました。

またこのコンペで上位が使っていた手法を、後の Google Quest コンペなどでも試して精度を上げることができ、とても勉強になるコンペでした。上位の手法を拾って手札に入れておくのは大事ですね。

網膜コンペ(チーム金メダル)

このコンペは壺コンペで学んだことをそのまま活かせると思い参加しました。しかし CV はあてにならず、External Data を使って如何に汎化したモデルを作成できるかというところで、とにかく多くの実験を回してみて LB で検証するということをやっていました。チームメイトの力もあってなんとか獲得できた金メダルでした。詳しくは以下の記事で振り返っています。

nmaviv.hatenablog.com

チームの Solution は以下のリンクです。

https://www.kaggle.com/c/aptos2019-blindness-detection/discussion/107944

このコンペではデータセットの分析の必要性だったり、モデルの予測根拠の可視化だったり、なるべく汎化するような学習のさせ方だったり、データが少ないときの Pseudo Labeling の重要性だったりと、色々なことを学ぶことができました。

このコンペの結果から、Master になることができました。

TITAN RTX 購入

kaggle が GPU の制限を始めたこともあり、自由に使うことができる GPU があれば今後の学習が捗ると思い、先行投資の考えで TITAN RTX を購入しました。後の OpenVaccine コンペではフル稼働で活躍してなんとか金メダルをもぎ取ることができたので、購入してよかったなあと思います。

Kaggle Days Tokyo

kaggle days では強い人たちの発表を聞くことができ、とても勉強になりました。さらにそこで開催されたコンペの上位解法も学びが多く、早速実装して今後のコンペで活かせるようにしました。またここであらためて自分のパイプラインのようなものを整備し直し、今でもそこからコピペで取ってきて使ったりしています。みんなやっているとは思いますが、蓄積してきた任意のコードをどこかのタイミングで使い回せるようにまとめておくと、取ってきやすくて楽ができています。

2019 DSB(チーム金メダル)

 ブログで振り返っていないので当時のツイートを貼ります。

チームの Solution は以下のリンクです。

https://www.kaggle.com/c/data-science-bowl-2019/discussion/127500

このコンペでもチームメイトから多くを学びました、やはりチームを組むことで得られるものは多いです。また上位解法でユニークだった Transformer によるモデリングのコードもとても勉強になりました。

https://github.com/lime-robot/dsb2019

Google Quest(ソロ銀メダル)

このコンペは Jigsaw コンペで気になっていた解法を試したり、BERT などを回すということで自宅の GPU をコンペで初めて使ってみたりと、色々試してみたいことを試そうという思いで始め、それらが結果につながり銀メダルを獲得することができました。

このコンペは以下の記事で振り返っています。

nmaviv.hatenablog.com

このコンペも上位解法がとても勉強になりました。

Bengali コンペ(メダルなし)

データの説明もろくに読まずにやっていたので敗北しました。当たり前のことですが、データの説明はよく読んで適切なモデリングをしようという教訓を得ました。これが TReNDS コンペで活きました(?)

このコンペはコンペ初期に自分で Baseline Notebook を投稿してから放置していて、久しぶりにチェックすると有用な Notebook や Discussion が出てきていたので、それらをもとに再開しようと取り組んだコンペでした。

このコンペは以下の記事で振り返っています。

nmaviv.hatenablog.com

チームの Solution は以下のリンクです。

https://www.kaggle.com/c/trends-assessment-prediction/discussion/162799

このコンペは、これまでのコンペを通じて培ってきた知識を的確に使うことができた印象です。任意のコードをまとめておいたこともあり、コーディングにかけた時間も比較的少なかったです(自宅の GPU を他のコンペに使用していたので詰めるところが限られていたというのもある)。データの説明をよく読んで適切なモデリングをしようという教訓通り、データの説明を踏まえたモデリングができたかと思います。またこのコンペでは初めて海外の方と組んでみて、コミュニケーションもスムーズにいき、とてもいいチームワークができました。(ポケモンで例えると、このあたりでワカシャモからバシャーモに進化したかも)

OSIC コンペ(ソロ金メダル)

このコンペもコンペ初期に自分で Baseline Notebook を投稿してから放置していて、久しぶりにチェックすると有用な Notebook が出てきていたので、それをもとに再開しようと取り組んだコンペでした。 

このコンペでは念願のソロ金を獲得することができました。

Solution は以下のリンクです。

https://www.kaggle.com/c/osic-pulmonary-fibrosis-progression/discussion/189220

正直、このコンペは LB に Overfit している参加者があまりにも多かったことと、強者をあまり見かけなかったことから、金メダルのチャンスはあると思っていました。結果、CV と Private LB を連動させることができていた(差分がはっきりとしたサブしか投げていないというのもある)ので、とても満足な結果でした。効くモデルが金メダルを獲得した TReNDS コンペと似ていたので、そのあたりの勘があったのも良かったです。

Solution の一部は自分で投稿した Baseline Notebook に基づいたもので、役に立ったと言ってくださる人もいて、公開して良かったなあと思います。

OpenVaccine コンペ(チーム金メダル)

このコンペは開催期間が短かったこともあり、コンペ初期にチームマージをして取り組みました。All you need is diversity というチーム名の通り、とにかくモデルをたくさん作ってなんとかごり押して獲得できた金メダルでした。

チームの Solution は以下のリンクです。

https://www.kaggle.com/c/stanford-covid-vaccine/discussion/189728

このコンペは stacking の威力を実感したコンペで、CV 自体は weighted blending の方が良かったので weighted blending のサブしか投げていなかったところ、サブに余裕があるときに stacking のサブをチェックしてみると、weighted blending よりも良かったので、最終的には stacking model を複数作った後にそれらを weighted blending するというごり押しをしました。これをしなかったらギリギリ金メダルを逃していたので、ごり押しにごり押しておいて本当に良かったなと思います。

そして有用な Public Notebook が数多く投稿されたコンペで、とても勉強になりました。

振り返りまとめ

以上が kaggle を始めてから Grandmaster になるまでの振り返りになります。この振り返りから言えることは以下の事柄でしょうか。

  • チームを組むと学びのスピードが何倍にもなるので、自分の学びになりそうなチームマージは積極的にするのが良い
  • コンペ終了後は上位勢の解法やコードを見て、手札に加えておくと良い
  • 蓄積してきた任意のコードはどこかのタイミングで使い回せるようにまとめておくと良い
  • コンペに参加すればするほど経験知がたまるのでどんどん参加した方が良い

ありきたりな事柄にまとめられました。

終わりに

今までチームを組んでくださった方々と有用な解法やコードを共有してくださった方々のおかげで Competitions Grandmaster になることができました。Grandmaster と言ってもただの称号に過ぎず、まだできないことはたくさんあるので、これからもコンペに参加して自分に足りない部分を学んでいけたらと思います。

また kaggle は学びのプラットフォームとしてとても完成度が高く、たくさん学ばせてもらったので、自分も貢献していけたらと思い Baseline Notebook を投稿するようになりました。次は Notebooks Grandmaster になれたらいいなと思います。