【Kaggle】コンペの選び方

今年、念願のKaggle competition masterになれました！

そこで、masterになるまでの知見、**自分流コンペの選び方**をご紹介します。

# 先に結論
私は、以下の項目を調べ、上位に食い込めそう！と感じたら、そのコンペは参加するようにしています。
+ ホストを調べる
+ CVとLBの連動をチェックする
+ 類似コンペを調査する
+ アイデアを練る

# コンペ選びが6割
私は初subを決めるまで、かなり時間を要します。これは、コンペをかなり吟味しているためです。自分にとって、コンペ選びは**成績の6割**を占めると感じていて、かなり重要な要素となっています。（当然、subしながら、コンペを吟味する人もいると思います。）

Kaggleでは、データの分析力も大事ですが、それと同じくらいコンペの良し悪しを見極める目も大事です。例えば、いくら分析力があっても、コンペ設計が崩壊していると、スコアを伸ばせず、「どうしてこんなコンペ選んだだろう・・・」と後悔することがあります。

そこで、本稿では良い成績を残せそうな（自分流）コンペの選び方を書きたいと思います。

# 基礎編
## ホストを調べる

Kaggleでは、ホスト（Kaggle スタッフ含む）に当たり外れがあり、「この人には気を付けろ！」的なホストがいます。

なぜ、ホストに気を付ける必要があるのか？それは、「publicとprivateが乖離している」とか、「そもそも無理ゲー」とか、コンペ設計の段階で破綻しているものがあり、ホストによっては毎回トラブルが発生することがあるからです。

そのため、**ホストの開催履歴は調査した方が良いです。**

コンペ設計については、arutemaさんの[クソコンペオブザイヤー2021](https://aru47.hatenablog.com/entry/2021/12/12/205905)を参照されると良い知見が得られます。

## CV vs LB
ディスカッションでは、よく「CV vs LB」が話題になっています。これは、色んな理由がありますが、話題になる理由の一つは、**CVとpublicLBが連動していると、良コンペである可能性が高いからです。**

うまく連動している場合、手元のデータで精度を上げることで、最終的にprivate上位にいける可能性が高くなります。

ところが、CVとpublicLBが連動していないと、手元のデータをいくら分析しても、最終順位に全く影響しない可能性が出てきます。この場合、手元のデータは全く役に立たず、**最後は運ゲーになる可能性すらあります。**

一例として、BirdCLEF2021とBirdCLEF2022が挙げられます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/95a55ca9-8641-7afc-d70c-5da2983bb554.png)

二つのコンペの題材はほぼ同じで、鳥の声を聞いて、どの鳥が鳴いているのか推定するものでした。これらのコンペは運ゲーではなかったのですが、上位にいるGMの数が全然違います（上図参照）。**2021では10人、2022では4人**。昔のコンペ順位表ほど、GMが増えるのは当たり前ですが、それにしても2倍以上差が開いているのは少し不自然です。

二つのコンペの大きな特徴は、学習データとテストデータで集音環境が違うこと（domain shift）が挙げられます。その上で、**2021では、テスト環境の集音データがある程度与えられていました**。しかし、2022では与えられず、多くの参加者がvalidation（CV）で苦しんでいました。

結果的に
+ 2021では、CVとLBがよく連動していた
+ 2022では、CVとLBが連動していなかった

