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

はじめに

約5年前にKaggleを始めてから、昨年の12月にKaggle Competitions Grandmasterになることができました。この機会に、Kaggleを始めてからGrandmasterになるまでの過程を振り返ってみたいと思います。

Kaggleに参加する前は、機械学習に関する知識はほとんどありませんでしたが、質の高い公開ノートブックやディスカッション、日本のKaggleコミュニティ、頼りになるチームメイトのおかげで、なんとかKaggle Grandmasterになることができました。

だらだらと振り返っていたら、思ったより長文になってしまったので、適当に飛ばしつつ読んでいただけると幸いです。

www.kaggle.com

バックグラウンド

参加前スペック

  • 学歴:経営工学を専攻する大学院2年の時にKaggleを開始。
  • 研究テーマ:組合せ最適化のアルゴリズムに関する研究
  • 機械学習経験:なし。
  • プログラミング経験C言語のみ。Pythonは未経験。

大学院での研究テーマ

大学院での研究期間中、私は看護師の勤務スケジュール最適化という、組合せ最適化を応用した「ナーススケジューリング問題」に取り組んでいました。今でいうところの、KaggleのサンタコンペやAtcoder Heuristic Contestに類似した問題設定だと思っています。具体的には、世界中の研究者が挑むベンチマーク問題に対して、組合せ最適化技術を用いたアルゴリズム開発に取り組みました。残念ながら、先行研究を上回る成果を出すことはできませんでしたが、この研究を通じて「世界中の研究者が同じ問題に取り組み、その性能を競い合う」ことの醍醐味を味わいました。この経験は、高尚なオンラインゲームに参加しているかのような興奮がありました。

Kaggleとの出会い

そんなことを思いながら研究をしていた時、技術領域はやや異なるものの、世界中の研究者やデータサイエンティストが同一のデータセットを用いてAIの精度を競う、Kaggleというプラットフォームの存在を知りました。当時、私は機械学習に関する知識を一切持っていませんでしたが、研究で感じた「世界中の技術者が同じ課題に挑み、その性能を競う」という状況に強く惹かれました。さらに、研究成果は論文で発表するのが一般的な中、Kaggleでは提出した解がリアルタイムで評価され、即座に順位が表示される点にも大きな魅力を感じました。このような背景から、機械学習の知識はなかったものの、Kaggleへの参加を強く望むようになりました。

下準備期間

Kaggleをはじめたいと思ったものの、上述の通り機械学習Pythonの知識が全くなかったため、実践前に最低限の知識を身につけることを決めました。約1-2ヶ月かけて、Pythonの基礎、データ分析ライブラリ、機械学習の初歩を学ぶために数冊の入門書に目を通しました。この準備フェーズは短期間で終えましたが、Kaggleには豊富な学習リソース(ディスカッションやノートブックなど)があり、実際にコンペティションに参加しながら学ぶことができたため、振り返ってみると、この初期段階での準備は、Kaggleを始めるにあたって十分だったと感じています。

参加コンペ振り返り

ここからは参加したコンペについてだらだらと振り返りをしていきます。

初参加~Expoertになるまで(Kaggle初参加~半年)

始めてコンペに参加した時期でした。参加当時は知り合いにKaggleをやっている人はおらず、一人で黙々と参加していました。 何もわからず公開notebookを動かしてましたが、徐々に改善が見え、すぐに熱中した記憶があります。このとき感じたLBを駆け上がる快感が忘れられず、5年間Kaggleを続けてこれたと思っています。

Elo Merchant Category Recommendation(20位🥈)

このコンペティションでは、クレジットカードの顧客情報や購買履歴を基に顧客ロイヤリティスコア(おそらく顧客満足度的なもの)を予測します。これが私が本腰を入れて参加した初めてのコンペでした。公開されているNotebookを基にしながら、特徴量を追加し、LightGBMモデルを開発しました。提出後に即座にスコアが表示される点が、オンラインゲームのような中毒性を感じさせ、のめり込んでいったのを覚えています。最終的にはシェイクアップを経て銀メダルの20位でフィニッシュしました。はじめてのコンペだったこともあり、メダルが取れたらラッキーくらいのノリで参加したので、個人的には満足の結果でした。

Google Cloud & NCAA® ML Competition 2019-Women's(44位🥈)

