この1ヶ月の間、KaggleのM5 Forecastingに参加してみた。頑張って上位5%(シルバー)にいたこともあったが、そこにいた時間を合計して3日未満で情けない。
初めての実戦が一段落で、この2ヶ月の間の心得をノートしたい。
DSコンペに、データの種類が大体3つあると思う:
- 表形式データ(tabular data)
- 画像データ
- 自然言語データ
M5 Forecastingが表形式データ分析コンペだから、この部分についての心得を容易く書けると思う。
写真データ分析コンペについては、仮参加したコンペが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
- sklearn.model_selection.GridSearchCVを利用する(ちょっと時間かかる)
- bayesian optimizationなどもっと効率的な手段
-
DNNの場合
- Weight Decay
- Dropout
- DropConnect(利用したことがない)
2.特徴量エンジニアリング(feature engineering)
- まずは簡単な訓練・回帰分析(計量経済学の手法など)を行い、特徴量重要度図を作る
- 現実的な視点から課題自体を理解する
- GoogleCloud&NCAA/NCAAWコンペではバスケルール・試合再生を見る
- M5 Forecastingでは、販売量の分布・トレンドに注目する
- カテゴリごとにデータを見る
-
M5 Forecastingのカテゴリが多すぎで(確かに3049種商品*10店舗)、これまで商品ごとの検討をまだやってない。
この点こそ上位参加者の切り札だと思う上位参加者はこのくらい努力を払ったに決まってる!もっと切り札が手にいるはずだ - 当然、時間かかりそう
-
M5 Forecastingのカテゴリが多すぎで(確かに3049種商品*10店舗)、これまで商品ごとの検討をまだやってない。
- 異常値(99%信頼区間外)を除く・上限(例えば歴史データ最大値の1.2倍)を決める
- 欠損値の意味(データの紛失ですか、あるいは商品が完売したか)
- Magic Feature探し
- 特徴量重要度によって、弱い特徴量を除きつつ、損失関数の変化を観測する
- 似た過去コンペのノートブックを読む
- 現在、他の参加者がやっている討議に参加する(あるいは覗く)
- その他
3.時間節約
- パラメタチューニング(lightgbmに参照)
- 並列計算(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のコースに従って、画像セグメンテーション・マルチラベル分類コンペに仮参加したことがあるが、現時点で正式なコンペに参加したことがない。1〜4がコースから学んだのです。
1.まず小さいサイズから訓練
- 例えば3352352の画像を3224224に変換し、ファイルサイズを60%小さくさせる
- より大きいbunchsizeを設定できる
- 最初の訓練を加速する
2.データ拡張(data augmentation)
- 水平反転
- 垂直反転
- 回転
- ズームイン・ズームアウト
- 光度調整
- 歪み
- その他(写真重ね・合成など)
- 以上変換の発生率
(参照:fast.ai)
3.学習率設定
- このコースでは、loss-lr図で傾きが一番急なlrよりわずか大きいlrを利用する
- 複数gpuの場合、lr=(base_lr/8)num_gpus(img_per_gpu/2)で設定する
4.pre-trained modelsを利用する
-
ImageNet等のサイトからpre-trainedモデルを利用すべき。ゼロから訓練する必要がない。
- コースで利用されたモデル:ResNetシリーズ、UNet
5.その他(これから勉強する予定)
- loss関数の設定
- まずは簡単な精度関数(Accuracy/RMSE/F-Score/Cross-Entropy Loss)
- Focal Loss、GIou Lossなど(最近はこの分野の論文を解読している)
- 最新モデル
- Cascade-R-CNN + ResNeXt/ResNetシリーズ + FPN+DCN2
(参照:朱超杰)
朱さんのブログからたくさん学べる気がする
- Cascade-R-CNN + ResNeXt/ResNetシリーズ + FPN+DCN2
- 高級スキル
自然言語データ:
またやってない