となりました。興味深いことに、2022で[こんな](https://www.kaggle.com/competitions/birdclef-2022/discussion/326996#1802049)フィードバックをしている人がいました。
> I feel that **the num of GM participation this time was slightly lesser.** The reason "could" be the lack of validation strategies as compared to BC2021. Their time and investment would be worthwhile with a solid CV strategy. However without that perhaps the effort and results becomes unpredictable. So maybe providing avenues for **a good validation strategy is important to attract more seniors.** 

つまり、良いバリデーション（CV）ができるコンペほど、GM達を惹きつけるということです。
これは、個人的に真理のような気がしています。

まとめると、**CVとLBが良く連動しているものは**、GM達を惹きつけ、良コンペの可能性が高いです。

## 類似コンペ（論文）を調査する
Kaggleの歴史も10年を超え、多くの解法が共有されています。そして、もはや定石となっているのが、現行コンペと類似したコンペを調べ、その解法を応用することです。さらに、Kaggleの良いところとして、それらの情報はDiscussionで共有されているため、自分で調べなくてもある程度知ることができます。私の場合、**調査した結果、自分には合わないと思ったら、参加していません。**

合う合わないは一概には言えませんが、例えば、手法が初見過ぎて分からないとか、得意な領域が違い過ぎるとか、必要な技術力が足りなさ過ぎるとか、色々あります。

## アイデアを練る
類似コンペの手法を応用し、公開ノートブックを参考にすれば、通常銀メダルは取れます。ただ、金圏に到達するには、誰も思いつかないようなアイデアが必要です。アイデアは突然降ってくるイメージがありますが、**私の経験上、データを見ることでアイデアが降ってきます**。そして、データの見方にはコツがあり、私の場合は、以下、3つの視点でデータを見ています。

+ データ対象の視点
データ対象の視点に立って、データのクセを見抜く方法です。例えば、購買活動を予測するコンペであれば、人間の活動を想像します。また、動物であれば、習性や行動パターンを想像します。

+ データ収集の視点
これは、データの収集方法のクセを見抜く方法です。[State Farm Distracted Driver Detection](https://www.kaggle.com/c/state-farm-distracted-driver-detection/overview)はドライバーの画像を見て、ドライバーが危険運転（スマホを見たり、よそ見をしている）をしていないか分類するものでした（下図参照）。学習データの静止画は、一見、独立しているように見えましたが、実は**動画から静止画を切り取った**ものであり、時間的な関係性を持つものでした。そこで、[上位解法](https://youtu.be/7389fOxgBz8?t=1463)では、K近傍法で近い画像群は同じラベルを持っている特性を生かし、スコアを大きく伸ばしました。つまり、学習データは一見「時間的な関係性はない」と考えがちですが、**データ集めの容易さ**を考えると、動画を切り取った方が効率的だし、過不足なくデータを集めることができます。そして、これこそが、データ収集方法のクセでした。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264781/272ed877-d526-6008-bcda-eadc7fa32a54.png)
> 画像は[こちら](https://www.kaggle.com/c/state-farm-distracted-driver-detection/data)から転載

+ ラベル付けの視点
この視点は、ラベル付け誤差のクセを見抜く方法です。多くのコンペでは、ラベル付けは人の手によって行われます。そのため、**ラベルには人間による誤差が含まれています**。例えば、[鳥コンペ](https://www.kaggle.com/competitions/birdsong-recognition)では鳥愛好家が鳥の声を集め、ラベル付けしたデータが提供されました。そして、愛好家には判別できないくらいの、小さな鳥の声はラベルがありませんでした。そのため、「鳴いているのに鳴いていない」鳥の声が多くありました。その視点に立つと、[学習データのラベル付け直し](https://www.kaggle.com/competitions/birdsong-recognition/discussion/183204)が有力になってきます。この6位解法は、人間によるラベル誤差に積極的に向き合った一例です。

# 実践編
ここからは実践編です。題材として通称、[クジラコンペ２](https://www.kaggle.com/competitions/happy-whale-and-dolphin)を例にします。このコンペは、クジラやイルカの背中（背びれや尾ひれを含む）の画像からidを推定するものでした。

### ホストの調査・CVとLBの連動を見る
ホストは前回コンペ（[クジラコンペ](https://www.kaggle.com/competitions/humpback-whale-identification)）を見る限り、波乱もなく良さそうでした。また、CVとLBも連動してそうな感じで、この項目はクリアしました。

### Validationを構築する
CVとLBに関係して、このコンペはvalidationをうまく構築するのが一つのポイントでした。このコンペの特徴として

+ 全てのtrain dataには、idが割り振られている
+ **test dataには**、train dataにはないidがあり、それはnew_individualとして検出する

となっていました。つまり、trainとtestで環境が違いました。そこで、train dataから、あるidを意図的に抜いて、それをnew_individualにすることで、test dataと同じ環境にする方法を思いつきました。

ただ、後に分かったことですが、公開ノートブックもこの方法を採用しており、私じゃなくても、皆思いつくことでした(^^；

いずれにしても、良いValidationが構築でき、CVとLBを連動させることができました。

### 類似コンペを調査する・アイデアを練る
結論から言うと、類似コンペの調査が十分ではなかったため、上位には食い込めませんでした（他にも要因はあります）。[shopee](https://www.kaggle.com/competitions/shopee-product-matching)をメインに調べていましたが、[Landmarkコンペ](https://www.kaggle.com/competitions/landmark-recognition-2021)に多くのヒントがあったようです。

アイデアとしては、
+ State Farm Distracted Driver Detectionコンペと同じように、動画形式の静止画があり、精度を高められそう
+ 画像から、イルカやクジラの部分を切り出す方法が主流だが、背景（砂漠や氷河が写っている）にもidを特定する手がかりがある

があり、二つ目のアイデアは、上位陣がうまく取り込んでいました。いつか同じようなコンペが開かれ、そしてリベンジしたいです！

# まとめ
コンペのチェックポイントは以下4つ。
+ ホストを調べる
+ CVとLBの連動をチェックする
+ 類似コンペを調査する
+ アイデアを練る

「アイデアを練る」は特に大切で、私の場合、多くの時間をここに割いています。アイデアは、文中に示した3つの視点を使って、データを見つめ続けると、ある日突然降ってくることがあります。