毎年開催されているバスケコンペに参加しました。このコンペは先に参加したEloのコンペとは異なり、前年の上位者が公開したNotebookを基に、わずかなチューニングを加えたものを提出するだけでした。しかし、そのNotebookの質が非常に高かったため、ほとんど手を加えていないにも関わらず、運良く銀メダルを獲得することができました。この結果により、私は2枚目の銀メダルを獲得し、Expertになることができました。

Masterになるまで(Kaggle歴半年〜2年半)

初めの半年で2枚の銀メダルを獲得できたので、金メダルを取ってMasterに昇格するのは比較的容易だと思っていました。しかし、実際にMasterの称号を得るまでにはかなりの時間がかかりました。またここに書いてないものの、中途半端に参加し、途中で挫折してしまったコンペは他にもたくさんありました。この時期は、金メダルを意識しすぎた結果、コンペを終盤までやりきれず、実力もつかないという悪循環に陥っていた気がしています。

IEEE-CIS Fraud Detection(89位🥈)

このコンペでは、クレジットカードの顧客情報を基に不正取引を検出するタスクに挑戦しました。こちらも公開されているNotebookを出発点として特徴量を追加し、スコアを徐々に向上させることで銀メダルを獲得しました。しかし、金メダルを獲得したチームはある「magic」を見つけており、上位とのスコアとの差は大きかったです。この経験を通じて、銀メダルから金メダルへの壁の高さを痛感しました。

NFL Big Data Bowl(70位🥈)

アメフトのプレイヤーの位置や速度情報等から、ランプレイで攻撃側が進むヤード数を予測するコンペでした。このコンペで関西のKaggler会で知り合ったくるぴーさんOsciiArtさんと初めてチームを組みました。これまでソロでの参加経験しかなかったため、チームでワイワイ議論しながら進めていくのは非常に新鮮で、また良いサブを出したメンバーはお互い称え合うような雰囲気もあり、非常に心地よいチームでした。またコンペとしても、ドメイン知識収集のためアメフトの入門書でドメイン知識を習得し、それを特徴量に組み込んでスコアが改善したことも非常にやりがいを感じました。最終的には洗練されたtransformerのモデルにボコボコにされ銀メダルとなってしまいましたが、非常に刺激的で学びの多い経験でした。

Bengali.AI Handwritten Grapheme Classification(211位 メダル圏外)

画像からベンガル語の文字を認識するコンペでした。この頃にRTX 2080-tiを購入しました。これまでは計算リソースの関係でテーブルデータのコンペしか参加していませんでしたが、gpuを手にいれたことで、画像コンペにも参加しようと思いこのコンペを選びました。またこのあたりで、Dockerによる環境構築をブログ等を参考に学びました。そこから現在までは、基本的に全てのコンペでKaggleのDockerイメージを使ってコンペに参加しています。

画像処理やニューラルネットワークは未経験でしたが、公開されているNotebookをもとにPyTorchでの画像処理を学びました。実験を重ねる中で、cutmixやgridmaskといった重めのaugmentationがCVとLBのスコア向上に寄与することが分かり、パブリックLBでは金メダル圏内に迫る順位となりました。これまでのコンペではパブリックLBでそのような順位に入れたことがなかったため、これを機に金メダル取るぞと意気込み、inoichanさんとチームを組みました。

最終的にパブリックLBでは銀メダル上位でフィニッシュしましたが、プライベートLBではメダル圏外に大きく落ち込むシェイクダウンを経験しました。このときは何かの間違いだと思い、何度もブラウザを更新していたことを覚えています。当然結果は変わりませんでした(笑)

原因は、プライベートテストセットに存在する特有の文字パターンへの対策不足でした。上位陣はこの点を見越した全く異なるアプローチを取っており、私の戦略が根本から誤っていたことを痛感しました。この経験から、トレインデータ、パブリックテスト、プライベートテスト間の分布の違いや適切なCVの設計に、より一層の注意を払うようになりました。

Google Smartphone Decimeter Challenge(6位 🥇)

