Kaggle初参加で(すごいチームにいれてもらって)銀メダル(Top 1.1%)を手に入れた感想【Predicting Molecular Properties】

# 記事の概要

2ヶ月ぶりにQiitaに投稿します、Shunと申します。
以前「データ分析未経験SEがデータサイエンティストを目指す」という記事を書いていたのですが、かなり間が空いてしまい、いったい何やっているんだと言われても仕方ない状態が続いたのですが、
2か月前よりあるKaggle Masterの方からご指導いただきつつ、**Kaggleの『Predicting Molecular Properties（分子コンペ）』に参加していました！**
(実は、その裏で**SIerを辞めて転職する決断**もしています。今度記事書きます。)

[Predicting Molecular Properties](https://www.kaggle.com/c/champs-scalar-coupling)

最終的には5人チームとなり、みなさん優秀な方ばかりで私個人の貢献度は皆無に近かったのですが、
結果としては、**29位/2757チーム(Top 1.1%)**で銀メダルをいただきましたので、簡単に感想を書きたいと思います。
なお、コンペの具体的な内容や使用した技術に関しての詳しい話は、今回は割愛させていただきます。
(でも、AI・Kaggle初心者で「Kaggle始めたけど何すればいいか分からない！」って人のための記事は今のうちに書いておきたい…)

# Kaggleを通して成長できたこと（多分に誇張が含まれます）

## Before

- SIerで2年間レガシーなシステムばかりやってきたSE
- 機械学習を学び始めて3ヶ月の初学者
- PythonとそのライブラリはCodecademyの講座で学習
- ディープラーニングG検定に合格済み
- DL4USの教材は一通りColabで動かしてみた
- とりあえずTitanicコンペは見よう見まねでやってみた
- ~~ポテンシャルだけはあると勝手に思っていた~~

## After

- TensorFlow, Chainer, Keras, PyTorchなんでも触れるようになった
- 独自のLayer(Chain)が組めるようになった(Chainerで組んだ自作Chainはうまく動きませんでしたが…)
- 独自の損失関数を組んで学習できるようになった
- PandasやNumpyの主要な操作が自在にできるようになった
- CVスコアとLBスコアの違いや、学習データのleakについて意識できるようになった
- Ensembling、特にStackingについて(なんとなく)理解できた
- GCPでインスタンス立てて学習が回せるようになった
- チーム内のKaggle強い人の議論の内容がなんとなく分かるようになった(参加できるわけではない)
- ~~ポテンシャルだけではどうしようもないという現実にあらためて危機感を覚えた~~

# 金メダルに届かなかった原因についての考察

少なくともMasterの方の協力があった以上、金メダルを目指したかったのですが、スコア的には全くと言っていいほど届きませんでしたので、原因を考えてみます。

## 計算資源・時間の不足

既に金メダル獲得者のsolutionが公開されつつありますが、
使用したモデル・特徴量やアイデア・工夫に関しては私たちのチームとあまり遜色なかった反面(追記:さすがに最上位の方のsolutionとなるとやってることが全然違って驚いてます)、
学習の量に関しては桁違いの差がありました。
分子コンペは名目上はtabularコンペでありながら、実際はGNN(Graph Neural Network)という計算コストの高いモデルでたくさん学習しなければ上位になれなかったため、
実態はimageコンペに近く、アイデアや工夫よりも計算資源が大きなウェイトを占めていたと考えられます。

また、例え計算資源が足りないにしても、もっと早くからGNNに着手できていれば、学習時間の余裕はもっとあったかもしれません。
この点は、コンペ中盤でGNNに切り替える決断がなかなかできなかった私に責任あると思っています。

## コンペ内容の専門性が高い

もう一つ違った観点として、分子コンペ自体が「とっつきづらい」コンペだった、という説を挙げたいと思います。
当たり前ですが、Kaggle初心者や「とりあえず公開カーネルをsubmitしてみた人」が増えれば増えるほど、
また、ライバルの人数が減れば減るほど、メダルは取りやすくなります。

分子コンペは見た目からして専門性が高く初心者が入りづらく、かと言ってチーム総数が極端に少ないわけでもありませんでした(チーム総数が少ないほど、金枠の割合自体は高い)。
また、量子物性化学を専門としているような研究者も多く参戦し、上位に入っていたようです。
ですので、他のコンペに参加していない以上推測しかできませんが、コンペの難易度自体高めだったのだろうと感じます。

# チームの重要性について

Kaggleが普通の競プロやマラソンマッチと異なる点はたくさんあると思うのですが(例えば他の人の公開カーネルが自由に使えるとか)、
今回実感したことの一つに**「チームの重要性」**があります。

当初は、チームを組むメリットを「意見交換できる、作業分担できる」くらいしか思っていなかったのですが、
データ分析には**「Ensembling」**という手法が存在し、学習モデルは多くの種類があればあるほど（例え単体でのスコアがあまり高くなくとも）最終スコアは上がり、
かといって人数が増えたからと言ってメダルが5分割されたりするわけでもないので(Solo Goldだけは別ですが)
基本的にはチームの人数が増え、材料となるモデルがたくさん用意できるほど有利になることが分かりました(ただし、人数が増えるデメリットとして、1日5回のsubmit回数が共有化されてしまうというのもある)。

一方で、他のチームとマージ申請をしようと思うと、**「自身とチームを組むことの価値」**を証明しなければならないので、
必然的に自分一人でもある程度のスコアが狙える必要があります。
(今回の私のように、知り合いの方にご助力いただけるような場合は例外なのですが。)
初心者目線として、「チーム組めば初心者であまりコミットメントしなくともメダルが取れちゃう」~~「Stackingよくわかんないけど他の人に任せておけばいいや」~~とかそういう話では決してなく、
**自分の実力が一人前になることの必要性自体は競プロやマラソンマッチ等とそう変わらないと**いうことを肝に銘じておきたいと思います。
(ふと思ったのですが、この制度を悪用すれば、対戦ゲームにおける「代行」に近い形で初心者をMasterに引き上げる裏商売があってもおかしくなさそうです。そういうのって禁止されてるんでしょうか)

もちろん、コンペのスコア関係なく、優秀な方と関われるのは知識の幅を広げたり、モチベーションになりますし、**「私はなんて無知なんだ、もっと勉強しなければ」という焦りや危機感に突き動かされること間違いなし**なので、
機会さえあれば例え初心者同士だろうとチームは積極的に組むべきだと実感しました。

# 今後について

Kaggleは今後もやっていこうと思っています。
次のコンペとしては、現在唯一のtabularコンペ**「IEEE-CIS Fraud Detection」**をやってみようかなと考えています(クレカの不正利用を検知精度を上げるのが目的で、Titanicコンペなんかと性質は近そうなので、初心者にもとっつきやすそう？なにせ今回はちょっとヘンテコなコンペに手を出してしまったので正統派のものをやってみたい)。

以前ロードマップとして挙げていた専門書の読破やWebアプリを作ってみる件は滞っているので、改めてスケジュールを考えます(アプリのネタはあるにはあるのですが)。

記事のネタはたくさんできたので、これからまとめていきたいです。

改めて、Kaggleに参加することはとても大きな成長になったと感じます。

最後に、チームを組んでいただいた皆様、色々とご迷惑をおかけいたしたしましたが、いろいろと勉強させていただきました。本当にありがとうございました！