【Kaggle Master振り返り記事】金メダル獲得大作戦！


# はじめに

先日Kaggleで行われた『LLM 20 Questions』にソロで参加し、832チーム中9位（上位1.1%）の成績となり、金メダルを獲得しました。また、このたびの成績によって、Kaggle Competitions Masterに昇格しました！

https://x.com/AInebosuke/status/1829637659385627011

この記事では、『Kaggle Masterになるまでの振り返り』を書きます。特に、金メダル獲得のために取り組んだこと、作戦を詳しく書きたいと思います。

# Kaggle Masterになるまでの振り返り

時系列に沿って、当時考えていたことなども踏まえて振り返りを行います。


## Kaggle登録からエキスパート昇格まで（2020年10月頃～）

以前からPythonや機械学習に触れていましたが、Kaggleのアカウントを作成したのはこの時期です。[『Kaggleで勝つデータ分析の技術』](https://www.amazon.co.jp/Kaggle%E3%81%A7%E5%8B%9D%E3%81%A4%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E3%81%AE%E6%8A%80%E8%A1%93-%E9%96%80%E8%84%87-%E5%A4%A7%E8%BC%94/dp/4297108437)を参考に、チュートリアルのタイタニックコンペで遊びました。モデルをCatBoostに差し替えると、上位7%くらいのスコアが出て嬉しかったです。後はOptunaによるパラメーターの最適化なども行いました。

また、Kaggler-ja-Slackに参加しました！
下記の記事がKaggler-ja-Slackに参加するメリットについて詳しいです。

https://qiita.com/wakame1367/items/b2d1287ac773ee6bafd0


当時の自分は、Kaggle≒オンラインコースのように考えていました。もちろんスコアが上がれば嬉しいですが、あまり競い合うようなイメージを持っていなかったです。
ちなみに、Kaggleサイト内にはオンラインコースの[『Kaggle Learn』](https://www.kaggle.com/learn)というものがあります。

私は機械学習をガッツリ使うお仕事をしているので、機械学習のパイプラインを洗練させる目的でKaggleのコンペに継続的に参加していました。アルゴリズムを改善させるというよりは、公開ノートブックをベースに、「ロジックをスクリプトに疎結合に分離する」「テストコードを作成し自動化する」「型アノテーションの追加」などのリファクタリングを行い、コード資産を増やしていきました。色々なデータに触れることができるのも良かったです。気まぐれに、アルゴリズムに工夫を加えるなどして、たまにメダルを獲得し、Kaggleエキスパートになりました！（🥈2🥉1）

## CAFA 5 Public最終9位、そしてシェイクダウン（2023年5月頃～）

2023年5月頃に、いつも通り勉強目的でKaggleコンペ（[CAFA 5 Protein Function Prediction](https://www.kaggle.com/competitions/cafa-5-protein-function-prediction/overview)）に参加していました。タンパク質データセットを用いるタスクで、実装難易度が高いコンペでした。タスクを理解し、ソースコードやデータセットなどを整理整頓し、いくつかの改善を加えたところ、なんと金メダル圏内に到達しました。金メダル圏内に入ることができた理由としては、実装難易度が高いので、そもそも提出までこぎつける参加者が少なかったからだと思います。今まで牧歌的なKaggleライフを送っていた私ですが、金メダルを獲得したくなりました。そこで、学生時代の研究室のメンバー2人をお誘いし、最終提出期限の8月末頃までチームでフルコミットしました。[「The Kaggle Book：データ分析競技 実践ガイド＆精鋭31人インタビュー」](https://www.amazon.co.jp/Kaggle-Book%EF%BC%9A%E3%83%87%E3%83%BC%E3%82%BF%E5%88%86%E6%9E%90%E7%AB%B6%E6%8A%80-%E5%AE%9F%E8%B7%B5%E3%82%AC%E3%82%A4%E3%83%89%EF%BC%86%E7%B2%BE%E9%8B%AD31%E4%BA%BA%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%93%E3%83%A5%E3%83%BC-impress-gear/dp/4295015954/ref=pd_lpo_sccl_2/356-6513257-4582710?pd_rd_w=RQWZ2&content-id=amzn1.sym.514dbf04-9cdc-41ed-ac83-4d0f7ed7f867&pf_rd_p=514dbf04-9cdc-41ed-ac83-4d0f7ed7f867&pf_rd_r=RDD6YQFWXHT3YC2V7936&pd_rd_wg=vt4FX&pd_rd_r=316a508b-397c-40b6-8749-83b1e7be7477&pd_rd_i=4295015954&psc=1)などを参考に、Kaggleで勝つために必要な知識を急速に身に着けました。
最終的には、Public9位で終えました。しかしながら、このコンペは最終提出後に、4ヶ月ほどのアノテーション期間に入り、年末頃に最終順位が発表されるタイムスケジュールとなっていました。

2023年10月頃に、会社の新入社員の方々から『機械学習コンペについて教えてください』という旨のチャットを頂きました。そこで、せっかくなら記事にして参考資料として共有しようと思い、[『Kaggleのハードルを下げたい！』](https://qiita.com/Isaka-code/items/3935cdb2a0bda331e07c)という記事を書きました。需要があったようで、トレンド1位を達成しました。2024年9月現在、35,000ビュー以上となっています。

2023年12月頃に、CAFA 5の最終順位が発表されました。私達のチームに告げられたのは、盛大なシェイクダウンでした。無念。
ただし、期間が空いていたので、そこまでメンタル的なダメージは無かったです。それに、その頃にはチームメイトの2人と一緒に、アドカレに参加することに熱中していました。私は、[生成AIに関する一人アドカレ](https://qiita.com/advent-calendar/2023/nebosuke-ai)にチャレンジし、無事完走しました！

https://x.com/AInebosuke/status/1755472784820678903


## 金メダル獲得大作戦！（2024年1月頃～）

さて、一人アドカレも完走し、少し時間に余裕ができた頃に、『金メダル獲得大作戦』を考えました。要素ごとにご説明します。

### 金メダル獲得の難易度

Kaggleの金メダルを獲得するためには、(Top 10 + 0.2%)の順位に入る必要があります。(上位 10 + 0.2%) は、競技会に 500 チーム追加されるごとに追加の金メダルが授与されることを意味します。たとえば、500 チームが参加する競技会では上位 11 チームに金メダルが授与され、5000 チームが参加する競技会では上位 20 チームに金メダルが授与されます。標準的なコンペではだいたい1200チームくらいが参加しますが、その場合は金メダル枠は12となり、ちょうど上位1%以内となります。ここで重要なのは**相対的な順位**だということです。たとえどんなにスコアが高くても、相対的な順位で負けてしまった場合は金メダルを獲得することができません。

金メダル圏内の難易度についてですが、tkmさんの[YouTube動画](https://www.youtube.com/watch?v=Ug5uce0kbtQ&list=PLkBjLQIGEjJl9icR4WdHkn29OJrrHE3sn)で紹介されていました。
tkmさんによると、銀メダルは、公開ノートブック＋αくらいの難易度とのことです。一方で、金メダルを獲得するためには、上位常連のKagglerを倒す必要があります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/c49788d8-863e-d7f7-73c5-aa0a031b911b.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2627015/6791a9ba-6daf-24fb-2934-b0a5a60acfda.png)

tkmさんの[『ずんだもんとめたんで学ぶKaggle 入門 & 参戦記』](https://www.youtube.com/watch?v=Ug5uce0kbtQ&list=PLkBjLQIGEjJl9icR4WdHkn29OJrrHE3sn)は、つよつよのKagglerがどのようにKaggleに取り組むかを知ることができるので非常にオススメです。私はこのプレイリストを数十回視聴しました。


### 金メダル圏内に入るために必要なこと

金メダル圏内に入るためには、大きく2つの工夫が必要と考えます。

1つ目は、『負けない工夫』です。公開ノートブック、ディスカッションなどに公開されている情報は、上位陣は全てやりきってくるという前提で取り組む必要があります。また、機械学習コンペに取り組む際の、一般的なフローをマスターしている必要があります（これについては[『Kaggleのハードルを下げたい！』](https://qiita.com/Isaka-code/items/3935cdb2a0bda331e07c)を読んでください！）。もちろん、Pythonや各種機械学習ライブラリなどの使い方にも習熟している必要があります。まずは減点となってしまう要素を減らしていくことで、自然に上位争いに入ることができるようになると思います。また、大切なこととして、『必ず1つの仮説のみを検証』を意識する必要があります。詳しくは下記のyu4uさんのスライドをご確認ください。

https://speakerdeck.com/yu4u/jing-ji-tositenokaggle-yi-nili-tukaggle?slide=16


2つ目は、『勝つための工夫』です。銀メダル圏内の順位から金メダル圏内の順位に入るためには、複数の武器が必要だと考えます。『他の参加者に対して相対的に得意な武器は何か？』という問いに向き合う必要があります。それは、「特徴量エンジニアリング力」、「ドメイン知識」、「コンピューティングリソース」、「特定のデータセットに対する見識」、「ニューラルネットのお気持ち理解度」、「タスク設計力」など多岐に渡ります。私の場合は何を武器に選んだか、次の節で紹介します。

### 『勝つための工夫』に選んだ武器

私が『勝つための工夫』に選んだ武器は下記の3つです。

1つ目は、『機械学習のパイプラインを洗練してきた経験』です。エキスパートになるまでに、継続的に機械学習のパイプラインを洗練させ、効果的な開発を行なう工夫を続けてきました。実際に、CAFA 5でPublic9位に到達できたのは、そのシステムのおかげとチームメイトに言っていただきました。目指している勝ち方は、カレーちゃんさんのチャンネルでnyanpさんが発表された[『Time-series code competitionで生き残るには』](https://www.youtube.com/watch?v=IIyfy-1xqTQ)という動画で紹介されているアプローチです。
2つ目は、『機械学習にとどまらない幅広い知識』です。好奇心旺盛な性格なので、幅広い手法を勉強・習得してきました。タスクに対して、豊富な手札から適切な手法を選択することができます。
3つ目は、『LLMに関する知識』です。早くからChatGPTをはじめとした生成AIやLLMに触れてきました。おかげさまで、[NishikaのChatGPTコンペで2位](https://competition.nishika.com/competitions/chatgptlimit/topics/561)になったこともあります。特に生成AIに関する一人アドカレ完走の際に、LLMに関する知識を蓄えることができました。

上記3つの武器を強くすることを目指し、LLMコンペに参加することを決めました。修行として、最初の金メダルはソロで獲得するつもりでした。目標を達成できて嬉しいです！

### LLMコンペへの参加

2024年3月頃から、[『LLM Prompt Recovery』](https://www.kaggle.com/competitions/llm-prompt-recovery)に参加しました。このコンペの目的は、特定のテキストを変換するために使用されたプロンプトを復元することでした。LLMとしては、Mistral 7bが主流でした。また、[`mean prompt`と`lucrarea`が上位ソリューション](https://www.kaggle.com/competitions/llm-prompt-recovery/discussion/494343)となりました。`mean prompt`は、Public LBに対するオーバーフィットだと予想していましたが、実際はPrivate LBでも高いスコアを維持しました。色々とディスカッションで質問したところ、Psiさん（最高世界ランク1位の方です！）をはじめとした方々が丁寧に答えてくれました。`mean prompt`を過小評価してしまったことを反省し、上位ソリューションを勉強させて頂きました。自分の取り組みも（順位は芳しくないですが）ソリューションとして共有したり、勉強記録をディスカッションに投稿したりしました。初めてのLLMコンペは非常に実りあるものでした。


2024年4月17日にLLM Prompt Recoveryが終了し、次は[『AI Mathematical Olympiad - Progress Prize 1』](https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize)に参加しました。このコンペの目的は、数学の問題を解くことができるアルゴリズムとモデルを作成することでした。数学とAIが好きな私にとっては非常に魅力的なコンペでした。LLMとしては、DeepSeekMath-7B-RLが主流でした。多くの参加者が、最初にLB20点を達成した公開ノートブックに独自の工夫を加えたソリューションを構築していました。1位のチームだけは別格で、[独自のデータセットを構築し、8 x H100 GPUsを用いて**LoRAを使用せず**モデルのフルファインチューニングを行った](https://www.kaggle.com/competitions/ai-mathematical-olympiad-prize/discussion/519303)そうです。2回目のLLMコンペ参加ということもあり、徐々に知識がチャンク化し、負担が軽減されていることを感じました。


2024年6月28日にAI Mathematical Olympiad - Progress Prize 1が終了し、次は[『LLM 20 Questions』](https://www.kaggle.com/competitions/llm-20-questions)に参加を決めました。3回目のLLMコンペ参加ということもあり、最初からフルスロットルで取り組むことができました。余裕が出てきたので、[Llama-3.1の使い方](https://www.kaggle.com/code/isakatsuyoshi/llama-3-1-8b-quick-start)をフォーラムで共有したりしました。タスク理解に頭のリソースを割くことができ、機械学習パイプラインを丁寧に開発したおかげで、開発者体験が良かったです。結果として、Public LBで金メダル圏内に安定して到達することができ、モチベーションもキープできました。
**無事金メダルを獲得し、Kaggle Masterになることができました！**（2024年8月31日）
コンペの解説やソリューションについては下記の記事にまとめました。

https://qiita.com/Isaka-code/items/9b19b588f36c54845aa0

# おわりに

### Kaggleは役に立つ

振り返ると、Kaggleによって多くの技術を習得してきたことに気が付きました。特に密度が高かったのは、直近のLLMコンペへの参加3連続です。コンペの結果発表終了後に復習をしっかりしたことが成長に繋がったと思います。
Kaggleの結果は、模試の結果が返ってくる時に近いと思いました。自分のソリューションと上位者のソリューションを見比べることで、何が足りないかを学ぶことができます。復習は大事です。
模試と異なる点としては、別解が多いということです。最適解が一意に定まることは稀です。共通する事項こそあれど、それぞれのソリューションにはオリジナリティがあります。
また、ソリューションを共有することで、自分の取り組みを俯瞰することができます。私は、たとえ結果が芳しくなくても、毎回ソリューションを共有していました。また、疑問点はディスカッションで質問すると、皆さま答えてくれます。Kaggleコミュニティは優しいです。

本記事は以上です。皆様の良いKaggleライフを応援しております。