GPS衛星測位をテーマにしたコンペに挑戦しました。序盤に公開されたNotebookを少し改良したところ、早速銀メダル圏内に食い込むことができたので、本腰を入れて参加することにしました。同じコンペに参加されていたpaoさんshimacosさんLightさんとチームを組みました。コンペの終盤、チームメイトが発見してくれた「GNSSアプリを用いたADRの測位結果を予測に取り入れる」というアプローチにより、精度が大幅に向上し、最終的に金メダルを獲得できました。念願のMasterにはなれたのは大変嬉しかった一方、チームメイトのレベルの高さには驚かされました。特にこのコンペでGMになられたshimacosさんは、データやドメインへの理解の深さが圧倒的で、さらに精進せねばと思ったコンペでもありました。

Grandmasterになるまで(Kaggle歴2年半~5年)

私の場合は、Masterに昇格してから約2年半でGrandmasterの称号を獲得しました。期間としては決して短くはないのですが、そもそも自分がGMになれるとはあまり思っていなかったため、体感としてはGMになるまではあっという間に感じました。この時期は「Masterになるための金は取れた。GMはおそらく無理だろう」と思っていたため、金メダルへのこだわりはあまりなくなっていました。最終的には、頼もしいチームメイトに恵まれたり、幸運が重なったりして、ソロでの金メダルを含む4つの金メダルを獲得することができました。

U.S. Patent Phrase to Phrase Matching(24位🥈)

この時に初めてNLPコンペに挑戦しました。複数のバックボーンモデルをブレンドし、細かなチューニングを施すことで序盤には金メダル圏内に入ることができました。一方、終盤になるとスコアが著しく高いチームが現れ始め、徐々にランキングが下がっていきました。

順位が近いcolumさんodedeさんkurutonさんchrisさんチームとマージして頂き、スコア向上を狙いましたが、上位チームとの差を埋めることはできず、最終的には銀メダルでコンペを終えました。上位チームの成功の鍵は、入力テキストの前処理に特別なmagicがあったようで、それを見抜けたかどうかでスコアが大きく変動していたようです。

この経験から、上位とのスコア差が大きい場合、細かいチューニングだけでは追いつけないことを学びました。そういう場合は、より根本的な入力の変更やアーキテクチャへの大幅な修正といった、より大胆な実験が必要だと感じるようになりました。

ちなみにこのコンペで参考にさせて頂いていた公開notebookにて、実験管理ツールのwandbを使っており、それがきっかけで現在でも実験管理はwandbを使っています。

Google Smartphone Decimeter Challenge 2022(25位🥈)

2021年に引き続き、衛星測位のコンペに参加しました。今回は会社の同僚のrinchaさんfthashさんJin Kさんとチームを組んで挑戦しました。前年に金メダルを獲得した経験を踏まえ、同じアプローチを取ればある程度の成果が期待できると考えていました。しかし、データの傾向が前年とは異なり、加えてGPSの専門家の方々が序盤から強力なベースラインを公開していたため、前年の解法の単純な再現では勝負になりませんでした。公開された強力なベースラインを改良し続けた結果、最終的に25位の銀メダルでフィニッシュしました。金メダル獲得は叶いませんでしたが、会社の同僚と、普段の業務とは異なるテーマについて、ワイワイ議論しながら進めるのは、非常に新鮮で楽しかったのを覚えています。

1st and Future - Player Contact Detection(5位🥇)

NFLのプレイヤー間の接触を、動画やセンサーデータから予測するコンペに挑戦しました。動画データの扱いは初めての経験でしたが、公開されたNotebookを基に徐々に改良を加えていきました。コンペの中盤で、順位が近かった日本人のsqrt4kaidoさんsomeyaさんtamoさんチームに声をかけ、組んで頂きました。特に印象的だったのは、チームメイトのニューラルネット力の高さでした。私はニューラルネットモデリングに全く知見がなかったため、チームメイトのTSM等様々なモジュールを見事に駆使する様子から多くを学びました。強力なチームメイトのおかげで、金メダルを獲得し、私にとって初の賞金を手に入れることができました。

Benetech - Making Graphs Accessible(4位🥇)

様々な種類のグラフ画像から値を読み取るコンペに参加しました。個人的には過去に参加したコンペの中で、問題設定の面白さでは最高のコンペだったと感じています。image to textや物体検出など、多様なアプローチが考えられ、自分でデータを生成したり、外部データを工夫して活用するなど、試せることが非常に多かったです。エラー分析を通じて改善を繰り返すという王道のプロセスで、やればやるほどスコアが上がった点もこのコンペの魅力でした。途中でNFLコンペでも組んで頂いたsomeyaさんと再び組ませていただきました。someyaさんは相変わらず頼もしいチームメイトで、多くの刺激を受けながら参加していました。終盤では外部データのライセンス問題でホストに振り回されてしまうこともありましたが、最終的には4位入賞し、金メダルを獲得できました。

