脳コンペお疲れさまでした。 月レポとVNOSのほうを先に記事にしたかったので、2日遅れの反省になります。
205位だったので、別にソリューションとかそういうものではないです。
一応、一番スコアが高かったのは、Cross-Validation して性能のよかったマルチレイヤーパーセプトロン約10種類をランダムシードやデータ分割数を変えて計150個くらい学習し、その出力をスタッキングし、単純パーセプトロンで作った Rigde / Lasso / ElasticNet っぽいものをアンサンブルし、Cross-Validation して性能が高いものの結果を平均したものでした。
前回からの改善点
- Discussion を DeepL で雑に流し読みした (運営の立てたスレッド以外、大した情報はなかったと思う)
- AWS を活用
- 基本構成は p2.xlarge + gp2(SSD)
- CPU の計算量が多い Notebook があったので、安価で14コア使える c5.4xlarge を使用 (p2 は4コアしかない)
- Hyperopt を使用したパラメータサーチをした
- やはり使いにくい。次は Optuna を試す
- Kaggle API でデータダウンロード、サブミットした
- 明確な意図と根拠を持って学習/テストデータのクリーンナップをした
- 例えば今回は、domain1/2_var1/2 はほとんど20以下、80以上の値が存在しない & ロスがピーキーだったので値をクリップした (これは最後のほうに気づいたのでスコアに反映させられなかった)
- 学習データにある年齢は連続値のようで33種類しかないので最終出力はこの33種類の中から一番近いものを選択する (これも最後のほうに気づいたのでスコアに反映させられなかった)
- スタッキング+アンサンブルを実装した
- 複数アプローチを実装し、とりあえずサブミットしてみた
- 3DCNN
- TensorBoard でパーセプトロンの重み、BatchNormalization の統計量をダイレクトに観察して安定性、正則化効果を確認
- 特殊な活性化関数を使用 (これでそこそこスコアが上がった)
- 1つ1つのファイルが重く、メモリに載らないタイプのコンペだったので、3Dデータは最初に pkl 形式に変換して保存し、学習時は高速で読み取りできるように (まだ改良の余地あり)
新たに分かったこと
- 他人の Notebook にも普通にミスがある
- ミスがある前提で参考にする必要あり
- 半分以上が他の Notebook のコピペの Notebook が多数存在する
- サイクルを回してテンポよく戦うのがいい
- (ディスカッション見る) → Notebook見る → データ分析 → アプローチを実装 → Notebook 見る → データ分析 → ...
- 抜け落ちていた前処理とかを拾える
- 公式サイトからデータの統計量は「一応」確認できるが、ミスリードを誘発する表示になっている場合があるので、データ分析して確認する必要あり
- 年齢が33種類しかないのにまるで連続値のように見える表示 (棒グラフのバーの数が少ないだけ)
late sub しようと思っていたんですが、EBS (500GiB) は放置するだけでお金を溶かすので、普通にインスタンスごと消してしまいました。
得たもの
自分があと何時間考えてもこの解法は思い浮かばなかったな…というのがいくつもソリューションにあり(GNNとか)、普段からちゃんと勉強しておくべきだったなぁ…と反省しました。
知らないモジュールを知る機会になる。(Rapids.ai は知らなかったです)
失ったもの
100時間と9,000円。
S3 + Kaggle Notebook + Colaboratory を上手いこと使えばあと50%はコストカットできそうな気がします。 特に、今後も Kaggle をやる場合、時間に比例してコストが増していくので最適なコストカットが必要ですね。
残った謎
- 3DCNN が収束しなかった理由 (学習すると平均値みたいなのを出してしまう)
- VSE (メテオサーチで使ったやつ) / LR / BN / Optimizer / batch size / チャンネル数 / architecture は一通り試した
- 結局 Pipeline って何
今後導入したいもの
- Flow系を使う
- MLFlowなど
- PyCaret /
FastAI の利用← Rapids.AI だった - ラストスパートをかけられる構成を作る
- S3 + ECS + docker でインスタンスを大量に立てて並列でパラメータサーチできるような構成を作りたい (ECS は使ったことないので勉強する)
- 場合によっては p2.16xlarge / p3.16xlarge でゴリ押すのでもいいかも