u++の備忘録

Kaggle「WiDS Datathon 2020」コンペ解法まとめ

先日まで参加していたKaggle「WiDS Datathon 2020」コンペの解法まとめです。「検査データから1週間後の生死を当てる」というシンプルなテーブルコンペでした。本記事では、自分の復習用にザッとまとめたメモを共有します。

Place Link
1 https://www.kaggle.com/c/widsdatathon2020/discussion/133189
2 https://www.kaggle.com/c/widsdatathon2020/discussion/132387
3 https://www.kaggle.com/c/widsdatathon2020/discussion/132292
4 https://www.kaggle.com/c/widsdatathon2020/discussion/132312
5 https://www.kaggle.com/c/widsdatathon2020/discussion/132267
6 https://www.kaggle.com/c/widsdatathon2020/discussion/133509
7 https://www.kaggle.com/c/widsdatathon2020/discussion/132301
14 https://www.kaggle.com/c/widsdatathon2020/discussion/132225
16 https://www.kaggle.com/c/widsdatathon2020/discussion/134391
21 https://www.kaggle.com/c/widsdatathon2020/discussion/132451
22 https://www.kaggle.com/c/widsdatathon2020/discussion/132302
24 https://www.kaggle.com/c/widsdatathon2020/discussion/132262
61 https://www.kaggle.com/c/widsdatathon2020/discussion/133428
132 https://www.kaggle.com/c/widsdatathon2020/discussion/132674

f:id:upura:20200229122426p:plain https://www.kaggle.com/c/widsdatathon2020/leaderboard

1位

探索的データ分析(EDA)、欠損値補完、特徴選択、モデリング、アンサンブルの一連の観点で、多種多様なやり方を試していました。

  • 欠損値をさまざまな形で活用した
    • 欠損値フラグ
    • XGBoostで予測
    • 統計値で補完
  • EDAに基づく特徴量エンジニアリング
  • さまざまな特徴選択を試した
  • モデリング
    • Boosting trees (Catboost, Xgboost, Lightgbm, h2o GBM)
    • Scikit learn (KNN, Logistic Regression, Random Forest, Extremely Randomized Trees, Histogram-Based Gradient Boosting)
    • Deep learning models (Pytorch and Tensorflow)
    • Pystacknet
  • Pseudo Labeling
  • Test Time Augmentation (TTA)
    • 年齢や性別などを変更した結果をアンサンブル

2位

2位チームは、privateで大きく順位を上げていました。

  • 前処理: 検査項目の最大値・最小値に関する特徴量のデータ修正
    • 今回のデータには、最大値よりも最小値が大きいものが少なからず存在していた(discussion)
  • 集約系の特徴量を思考停止で作ると特徴量が増えて過学習につながるので注意深く追加した
  • 欠損値はLightGBMで予測。単純に補完するのではなく、別の特徴量として追加したほうが良かった
  • 単純な KFold を利用。fold数は、CVとLBスコアを見て8に決めた
  • 特徴量数(200〜1500)や前処理方法を変えたLightGBMモデルを複数作った
  • XGBoostやロジスティック回帰も含めて、26モデルをアンサンブル
  • 効かなかったこと: Frequency encoding、Target encoding、相関や検定に基づく特徴選択、Stratified KFold、Pseudo Labeling
  • GitHub: GitHub - oleg-panichev/WiDS-Datathon-2020-Second-place-solution: WiDS Datathon 2020 Second place solution

3位

  • 既存の特徴量の削除
    • 特にfeature importanceが上位に来る apache_4a_hospital_death_probapache_4a_icu_death_prob を削除している点が驚き
    • feature importanceは高いが、過学習を引き起こしているとのこと
  • 前処理: 検査項目の最大値・最小値に関する特徴量のデータ修正
  • Pseudo Labeling
  • 最終モデルは3モデルの重み付き平均
    • 60%: LightGBM + categorical_features
    • 20%: LightGBM + One hot encoding
    • 20%: Neural Network (Notebook)
  • Repeat Stratified KFold

4位

  • 特徴量エンジニアリングはかなり簡素で、最大値と最小値の差の特徴量の追加など
  • 最終モデルは3モデルの重み付き平均
    • 35%: LightGBM
    • 50%: LightGBM + Pseudo Labeling
    • 15%: 4層MLP

5位

  • LightGBMの複数モデルのアンサンブル (Notebook)
    • 'boosting_type': 'goss'
    • train, testの一部のだけで共通していたid系の特徴量の活用

6位

  • XGBoost2+LightGBM1のアンサンブル
  • id系や apache_4a_hospital_death_probapache_4a_icu_death_prob の削除
  • 前処理: 検査項目の最大値・最小値に関する特徴量のデータ修正

7位

  • id系やadversarial validationで上位に来た特徴量の削除
  • Repeating Stratified kfold with k == 5 and 10 repeats
  • trainとtestを結合した後にFrequency encoding
  • 効かなかったこと: Target encoding、「最大値<最小値」フラグ追加

14位

upura.hatenablog.com

21位

  • XGBoost、CatBoost、AdaBoostのアンサンブル

22位

  • BayesianRidgeで7モデルをstacking
    • LightGBM: dart, goss, rfの3種類
    • XGBoost: 片方は「Imbalance-Xgboost
    • Neural Network: カテゴリ変数の処理がembedding層かOne hot encodingか
  • id系カラムへのFrequency encoding、検査項目の最大値・最小値に関する特徴量のデータ修正、ageなどのbinningが効いた

24位

  • 2種類のモデルでアンサンブル
    • h2o.AutoML (15 models and 10 folds)
    • LightGBM tuned by GBRT, with Repeated Stratified KFold (4 splits, 10 repeats)

61位

  • 3時間チャレンジらしい
  • LightGBMの5fold

132位

上位4%から14%までprivateで落ちてしまった方の取り組みで、CVの重要性を教訓として語っています。個人的には、決して上位でなくとも取り組みを共有するのは素晴らしいことだと思っています。

おわりに

本記事では、Kaggle「WiDS Datathon 2020」コンペの解法まとめを掲載しました。