CommonLit - Evaluate Student Summaries(5位🥇)

生徒が書いた要約文の質を評価するコンペに参加しました。いつものように、公開されているNotebookを出発点にして作業を進めました。何の気なしにDeBERTaのmax_lenを大きくしたサブミッションを行ったところ、意外にもLBスコアが向上し、その結果、シーケンスの長さに関する扱いに焦点を当てて実験を続けました。さらに、レイヤーの凍結など、学習プロセスの細かなチューニングを施しました。終盤ではPublic Leaderboardで35位あたりを行き来しており、金メダル獲得は難しいと感じていたため、チームマージを試みずに可能な限りの改善を施してコンペを終えました。幸運にも、最終的にはシェイクアップによりソロで金メダルを獲得することができました。

Stanford Ribonanza RNA Folding(4位🥇)

同じ会社のyu4uさんtattakaさんとチームを組んで参加しました。当初は軽い気持ちで「テーブルでのNNの知見を深めましょう」くらいのノリでスタートしたチームだったのですが、いつの間にか金メダル圏内でガッツリ参加するチームになっていました(笑)。このコンペでは、学習の安定性に苦労し、わずかなハイパーパラメータの調整で精度が大きく変わってしまう等がみられ、ニューラルネットワークの扱いの難しさを改めて感じました。また、チームメイトの高いニューラルネットワークに関する技術力には驚かされ、大きな刺激を受けました。自分は、前回のRNAコンペでnyanpさんが実装した手法をベースになんとかスコアを伸ばすことができたため、nyanpさんには大変感謝しています。最終的にこのコンペで4位に入賞し、金メダルを獲得することができました。この成果により、同僚のtattakaさんと共にGrandmasterの称号を獲得することができました。

Kaggle参加のアプローチ

以下は個人的に、Kaggleに参加する上で大事だと思っているポイントです。 人によって意見が違う部分もありそうですが、自分は上記のコンペ参加経験の中で、この形に落ち着きました。

なるべく序盤から参加する

  • 基本的には序盤から参加して上位を狙います。序盤では複雑な手法を使わなくても高い順位を獲得できることが多いので、これがモチベーションの維持につながると思っています。
  • コンペを最後まで完遂するには、結局モチベーションが続かないと難しい気がしており、「現状を維持すれば金メダル」という状況は大きなモチベーションになると思っています。(実際そう甘くはないのですが)
  • 実際、「2週間チャレンジで上位入賞したぜ!」みたいな猛者もいらっしゃて、一時期は憧れてマネしたこともありましたが、私の実力でやるには100年早いと感じ、このスタンスに落ち着きました。

仮説をベースに実験を進める

  • 基本的には仮説をベースに実験を進めていくのが大事だと思っています。これにより実験の質が上がるかと思います。
  • 特に「モデルの間違えたサンプルを自分の目で確認しエラー原因の仮説を立てる」というのは、ベタだけど有効な手法だと思っています。

時には思考停止の実験もやってみる

  • 上と矛盾するようですが、仮説ベースの方がもちろん実験の質は上がるものの、一方で全ての改善が仮説ベースで美しく思いつくかというと、少なくとも私の場合はそうでないことも多かったように感じました。
  • 時には特に仮説もなく思考停止で回した実験が、意外とうまくいくこともあり、うまくいったらそこから仮説を出して深堀するというのがハマることも何度かありました。

金メダルにこだわりすぎない

  • 自分は特に銀メダル2枚取ってから、称号観点では金メダル以外不要のため、どうしても金メダルにこだわってしまっていました。
  • しかし「金メダル以外無意味」みたいなスタンスだと、ほとんどのコンペで終盤まで走りきれず挫折してしまいました。また、最後まで取り組んでいないため、終了後の上位陣の解法の核心がわからず、結果実力もつかないという悪循環に陥ってしまいました。
  • 自分の結論としては、「金メダルは狙いつつも、銀メダル以下でもいいから最後までやりきった上で、上位の解法を吸収する」というスタンスが大事だと思うようになりました。

