Kaggleに取り組み初めて、9ヶ月時点でのkaggleのやり方と考えていること
この文章は、技術書典6で頒布予定のKaggleのチュートリアル第3版に掲載予定の文章です。
去年の7月から、9ヶ月くらい専業Kagglerとして、Kaggleに取り組んできて、少しだけ効率的な取り組み方がわかったことや考えていることを、まとめてみます。
コンペの選び方
多くの時間を投入することになるので、後悔のないように選びたいところですが、どのコンペでも学べることは数多くあるので、直感で選んでしまっても割と大丈夫だと思っています。
私は、自分がその時に学びたいことを学べるコンペをなるべく選ぶようにしています。
また、テストデータが小さすぎるコンペは、最終結果が運に左右される割合が多くなってしまうため、なるべく選ばないようにしています。
なお、初めのうちは、できることも限られ、それほど多くの時間を投入しないと思われるので、参加チームが多いなどの理由で選んでも良いと思います
参加チームが多いコンペは、ディスカッションなどでの情報も多く、またシンプルなコンペであることが多いです。
信頼できる検証セットの大切さ
はじめにEDAなどを行いながら、手元でのCVスコアとパブリックリーダーボードのスコアが相関する状況になることを目指します。
CVスコアはトレーニングデータ全体でのスコアになることが多く、テストデータの一部で算出されるパブリックリーダーボードのスコアよりも一般に信頼できます。
こうして、CVスコアが上がれば、パブリックリーダーボードのスコアが上がるという状況ができれば、特徴選択やモデルの選択などが、サブミットすることなくCVスコアのみで判断することができ、パブリックリーダーボードのスコアは目安程度となります。
「トラストCV」とkaggleでは、格言のようにCVスコアを信じることの大切さが言われますが、信じるのはパブリックリーダーボーと相関する状況になった、CVスコアのことであり、適当に作った検証セットのCVスコアではないということを気をつけましょう。
(コンペによっては、相関させるのが不可能だったり、CVスコアを信じる、パブリックリーダーボードを信じる必要があるなど、特殊なものもありますが、その時には、統計学だったりドメイン知識だったり幅広い知見が求められると思っています)
初めのうちは、この考え方が理解できませんでしたが、各コンペのDiscussionにある「LB/CV score」などというトピックでの議論がとても参考になります。
また、現在Kaggle Rankings1位のbestfittingさんが、インタヴューで検証セットの大切さを説明されており、とても参考になりましたので、読んでみることをお勧めします。
実験と実験の管理
信頼できる検証セットを作成できた後は、実験を数多くするのみです。
ディスカッションで話題になっていることや、過去コンペのソリューション、EDAを行い気づいた特徴などを追加しCVスコアが上がるか確認をします。
実験の手数が、最終順位と直結するため、時間のかかる計算は2回計算しないことや、自動化できることは自動化することに気をつけ、できるだけ高速に実験を回し、実験結果を記録します。
全ての手法や特徴について試す時間はないため、経験や直感による取捨選択も行わざるを得ないですが、なるべく少しでも試してみて、実験結果による取捨選択を心がけます。
私は次のように、実験することや実験結果を記録する仕組みにしています。
・コード
コードはdropboxに保存し、自動でbackup・同期されるので外出時などPCが変わってもアクセスできるようにしています。また、念の為、githubのプライベートレポジトリにたまにpushするようにしています。
・アイデアやタスクリスト
コンペ毎にgithubのプライベートレポジトリを作成しており、そのissuesで管理しています。issueにはlabelをつけることができ、「特徴量エンジニアリング」や「idea」などlabelをつけておくと関連するラベルを一度に確認することができとても便利です。
・メモ
コンペ毎に紙のノートを用意し、手書きでアイデアなどを書いています。アイデアの発想には紙のノートがとても捗る気がしています。
・cvスコア
cvスコアは、スプレッドシートで管理しています。LightGBMを回すと、スコアや入力した特徴などが、ログとして吐き出され、それをスプレッドシートにコピペする形でcvスコアを管理しています。
後から試したことと、その結果を把握できることは重要だと思っています。
・やったことメモ
自分がやったことのメモは1人Discordにコンペ毎のチャンネルを作り適当に書いています。
Discordはslackと異なり、チャンネルを自由に移動させることができカテゴリも作成できるのでチャンネル数が増えてもほぼ問題がありません。また、投稿数の制限もなく、画像にもユニークなURLが与えられgithubなどから参照できるのでとてもお勧めです。
復習の重要性
コンペに参加後に、他の方がディスカッションやブログなどで公開するソリューションを読むことはとても実力の向上に直結すると思います。
知らないデータで新しいことをするのは難しいですが、自分が取り組んだコンペであればデータについては良く知っているので、新しい手法を理解したり・試したりするのも割と簡単です。
そうしてできることとコードの資産を増やすと、次のコンペでも高速に多くの手法を試すことができます。
また私は、コンペ終了後に、youtubeでの振り返りの生配信を行ったり、コンペの反省会 (オフ会) を行ったりして自分のやったことをまとめたり、他の方のソリューションを具体的に聞くようにしています。
文字情報は効率的に多くの情報を入れられますが、実際に会話することで深い知見を取り入れることができると考えています。
以上現時点で考えていることをまとめてみました。この文章を読んで質問やアドバイスなどあれば次のリンクからお願いします。twitterやnoteで回答します。
Kaggleのチュートリアルは、このnoteから購入可能です。(第3版に、来週更新します)
コメントお待ちしています。匿名の質問はマシュマロから→https://marshmallow-qa.com/currypurin