カグルとワタシ ~ kaggle GM振り返りポエム ~

KagglerはGrandMasterになるとポエムを詠むというので、類にもれず私も綴ろうと思いました。**過去に参加したコンペに関する思い出**的なものや、**コンペやってから変化があったこと**などをぼちぼち書いています。

技術的にはちょっとしたtipsぐらいしかないので、そういうのはあまり期待しないでください:pray:

# 自己紹介
- **アカウント名: K_mat**
- **Competition Grandmaster** (動画像系や時系列センサデータ系が主)
- 元々、本業はメカニカルエンジニアで博士 :airplane:
- Kaggleおよび機械学習は2019年から4-5年

<img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/b316e2c2-582a-5cd0-3e40-9b20192be452.png"> <img width="200" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/52dd5bea-0835-0725-f0df-5112372fa57c.png">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/79682e3f-667a-9f33-9a3f-d076b6dac6fb.png)

# コンペ振り返り
## 2019年ごろ 【何やっても楽しい期】
エクセルマクロで少し遊ぶぐらいしかプログラム能の無かった私にとって、機械学習やデータ分析はめちゃくちゃ新鮮で楽しくて、たくさんのコンペや勉強をしました。

### はじめは1Dデータ
[過去の記事](https://qiita.com/Kmat67916008/items/3fbead37b95e4c9506c2)でもダラダラ綴っていますが、最初は**製造業バックボーン的になじみのある1Dデータ**から入りました。わからないけど取り合えず現行コンペで**LANL Earthquake**なんかをやりました。

https://www.kaggle.com/c/LANL-Earthquake-Prediction

当時はCSV提出コンペが多く、私の初回サブも他の方の作ったCSVに後処理を加えただけのようなものでしたが、リーダボードに自分の名前が出てくるだけでもドキドキしていたことを覚えています。
今思えば大した工夫でもないのですが、もしかして良い順位が出るんじゃないかとサブの都度ひそかに期待していました。笑

最終結果でJunKodaさんやかれーちゃんさんなど日本の方々が上位にいて、とても羨ましかったことを覚えています。一部の人からは嫌がられるかもしれませんが、私は当初からメダルよりも入賞に興味がありました。:moneybag:

### 画像に興味をもちはじめて
もともと深層学習に興味があり、その魔法のようなパフォーマンスに魅せられて画像コンペに手を出しはじめました。わからないけどとりあえず**SignateのJTたばこコンペ**に手を出しました。

https://signate.jp/competitions/159
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/aaed6cc0-9806-ab71-9e4a-33e6b79a8776.png)

物体検出タスクだったので、わからないなりにも当時強いとされたYOLOv3を触り始めました。前処理や後処理をさわりつつ、はじめて学習をさせてみたりしました。今思うとギャグのようですが、自宅のノートPC(CPU)で学習をまわして、ジワジワ上がっていくメトリクスにすごくワクワクしました。

難解なソースコードを何度も読み、いじり倒しましたが、そう簡単に精度があがるわけもありません。物体検出の処理や学習はセマンティックセグメンテーションなどと比べると実際かなり複雑で、今思うと結構無茶だったなと思いますが、必死に頑張った甲斐があり、行列操作や画像処理に対するハードルがグッと下がりました。

本コンペも大した結果を出せずに終了しました。当時少ないサブでサクッと現れたyu4uさんや力強く優勝していったtascjさんには、今でも(戦う前から)勝ちにくいイメージを持っていたりします。

### 画像にハマって
**ImageNetやCOCOなどのSOTA合戦は激しさを増し、コンペにおいてもいち早く新しいモデルアーキテクチャを導入するようなスピード感を感じる時期**でした。やれこのネットワークがいいぞ、やれこのaugmentationが効くぞ、gem poolingが効いたぞといった具合です。私も無駄にEfficientNetをスクラッチ実装したりしました。

(強いモデルを早く導入してアンサンブルというのも芸が無いように聞こえますが、この頃のチューニング＆実験祭りのおかげで、NNの調整勘が養われたのでやって良かったと思っています)

画像ってこんなものなのかなぁと思っていたところで、Kaggle崩し字コンペに参加しました。
https://www.kaggle.com/c/kuzushiji-recognition
<img width="400" src="http://static.mxbi.net/umgy001-010-smallannomasked.jpg">

崩し字を検出・翻刻するというコンペでした。
模様と文字の識別や、部首などのせいで複合的に見える文字の誤検出の扱い、**著者が異なることによるドメインシフト**への対応や、崩し字の**文字の連なりの文脈**をモデルに解釈させる方法など、工夫しろが豊富で改めて**画像コンペの奥深さを味わいました**。

