自分整理したKaggleスキル＆注意点

この1ヶ月の間、Kaggleの[M5 Forecasting](https://www.kaggle.com/c/m5-forecasting-accuracy/)に参加してみた。頑張って上位５％（シルバー）にいたこともあったが、そこにいた時間を合計して3日未満で情けない。

初めての実戦が一段落で、この2ヶ月の間の心得をノートしたい。

DSコンペに、データの種類が大体3つあると思う：
- 表形式データ（tabular data）
- 画像データ
- 自然言語データ

[M5 Forecasting](https://www.kaggle.com/c/m5-forecasting-accuracy/)が表形式データ分析コンペだから、この部分についての心得を容易く書けると思う。
写真データ分析コンペについては、仮参加したコンペが2つあったから、ある程度に書ける。
自然言語データ分析コンペにまた参加したことがない。
(2020.4.15まで）

## 表形式データ（tabular data）（4.20更新）：

### 1.過学習（overfitting）対策・パラメタチューニング（Parameters Tuning）

- カテゴリが多すぎ(YEAR/MONTH/WEEK/DAY/DAYOFYEARデータが全部categorytypeにした)：
  - ~~int・floatのまま放っておく（要検討）~~これはダメ
  - 一部カラムだけ利用する(feature fraction)
  - embedding
  - その他
- ブースティング（catboost/lightgbmなど）の場合
  - 参照：[lightgbm](https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html)
  - sklearn.model_selection.GridSearchCVを利用する（ちょっと時間かかる）
  - bayesian optimizationなどもっと効率的な手段

- DNNの場合
  - Weight Decay
  - Dropout
  - DropConnect(利用したことがない)

### 2.特徴量エンジニアリング（feature engineering）
- まずは簡単な訓練・回帰分析（計量経済学の手法など）を行い、特徴量重要度図を作る
- 現実的な視点から課題自体を理解する
  - GoogleCloud&NCAA/NCAAWコンペではバスケルール・試合再生を見る
  - M5 Forecastingでは、販売量の分布・トレンドに注目する
- カテゴリごとにデータを見る
  - [M5 Forecasting](https://www.kaggle.com/c/m5-forecasting-accuracy/)のカテゴリが多すぎで（確かに3049種商品＊10店舗）、これまで商品ごとの検討をまだやってない。~~この点こそ上位参加者の切り札だと思う~~上位参加者はこのくらい努力を払ったに決まってる！もっと切り札が手にいるはずだ
  - 当然、時間かかりそう
- 異常値（99％信頼区間外）を除く・上限（例えば歴史データ最大値の1.2倍）を決める
- 欠損値の意味（データの紛失ですか、あるいは商品が完売したか）
- Magic Feature探し
- 特徴量重要度によって、弱い特徴量を除きつつ、損失関数の変化を観測する
- 似た過去コンペのノートブックを読む
- 現在、他の参加者がやっている討議に参加する（あるいは覗く）
- その他

### 3.時間節約
- パラメタチューニング（[lightgbm](https://lightgbm.readthedocs.io/en/latest/Parameters-Tuning.html)に参照）
- 並列計算（parallel・Pool）
  - メモリー不足の可能性が要注意（自分はsubmissionを生成する時だけに使う）
- その他

### 4.メモリー節約
- dtype調整
  - int32$\rightarrow$int8、float64$\rightarrow$float16など
- 時系列データなら、まず近年データだけ利用して特徴量を探す
- dropna
- その他

### 5.アンサンブル（Ensemble）
- モデル間、もしくは自分の各バーションのsubmission間のアンサンブル
 - もちろんアンサンブルがとても役に立つが、時間が大変かかる！どのバーションのsubmissionを利用するかについての検討は大変
 - 例えば、lightgbm+gbdt+xgboost+catboost(+dnn+lstm, etc.)
 - 例えば、version4.10v1（4月10日第一回提出）とversion4.9vb（4月9日最もよい提出）をアンサンブルするか、もしくは(version4.10v1*1.02+version4.10v2)/2のような「闇スキル」をすべきか（ちょっと運に任せるから、あんまり気に入らん）
  - feature engineeringのほうが優先だと思う。自分はこれを締め切りの最後にする予定
  - その他

### 6.他人のソースコードをよく読んで、理解して、再現してみる（共通）
- 一見すると自分がやっていることとほとんど同じだと感じたが、自分がなかなか良い結果を出なかった？
  - 自分のコードのどこかが絶対に違っている。こんな時自分のパソコン・サーバーで実行すべき
- 「公開せず隠しているコツ」「改善できる部分」を考える
  - 公開する人は、「「いいね」ももらえるし、コツを使って最後に最低限ブロンズももらえる」「一部コードを公開したことで、コンペ枠とノートブック枠のメダルを共に手に入れることができてまさに大豊作」などのことを考えている（多分…）。だから絶対にどこかが改善できる
- その他

### 7.手段を選ばない（共通）
- 自分の専攻が計量経済学なので、最初は因果関係の分析手法に拘り、ブースティングなどに信用しなかった。今はまさに…

### 8.持続力（共通）
- 「寝る前はシルバーだったが、起きたらブロンズもない」を体験し続けて、精神ストレスを耐える
- 三ヶ月の計画を立つ

### 9.初心忘るべからず（共通）
- 何のためコンペに参加したか？
  - 知識を得たい$\rightarrow$ノートブック・論文・過去コンペの検討が優先
  - 上ランキングを目指す$\rightarrow$手段選ばず努力を続ける
  - やはり賞金だ！$\rightarrow$身の程を知った上頑張りなさい
  - ちょっと試したいスキルがある

### 10.その他
- To be added

## 画像データ：
[fast.ai course v3](https://course.fast.ai/index.html)のコースに従って、画像セグメンテーション・マルチラベル分類コンペに仮参加したことがあるが、現時点で正式なコンペに参加したことがない。１〜４がコースから学んだのです。

### 1.まず小さいサイズから訓練
- 例えば3*352*352の画像を3*224*224に変換し、ファイルサイズを60%小さくさせる
- より大きいbunchsizeを設定できる
- 最初の訓練を加速する

### 2.データ拡張（data augmentation）
- 水平反転
- 垂直反転
- 回転
- ズームイン・ズームアウト
- 光度調整
- 歪み
- その他（写真重ね・合成など）
- 以上変換の発生率
(参照：[fast.ai](https://docs.fast.ai/vision.transform.html))

### 3.学習率設定
- このコースでは、loss-lr図で傾きが一番急なlrよりわずか大きいlrを利用する
- 複数gpuの場合、lr=(base_lr/8)*num_gpus*(img_per_gpu/2)で設定する

### 4.pre-trained modelsを利用する
- [ImageNet](http://www.image-net.org/)等のサイトからpre-trainedモデルを利用すべき。ゼロから訓練する必要がない。
  - コースで利用されたモデル：ResNetシリーズ、UNet

### 5.その他（これから勉強する予定）
- loss関数の設定
  - まずは簡単な精度関数（Accuracy/RMSE/F-Score/Cross-Entropy Loss）
  - Focal Loss、GIou Lossなど（最近はこの分野の論文を解読している）
- 最新モデル
  - Cascade-R-CNN + ResNeXt/ResNetシリーズ + FPN+DCN2  
（参照：[朱超杰](http://spytensor.com/index.php/archives/53/)）  
朱さんのブログからたくさん学べる気がする
- 高級スキル

## 自然言語データ：
またやってない