Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PLAsTiCC 3rd Place Solution

Nomi
July 13, 2019

PLAsTiCC 3rd Place Solution

Kaggle Tokyo Meetup #6の発表資料です。
https://connpass.com/event/132935/

Nomi

July 13, 2019
Tweet

Other Decks in Technology

Transcript

  1. 自己紹介 ⦁ Nomi ( : nyanp) ⦁ Software Engineer @

    大阪 ⦁ Kaggle : 2018/3~ ⦁ 深層学習FrameworkのAuthor (tiny-dnn, 2012~) ⦁ 特徴量エンジニアリングが好き
  2. 2 Data Processing Challenges in LSST ⦁ 突発天体の早期検出 ◦ イベントが終わる前に検出し、後続の観測機器で詳細にスペクトルな

    どを観測したい ⦁ 突発天体・変動天体の自動分類 ◦ どの観測機器のキャパシティよりも速いペースで天体を検出し続ける ので、LSST自身でも天体の分類を行う必要がある ◦ PLAsTiCCはこちらのタスク
  3. 評価指標: Weighted Multi-Class Log Loss        w: class iの重み (1 or

    2)        N: class iのデータ数 ⦁ Minority Classほど1データの重みが大きい ◦ GBDTの学習時にはsample_weight等の調整が必要
  4. データセットの特徴 ⦁ Training 8,000件 vs Test 3,500,000件 ⦁ Test Dataは遠方の観測データ多め

    ⦁ Test Dataにしか無い未知天体“Class 99” ◦ 実際は特定の天体ではなく、いくつかの天体のミックス Training = 既存観測データ、Test = LSST、という問題設定
  5. 上位入賞への鍵 ⦁ 超新星以外は比較的容易に区別できた。時系列データから、どんな特徴 量/モデルで超新星のパターンを見分けるかがポイントだった。 ◦ 上位陣のアプローチは大きく3つ ▪ Gaussian Process ▪

    NN (LSTM / RNN / 1D-CNN) ▪ Template Fit ⦁ Class 99をどう扱うのかもスコアを大きく左右した。 ◦ ただしPublic Kernel相当の手法でも金メダルまでは行けた
  6. The Team “Major Tom” yuval NN担当 TrackML 7th / Jigsaw(‘19)

    暫定9th つよい。 mamas nyanp リーダー&Catboost担当 TalkingData 5th / Santander(‘19) 9th つよい。 LGBM&ドメイン知識担当 ニャンピョウ みんなKaggle歴は浅め (当時Expert x1, Contributor x2)
  7. Solution Pipeline Yuval Features x 4 Nyanp Features x 581

    Mamas Features x 2K 1DCNN (4 Fold) LB: 0.86854 1DCNN (4 Fold) LB: 0.85209 1DCNN (4 Fold) LB: 0.86854 LightGBM (Gal + Ex-Gal) x4 LB: 0.86542 (20th place) CatBoost (Gal + Ex-Gal1 + Ex-Gal2) x7 LB 0.82955 (13th place) Per-Class Ensemble LB: 0.75876 (5th place) Final Sub LB:0.70016 (3rd place) Class99 Postproc Avg. CNN LB: 0.81019 (8th place) Top 16 Top 16 ※LB and rank is based on private dataset
  8. Key points ⦁ 1D CNN ⦁ Template Fit & ドメイン知識由来の特徴量

    ⦁ 2種類のPseudo-Labeling ⦁ LB ProbingによるClass 99推定
  9. Key points ⦁ 1D CNN ⦁ Template Fit & ドメイン知識由来の特徴量

    ⦁ 2種類のPseudo-Labeling ⦁ LB ProbingによるClass 99推定
  10. Architecture Input 1D Conv (k=8) +BN, LeakyReLu, Dropout 128 128

    18 256 256 1D Conv (k=5) +BN, LeakyReLu, Dropout 128 256 1D Conv (k=3) +BN, LeakyReLu 128 256 Global- Max Pooling 256 14 Dense Dense Dense Dense 32 16 Input (Meta) 6 Galactic- Switch Input (hostgal_photoz) 14 1 photoz>0かどうかで 無関係なクラス側の 出力をマスク 時系列データを 長さ128 x 18chに加工 メタデータ側の特徴量 Light curveは 時間方向のシフトに対して invariant
  11. CNN学習 ⦁ 学習時に以下のAugmentation ◦ ランダムに線形補間前の元データを削除 ◦ flux_errに基づいたランダムノイズ ◦ Cyclic Shift

    ◦ Skew : 各chをランダムに1+Δ倍 ⦁ Feature Engineering無しのSingle ModelでPrivate 22位 ◦ 仮にclass99 probeと合わせれば、特徴量無しでも金メダル相当
  12. Key points ⦁ 1D CNN ⦁ Template Fit & ドメイン知識由来の特徴量

    ⦁ 2種類のPseudo-Labeling ⦁ LB ProbingによるClass 99推定
  13. Template Fitting is Slow... ⦁ 大体手元で1データ0.8秒くらい ◦ テストデータは3.5M rows ->

    30日くらいかかる ◦ コア数を増やしてもスケールしない
  14. Template Fitting is Slow... ⦁ 大体手元で1データ0.8秒くらい ◦ テストデータは3.5M rows ->

    30日くらいかかる ◦ コア数を増やしてもスケールしない ⦁ 解法:インスタンスを30個立てて30倍速
  15. その他の特徴量(2) - TimeScale ⦁ 超新星は種類によって減光の時間スケールが違うので、それを 捕まえたい ◦ detected = 1の持続時間

    ◦ max(flux) - N% fluxの減衰時間/立ち上がり時間 ◦ fluxと時間の差をとり、arctanで角度に変換→集約 mjd 0 2 3 5 flux 10 15 23 32 mjd_diff 2 1 2 flux_diff 5 8 9
  16. その他の特徴量(3) - Gaussian Process ⦁ Gaussian Processでフィッティングし、長さ100x6chの予測値 をそのまま特徴量に使う ◦ ライブラリはGPyを使用

    ◦ こちらもやっぱり~30日かかる ▪ mamasさんが30インスタンス使ってがんばっていた ⦁ 既にTemplate, CNNが出来た後だったのでLBの増分は少な かったが、diversityには効いた?
  17. その他の特徴量(4) - tsfresh, feets ⦁ 時系列データの特徴抽出を専門にしたライブラリがあるので、 それらも活用 ◦ https://github.com/blue-yonder/tsfresh ◦

    https://github.com/carpyncho/feets ⦁ 劇的に効いたものはないが、baselineとしては有用だった ◦ fft-coefficient, auto-correlation, skew, slope…
  18. Key points ⦁ 1D CNN ⦁ Template Fit & ドメイン知識由来の特徴量

    ⦁ 2種類のPseudo-Labeling ⦁ LB ProbingによるClass 99推定
  19. Class 90/42 Pseudo-Labeling (LGBM) ⦁ Class 90, 42 (SNla, SNll)に絞って実施

    ◦ Class 99に似たクラスでPLをやるとスコアを落とすので注意 ◦ LightGBMで~0.03くらい効いた 元データの1~10倍くら いの量のPseudo Label を加えるのがベストだっ た 左はx軸をPLの閾値、右はpseudo/real labelの比率で同じデータをプロット
  20. Key points ⦁ 1D CNN ⦁ Template Fit & ドメイン知識由来の特徴量

    ⦁ 2種類のPseudo-Labeling ⦁ LB ProbingによるClass 99推定
  21. Class 99 ⦁ OCSVMのような通常の異常検知は上手く行かない ⦁ Public Kernelでのアプローチ preds_99 = np.ones(preds_.shape[0])

    for i in range(preds_.shape[1]): preds_99 *= (1 - preds_[:, i]) →他のどのクラスとも似ていないときにスコアが上がる
  22. Class 99 ⦁ 疑問:Class 99はどんな天体なのか? ◦ 候補1:あまり見つかっていないタイプの超新星 ◦ 候補2:AGNやマイクロレンズなど、それ以外の天体 ⦁

    Class 99が何であるにせよ、どのクラスからも均等に遠い、と いうことはないはず ⦁ じゃあクラスごとに異なる重みを付けてみたら? Kiを下げる =P(ci)が高いときのペナルティを弱める =Class99とciが似ていると扱う
  23. LB Probing on Class 99 weighting ⦁ まずはClass 90の係数を2乗に →

    スコア改善 ◦ 少なくともClass 90(SNIa)とは似ていなさそう ◦ 手ごたえを得たので、これ以降LB Probingに専念 元々SNIaは他と区別がつ きやすい超新星のため、ド メイン知識から考えても妥 当な結果。 当時の気持ち
  24. LB Probing on Class 99 weighting ⦁ 超新星を中心に係数を調整し、以下の解に到達 ◦ Class

    42や52, 62 (いずれも超新星)と良く似ている ◦ これだとPrivate 4th相当
  25. 上位陣の解法 - 1st Place (Kyle) ⦁ Train Dataを遠方にシフトさせるAugmentation ◦ 発想は自然だが実際やるには要ドメイン知識

    ⦁ Gaussian Processでデータを補間し、その波形の上で 集約やTimeScaleなどの特徴量を作る Code: https://github.com/kboone/avocado/blob/master/avocado/plasticc.py Discussion: https://www.kaggle.com/c/PLAsTiCC-2018/discussion/75033#latest-457546
  26. 上位陣の解法 - 2nd Place (Silogram & Mike) ⦁ Class99を抜くと1位 ⦁

    NNがとても強かった ◦ シンプルなBidirectional GRU ◦ 距離で割って波形を平準化 ◦ コードが綺麗なので読もう Code: https://www.kaggle.com/zerrxy/plasticc-rnn Discussion: https://www.kaggle.com/c/PLAsTiCC-2018/discussion/75059#latest-462457
  27. モデリングの基礎部分 (GBDT Part) ⦁ 銀河系内モデルと銀河系外モデルに分割 ◦ 特定の列の値が0かどうかで完全に識別可能なため ◦ CatBoostでは、銀河系外モデルを2種類作っていた ▪

    hostgal_speczを特徴量に含めたモデルとそうでないモデル ⦁ ValidationはN-Fold Stratified CV ◦ CVで効いた特徴量だけTest Dataの分を作り、時間短縮 ⦁ Metricに合わせてsample_weightを重み付け ⦁ CatBoostではアンサンブル時に異なる特徴量のサブセットで モデルを学習
  28. Hyperparameter (LightGBM) { 'objective': 'multiclass', 'metric': 'multi_logloss', 'learning_rate': 0.1, 'max_depth':

    3, 'subsample': .9, 'colsample_bytree': .9, 'reg_alpha': 0, 'reg_lambda': 3, 'min_split_gain': 0, 'min_child_weight': 10, 'min_data_in_leaf': 1, 'n_estimators': 10000, 'max_bin': 128, 'bagging_fraction': 0.66, }
  29. 簡単な実験 ⦁ CatBoostはOrdered Boostingと、通常のBoostingを選択できる ⦁ 上記2つ+似たハイパラのLGBMで、CVと混合行列を確かめてみる CatBoost { 'learning_rate': 0.1,

    'max_depth': 3, 'objective': 'multiclass', 'metric': 'multi_logloss', 'max_bin': 128, 'reg_lambda': 3, 'bagging_fraction': 0.66, 'colsample_bytree': 0.7, 'min_data_in_leaf': 1 } { 'Learning_rate':0.1, 'depth': 3, 'loss_function': 'MultiClass', 'colsample_bylevel': 0.7, #'boosting_type': 'Plain', } LightGBM boosting_typeを指定しない場合はデフォルトで Ordered Boostingが使われる。
  30. 実験結果 モデル Weighted LogLoss (10 Fold CV) CatBoost + Ordered

    Boosting 0.6286 CatBoost + Plain Boosting 0.6647 LightGBM 0.6480 ⦁ 確かにOrdered BoostingによってCVが大きく改善 ⦁ この実験設定では、CatBoostがLightGBMよりも良かった ◦ 使う特徴量によっては逆になることもあるよう(相性?) LBは計算が間に合いませんでした。ごめんなさい … ※特徴量は200個、Extra-Galactic側の9クラスのみモデリング
  31. CatBoost /w Ordered Boosting Confusion Matrix CatBoost /w Plain Boosting

    特に難しいClass42/52あたりの精度がOrdered Boostingによって改善している。