ちなみに、このコンペでもtascjさんが優勝をかっさらい、私の苦手(勝てない)イメージを加速します。

## 2020-21年ごろ 【画像ハマり期】
このころになると論文を読めるようになってきたこともあり、コンペと関係のない実装も楽しめるようになりました。

- Instance Segmentationの実装
  https://qiita.com/Kmat67916008/items/474da9f1f5553579cf76
- 単眼depth推定の実装
  https://qiita.com/Kmat67916008/items/267a3d3a6ac7c3512382
- 動画や3Dが楽しくて、optical flow系やNeRFなども実装に手をだしました
- 公開していませんが、sim2realなんかもやりました

↓こんなやつ。
<img width="600" src="https://camo.qiitausercontent.com/952509033061468515ce1264a88a0a004200598d/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3535373638362f37663736666239382d653466352d353236622d323661342d3931383430303263653537372e706e67">

実装がめちゃくちゃ難しく、おかげでモデル実装面では不安がなくなってきました。思考パターンも増えたように思います。ただ、コンペではpytorchが主流で、tensorflowを選択したことにほんのりとした後悔が付きまとっていました。笑

強い勝ち方に憧れたのもこの頃でした。-> [kaggleのコンペでカッコよく勝ちたい話](https://qiita.com/Kmat67916008/items/581df2e2d343eeed5161)

## 2022年ごろ～ 【🥇挑戦期】
３年経つのにコンペのメダルがまだなく、そろそろコンペでいい感じに入賞したくて、ワンサブでジャブしてはちょくちょく感触を確かめていました。そこで開催されたのが[NFLコンペ](https://www.kaggle.com/competitions/nfl-health-and-safety-helmet-assignment)でした。
### ① 初優勝 @ NFL Helmet Assignment :football:

**プレイヤとマップ上の配置を紐づける**のがコンペの肝でした。->[コンペ概要はこちら](https://qiita.com/Kmat67916008/items/8ccf0171219036621540)

ビュー変換と位置関係のマッチをNNですべてやろうと思うとまぁまぁ面倒なので、実装的にもあまりやりたがる人はいないだろうと思い、初手から特殊なモデルを組んでいました。
幸いこれが当たってしまい、序盤からpublic1位をキープすることになります。

順位が低いときに見ていた「スコアアップで上位に食い込む夢」とは打って変わって、public1位では「なんかえらいことが起きてめっちゃ抜かされる夢」も見るようになりました。上位は洗練されたkaggler勢で、序盤から終盤まで気が抜けず、日々のほとんどのメンタルをkaggleで消耗していました。合計300hrぐらいはコンペをしていたと思います。

Public1位で迎えた最終日は今でもドキドキしますが、恐らくNFLコンペのときが一番緊張していました。何をしても手につかず、既に処理したメール画面を開いたり閉じたりと挙動不審でした。笑
無事に優勝できたものの、再現性や提出物、winner callなど不安要素がモリモリで、なかなか安心できませんでした。

<img width="600" src="https://camo.qiitausercontent.com/e5bcca41c3286a192ee11f46609bb32f76bc27cd/68747470733a2f2f71696974612d696d6167652d73746f72652e73332e61702d6e6f727468656173742d312e616d617a6f6e6177732e636f6d2f302f3535373638362f31323765396539372d656531382d623336302d653465652d6334643535636536313361642e706e67">

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/9860069a-a3c4-604e-97a1-b4db229c8fa8.png)


### ② チームマージを楽しむ @ FourSquare
NFLで少し自信がつき、チームマージしても迷惑かけないかなと思えるようになりました。ちょうどその頃開催されていた[Foursquareコンペ](https://www.kaggle.com/competitions/foursquare-location-matching/overview)で、**nyanpさんとterekaさんにチームマージ**していただきました。

4sqコンペは、**緯度経度や名称などテーブルデータとして与えられた地図上のランドマークやお店の情報から重複を見つけ出すようなコンペ**でした。『東京タワー』と『tower of tokyo』は同じものとしてまとめますが、『セブンイレブン東京タワー前店』は別物として判定するような感じです。
nyanpさんはテーブル、terekaさんが自然言語でゴリゴリとパフォーマンスをだされていました。

kaggleではじめてのチームマージでしたが、今思えばとても贅沢なチームマージでした。二人とも実装の速さは言わずもがな、**抽象的な能力(着眼点やメタな読みや執着心)** もすばらしく、Leapのアプリを入れて実際にサービスを体験しだしたりと、机上にこだわりすぎていた自分に足りないものを実感させられました。

なんとか貢献しようと躍起になっていましたが、まぁなんだかんだあってホストの仕掛けた罠にかかり、銀メダル🥈となりました

test phaseではtraining dataが別のtraining dataにすり替わる仕様のコンペ(?)で、色々と残念なところはありましたが、この歪なデータを解明しきる能力を持った人も多く、舌を巻きました。
ついでに、これ以降スパイダーマンのmemeが大好きになりました:spider:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/56bc948f-14ec-29d2-217e-155c4741c240.png)

### ③ 2回目のソロプライズ @ DFL :soccer:
(動画系に味をしめて)NFLにつづいて[DFL(ブンデスリーガ)コンペ](https://www.kaggle.com/competitions/dfl-bundesliga-data-shootout)に参加しました。もとい、NFLが再現性のない偶然の結果とも思えたので、もう一度しっかり頑張ろうと思いました。

アメフトもそうですが、**見ていてわかる・見ていて楽しいコンペはいい**ですね。「ボールを追おうかな」とか、「ラインを検出して後処理に加えようかな」といった、工夫のアイデアもたくさんでてきます。学習はAIだけに頼らず、私自身もキャプ翼やアオアシ、BeBluesなどでドメイン知識も積極的に学習して万全の構えです。

日本の方も多く参加されていたので、ソロでしたが寂しさは感じませんでした。上位のCamaro-sanやohkawa3-sanやkzykmyzw-sanは同系統のコンペでも一緒になることが多いので、いい意味で必死になれました。

最終解法は2パターンに分かれたのが興味深かったです。
**[1] 検出ベースで恣意的に見せる場所を制限するアプローチ**
**[2] フィールド全体の画像をそのまま加えてイベント判定するアプローチ**

私は上述[1]を選択しました。フィールド上のイベントという疎な情報を学習させるのが難しく感じて、下図のようにボール周辺を検出してからイベントを判定するようなモデルを組みました。ですが、1,3,4位などはシンプルに[2]で結果をだしていました。

個人的に、人の事前知識に基づくアプローチが取れて、それ次第で差が出そうなコンペはパズルみたいで好きなので良く参加しています。本コンペも人の**事前知識が有効なコンペでしたが、そういったアプローチは学習させやすい一方で情報量をむやみにそぎ落としかねない**ことを改めて認識させられました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/dded1240-c087-d98f-7afe-9bb549922818.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/28fb1584-9074-f8ba-2c2c-9984011bce79.png)

結果は2位で、Camaro-sanがX(旧twitter)で煽ったh2oチームにボコられるという結果におわりましたが、前回の優勝のまぐれ感を払拭できたことが嬉しかったです。

### ④ 2度目のチームマージ @ NFL2023 :football:
なんやかんやあって仲良くさせていただいていたnyanp-sanとcamaro-sanとhata-sanで[2023年もNFL](https://www.kaggle.com/competitions/nfl-player-contact-detection)に挑戦しました。今回のNFLは**衝突したプレイヤ間や地面に転倒したプレイヤを判定するもので、動画とテーブルの両方を駆使するコンペ**になりそうでした。偶然飲み会があったので、どちらにも強いメンツであった方々を誘った形です。

しかも、前年度のコンペの出力がデータとして配布されるという珍しいパターンで、「こりゃあ美味しいぞぐへへ」という気持ちで参加しました。(結局過去のソースコードは役に立ちませんでしたが)

今回も全員がプロフェッショナルを発揮しており、あっという間に分析や検証が終了します。改めて上位勢の思考と手のはやさを体感することができました。この調子で僕の会社業務もかわりにやってほしい。

本コンペも解法に多様性があり、幣チームのように画像とテーブルでくみ上げるチームもあれば、画像のみでごり押す解法もありました。最近たまに見られる、**画像をスタックして食わせる系の一見強引なプレー**も上位解法で見られて興味深かったです。結局のところスコアリングはアノテーションデータで行われるので、『**人はどうやってアノテーションしているんだろう**』といつも考えさせられます。

誘っといてダメだったらどうしようと結構焦りましたが(笑)、チームが強かったので無事4位でprizeとなりました。h2o teamに二連続で負けたのが地味に悔しかったです。1勝2敗。

[一位解法](https://www.kaggle.com/competitions/nfl-player-contact-detection/discussion/391635)
![image.gif](https://i.ibb.co/sKJ5zHP/output.gif)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/c00ef1bb-58cb-dd71-5442-117c548dd567.png)

### ⑤ 時系列データでソロプライズ @ 睡眠コンペ :bed:
画像しかできないやつだと思われるとちょっと悔しいので、1Dデータを扱う[Child Mind Institute 睡眠コンペ](https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states)に参加しました。

道中1位が続いたので『K_mat何やってんだ…』みたいなmemeもいただき、「そうか、そう思われる側なのか (メタな分析をされる側なのか)」とちょっと嬉しかったです。いつも適当にやっています。

コンペ自体は1Dのデータにおけるイベント判定で、NN系が強かったです。一方で、**起床・睡眠イベントは一日に最大一回しかないイベントなので、評価指標に対してその予測値を如何に最適化するか**などもポイントで、NNに工夫する人や、後処理をくみ上げる人、2nd stageを組む人など様々でした。個人的に[自分の2nd stage](https://www.kaggle.com/competitions/child-mind-institute-detect-sleep-states/discussion/459627)の問題設定は今でも好きで、うまいことやったなと自画自賛しています。

最終結果はshimacos-san, sakami-san, kami-san teamに敗北し、private2位転落のよくあるパターンでした。悔しかったですが1Dデータのprizeは初めてだったので上出来でした。やっとこさGMリーチです。
なお、h2oチームは参加していなかったですが、脳内では勝っていたので2勝2敗のイーブンにもちこみます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/7f1b5f1f-a150-b251-863a-9f8a00bd3a16.png)

### ⑥ お天気予測でGMチャレンジ @ LEAPコンペ :sunny: 
ちょうどそのころ、関西kaggler会でkurupical-sanやchumajinさんなど、GMになられたかたを何人か拝見し、さすがに羨ましく少し欲が出てきました。そんなときに開催されたのが[LEAPコンペ](https://www.kaggle.com/competitions/leap-atmospheric-physics-ai-climsim)でした。

天候という身近なお題で1Dデータだったので「うまいことドメイン活かしてモデル組めばいい感じに作れるかな」と甘い気持ちで参戦しました。ですが、思いのほかそういうものが組めるタイプの問題設定ではなく、ドメインもそれほど効かず、「これはそういうの(得意なやつ)とちゃうぞ…」と気づき始めました。**久々のモデルコネコネ**をしながらチームマージをしたい雰囲気を醸し出していたところに、同じくGMチャレンジのpao-sanが乗ってくれました。その後、さらにcamaro-sanにもマージしてもらいました。

**何をやっても伸び悩むスコア、活かせないリーク、下がるweight、デカいデータ、バレるリーク、のびる延長、長い学習、暑い夏、熱い部屋、またバレるリーク**。チームじゃなければきついコンペでした。笑
当チームの解法は[pao-sanが共有](https://speakerdeck.com/abeja/kaggle-leap-competition-solutionjie-shuo-and-zhen-rifan-ri?slide=12)してくれていますが、「なんか色々やった気がするのにあっさりしてしまう」とのもっぱらの噂で、下図のソリューションも比較的シンプルです。データさえあればNNゴリ押しは強いなぁと実感しました。

最終結果は無事3位入賞でしたが、そのころのにはweightもほぼなく、2nd stageもそれほど効かず、かなりおんぶに抱っこでいただいたありがたい結果です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/6e79823c-acf8-49ed-6781-25f81708e84f.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557686/0c1349d7-0861-0214-e2e6-b0c6b3137151.png)

### 以上でGM
**合計solo3+team2のprize5本でGMとなれました！**:medal:
メダル取るぞ！と思ってからは順調に結果を出せたのですがなんだかんだで2年以上かかってしまいました。
一見楽にとったように見えますが、そう簡単な話ではなく、比較的取れそうなものに全力で参加して、終わるたびに疲弊していました。

## Kaggleやってよかったこと・変わったこと
なんだかんだでKaggle歴(=ML歴)が5年になってしまいました！まだ元の機械系の経験の方が長いのですが、それでもちょっと驚きです。基本的に時間泥棒以外は良い点も多く、たくさんのいい機会に恵まれました。
- 交友関係
  - 一緒に仕事をしてくれる後輩が増えた。普通にお仕事も楽しいことが多い。
  - 知り合いの上司も増えた。社内知名度∝社内昇進
  - 友達や社外交流が増えた。イベント系で「あのヘンテコモデル組む人だ」と声をかけていただけて嬉しい
- 知識関係
  - 業務で活かせるシーンができた。ML、コーディング、企画。
    (良い結果だけでなく、結果につながらなかった数多の試行錯誤が活きているなというシーンが多いです)
  - AIトレンドについていくことができた
- 実利・懐事情
  - ちょっと昇進した
  - ちょっと賞金もらった
- メンタル関係
  - 多少没頭しても心が痛みにくい趣味をもてた
  - コンペの賞金(=自分の中で雑に使っていい所得)で心持ち豊かになった
  - 結果そのものやメディアなどで、自分の子に対してわかりやすく自慢できるものができた。パパすごいと思ってくれているのが嬉しい。

ここのところは勝ちにこだわっていましたが、これからは**勉強・教育などのウェイトを増やしつつ頑張っていこう**と思います。とかいって、いつも勝つために必死こいてしまうのですが。