上位とのスコア差は意識する

  • 特に上位と大幅にスコア差がある場合は、大抵何か大きな気づきを見逃してることが多いと思っています。
  • そういう場合は細かなチューニングでは一生追いつけないと思っており、モデルのインプットやアーキテクチャのドラスティックな変更を試すのが大事かと思ってます。

Kaggleで得たもの

データサイエンス関連スキル全般

Kaggle参加当初、私は機械学習Pythonに関する知識がほとんどありませんでしたが、Kaggleの参加を通じて多くのスキルを身に付けることができました。本当に挙げればキリがないほどですが、特に学んだことは以下の通りです:

  • numpyやpandasなどのデータ処理ライブラリの使い方
  • Pytorchなどの深層学習フレームワークの操作
  • 勾配ブースティング等を用いたテーブルデータのモデル開発
  • 画像分類、物体検出、セグメンテーションなど、コンピュータビジョンタスクでのモデル開発
  • Bert等を用いた自然言語処理タスクでのモデル開発
  • 特徴エンジニアリングのための仮説立て能力
  • ニューラルネットワーク学習の勘所やアーキテクチャの改良能力
  • 適切なバリデーション設計能力
  • 環境構築スキル(Docker、クラウドインスタンス利用等)
  • 実験管理ツールの使い方

「Kaggleで順位を上げる」というシンプルな指針に従うだけで、これだけ多岐にわたるスキルを習得できるというのは、Kaggleのプラットフォームとしての価値の高さを改めて実感させられました。

理想的な職場への転職

新卒から2年目の時、今勤めている会社へデータサイエンティスト職として転職しました。その時点ではKaggle Expertで銀メダル4枚ほどの実績でした。前職でもデータサイエンスに関わる仕事はできており、特別大きな不満はありませんでしたが、現職場にはKaggleで顕著な成績を収めている人が多く、そうした方々と共に働きたいという思いが転職の大きな理由となりました。加えて、コンペティション参加に際してのクラウド費用支援など、サポート体制の手厚さも魅力的でした。結果として、技術力の高い同僚と日々切磋琢磨できる環境にあり、転職に大変満足しています。Kaggleに参加していなければ、このような理想的な職場に巡り会うことはなく、Kaggleが現在の職場を得るための大きなきっかけとなりました。

日本人のKaggleコミュニティでの出会い

転職前に関西に住んでいた時期、くるぴーさんが主催するKaggler会に参加していました。それまでKaggleを一人で取り組んでいたので、同じ興味を持つ人たちとKaggleについて語り合えるのは、なんとも嬉しい経験でした。振り返ると、その時の参加者は現在Grandmasterの称号を持つ方々も多く、非常に豪華なメンバーでした。

また最近は参加できていませんが、atma cupの初期の頃には何度か参加し、ここでもKagglerの方々と出会う機会を得ていました。nyker_gotoさんが主催するコンペは、どれも魅力的なタスクが多く、オフラインで集まって取り組むのはとても楽しく、多くを学ぶことができました。また、atmaさんのオフィスにお邪魔し、反省会にも参加させていただいたこともあり、非常に有意義な発表を聞くことができたのも覚えています。

関東に転職してからは、そういったコミュニティへの参加が減ってしまいましたが、今後は再びKaggle関連のイベントやatma cupに顔を出せたらいいなと思っています。

まとめ

素晴らしいチームメイトや良質なディスカッションとノートブック、日本人のKaggleコミュニティ等、様々な環境に恵まれ、Grandmasterになることができました。GMというと、雲の上のようなイメージの存在でしたが、自分がそこまで到達できている感覚はまったくないので、引き続き精進したいと思っています。

今後としては、まずコンペにはこれからも引き続き参加していきたいと思っています。特にこれまで取り組んだことのない問題設定のコンペに参加し、学びの比重を重めにして参加していきたいと思っています。とはいえ、これまでのコンペでも「完全勝利したぜ!」みたいなコンペはないので、引き続き、金メダルや賞金も狙っていきたいと思っています。

また、これまでは自分のスコアのことばかり考えており、Kaggleのディスカッションやノートブックは受け身で参加してしまっていましたが、今後はコミュニティへの還元の意味もこめて、なるべく積極的に知見を共有していきたいと思います。また、今回せっかくブログを立ち上げたので、技術ブログでの情報発信等もできたらいいなと考えています。

今後ともどうぞよろしくお願いします!