Kaggleソロ参戦の流れ

# 初めに
　この記事は、私が過去に参加したKaggleにおいて実施した分析の流れを共有するために書いています。これからKaggleをソロで始める人、既に始めているがまだ歴が浅い人にとって少しでも参考になれば幸いです。

# 前提
1. Kaggleの仕組み（Code/DiscussionやSubmit周り）は知っていることとします。まだご存知のない本当にこれから始めようとしている方は他のQiita記事を参考に概要を掴んでください。
2. Kaggleの環境のみを利用することとします。KaggleではGPU環境が用意されており、1週間で30~40時間程度ですが無償利用が可能です。利用できる時間の長さは週によって異なり、おそらく、Kaggle環境の空き状況や利用頻度等に応じて使える時間が割り振られる仕様になっていると思われます。***日本時間では毎週土曜日の朝9時にGPU使用時間がリセットされます。***
3. 社会人であることとします。学生と社会人で大きく１日の時間の使い方が異なるため、社会人のタイムスケジュールに合わせて記載しています。
4. 子供がいる等、自分自身の自由な時間が確保しにくい状況にあるとします。例えば独身の場合はもっと踏み込んだ時間の使い方が出来る可能性が高いです。
5. 人それぞれ朝が得意、夜が得意など特性がありますが、筆者の特性に合わせて夜型で書いています。朝方の方は適宜時間をスライドさせてください。

# １日の流れ
　１日の始まりを、ここでは終業後の18時として書いていきます。表の上の数字は時間です。もちろん毎日この通りではありませんが、基本的にはKaggleに参戦している間はこのスケジュールで1~3ヶ月ほど過ごします。
![図1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930460/dffcaa7e-76e9-0952-d726-76cc09920e2e.png)
　私の場合は、ほとんど在宅勤務であるため、仕事の前後に通勤時間はありませんでした。ただ、通勤時間は通勤時間で有効な時間の使い方が出来るタイミングのため、前提には入れていません。詳しくは後述します。

# Kaggle参戦直後：ベースライン作成期
　まずは、ベースライン作りに没頭します。２ヶ月ほど時間が取れて参加できる場合は、既存の公開されているコードを参考にしつつも、過去の自分の資産も活用し、自分なりのベースラインを一から作っていきます。コンペ終盤から参加する場合は、公開されているコードをベースラインとすることも多いです。以下は、一から作るイメージで書いています。
　ベースライン作成期における一日の時間の使い方は以下です。ベースライン作りを優先するため、仮に学習を走らせる場合でも少ないデータをサンプリングし、まずは一通り動くこと、を優先します。

* 夜のKaggle Timeの間にDiscussionやCodeを通して調査したり、ベースラインとなるコードを書く
* 通勤時間等、空いた時間を活用してDiscussionやCodeを読み、後から実装する改善ポイント等の情報を蓄えておく

　この過程で、モデル作成のベースラインが完成します。加えて、いくつかの試したいことがメモなり頭の中にある状態にします。時間として2週間〜長くて1ヶ月かかることもあります。慣れているテーマか、複雑なタスクか、あたりで実装にかかる時間はばらつきます。

# ベースライン作成後：試行錯誤期
　この段階で、モデルを本格的に学習させる準備が整っていることとなります。Kaggle Timeの中で、学習を実行するためにSubmitを実施します。Submitすることでコードが頭からバックエンドで走ってくれるため、ボタン押下して睡眠するイメージです。この際、２つのポイントがあります。

## 1. 学習した結果を比較したい場合
   
これは例えば、以下のケースが当てはまります。

```
* データAとデータBそれぞれ同じモデルで学習させて結果を比べたい。
* 前処理Aと前処理Bそれぞれを通した後で学習させ結果を比べたい。
```

　この場合、Kaggle上でコードを複製し、パラで学習を走らせるという選択肢があります。ただし、1週間で使えるGPU時間は限られているため、今何曜日で、1回の学習に何時間かかり、今週は後何を試したいのか、を考えた上、問題なければパラで走らせます。

## 2. 学習した結果を見てから次のアクションを決めたい場合

　これは例えば、次のケースが当てはまります。

```
* データAを学習させ、その結果が良好であれば、パラメータを変えてもう一度実験したい。
* 前処理Aを実施した学習結果が良好であれば前処理Aを採用し、前処理Bを加えるか同じく学習して評価したい。
* 前処理Bを実施した学習結果が良くなければ前処理Bを削除し、前処理Cを加えるか同じく学習して評価したい。
```

　この場合、KaggleでSubmitを行い学習を走らせ、それと同時に、非常に軽微な修正で次の学習を走らせられるように準備しておきます。


　上記の 1 or 2 で学習をキックし、睡眠し、起床します。と同時にスマホで結果をチェックします。チェックが完了したら、考察をしながら身支度を進めてください。2に該当する場合、通勤時間や仕事開始前の数分を使って、準備した学習をキックします。そして仕事を開始してください。仕事中は出来るだけ仕事に集中しましょう。
　試行錯誤期では、学習の準備/実行（夜）→ 結果の確認＆学習の実行（朝）→ 結果の確認＆学習の準備/実行（夜）→ ・・・これを繰り返していくイメージとなります。
　以上を踏まえて重要なのは以下の2つです。とにかくこのフェーズでは試行錯誤を限られた時間の中で効率良く試していくことに集中します。
* ***このサイクルを確立すること。***
* ***GPUの残利用可能時間を基に計画を立てること。***

# コンペ終盤：アンサンブル期
 この段階で、残り2週間等、コンペの終盤に差し掛かっていることとします。最後の力を振り絞ってアンサンブルしていきます。試行錯誤の結果を基に精度の高いモデルをピックアップし、アンサンブルするためのコードを書きます。試行錯誤の過程で作成したモデルは、Kaggle上のデータセットとして登録することによって別のコードでも利用できるようになります。これを利用することで、作成したモデルを貯めていき、アンサンブルに利用します。
![図2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1930460/8751235d-661e-aa4d-b6a5-f6eb627f3e66.png)

（学習済みモデル等、と表現しているのは、データやパラメータ、精度を同時に出力しておき、精度比較やデータ観察に使うことがあるためです。）

# コンペ終了直前：選択期
　このタイミングで、コンペ終了前日等、もう終了が目の前の状態です。ここまでのKaggle Lifeの集大成となる、選択の時間です。多くのコンペは２つのSubmitを選択することとなります。人それぞれ選び方はあるかと思いますが、私の場合は以下を選ぶことが多いです。

* CVベスト（手元のテストデータに対する精度のベスト）
* Public LB ベスト（Publicリーダーボード上での精度のベスト）

# 終わりに
　ここまで、私がKaggleにソロ参戦してきた際の過ごし方を書いてきました。まるでヘビーな仕事が1つ増えたかのような感覚で楽しんでいます。今となってはKaggle Timeが仕事時間になってしまっているので、どうにか元に戻したいと思っているところです。
　皆様のKaggle Lifeに少しでも役に立てたら嬉しいです。