🏥
CIBMTR上位解法MEMO
コンペの概要
- 造血幹細胞移植(HCT)を受ける患者の生存率を予測する。
- 評価指標はストラティファイド・コンコーダンス指数(C-index)を元にしたもの
- 人種ごとの C-indexの平均-標準偏差が最終的な評価指標
- 特徴量エンジニアリングやターゲット変換、アンサンブルが鍵となったコンペでした。
(割と)共通している手法
-
特徴量エンジニアリング
- あまり特徴量を工夫している解法はほとんどない(target変換などが大事)
- One-hotエンコーディングや、数値特徴量のコピーをカテゴリ特徴量として追加。
-
ターゲット変換
- Kaplan-Meier, Nelson-Aalenを使った
efs_time
の変換
- Kaplan-Meier, Nelson-Aalenを使った
-
分類モデル(Classifier)と回帰モデル(Regressor)の独立トレーニング
- ほぼ全ての上位解法で、
efs
の確率 (P(efs=0)
orP(efs=1)
) を予測する分類モデルと、efs_time
を予測する回帰モデルを分けて学習。
- ほぼ全ての上位解法で、
-
複数のモデルを使用
- XGBoost, LightGBM, CatBoost などの GBDT 系アルゴリズム。
- Neural Networks (TabM, MLP, GNN) の併用(
Pairwise lanking loss
を利用) - AutoML(AutoGluon など)も一部で活用。
-
アンサンブル
- 分類・回帰モデルの予測結果を独自の関数でマージ
- シンプルなweighted ensembleやもありなど
各解法の特徴的な手法
1st Place Solution
- ClassifierとRegressorでそれぞれ推論して、その後独自の関数で両者をマージ
- Classifier
- Pairwise-rank-loss を用いた NN, TabNet, GNN の導入。
- rank-lossを使うと予測値のshiftが起こるので、他のモデルの予測値を使っていい感じに調整
- GNNでは KNN で近傍 25 ノードを見つけエッジとした。そのGraphSAGEを適用(よくわからん...)
- Regressor
efs==1
,efs==0
をそれぞれで特徴量変換して、一緒くたにして推論efs
も特徴量に利用。推論時はefs=1
として推論-
efs=1
で訓練したデータでefs=0
のefs_time
を推論したところ、predictionとtargetに相関があって気づいたらしい(妙だな...🤔) - ↓特徴量の変換方法
efs_time_norm[efs == 1] = efs_time[efs == 1].rank() / sum(efs == 1)
efs_time_norm[efs == 0] = efs_time[efs == 0].rank() / sum(efs == 0)
- ensembleのweightはOptuna で最適化。
- overfitしないようにweightは0~1ではなく 0.1~1で制限。
2nd Place Solution
- ClassifierとRegressorでそれぞれ推論して、その後独自の関数で両者をマージ
- Regressor
efs
も特徴量に利用。推論時はefs=1
として推論
- 評価指標に合わせて独自のLossを使用
3rd Place Solution
- 4-fold CV を 20~100 シードで試行。
-
efs=1
のレコードには[0, 1]
,efs=0
には[1.345, 1.355]
の範囲で一様なターゲットを設定。 -
efs=0
のデータをほぼ定数にすることで、不要な学習を排除。 - 外れ値を除去することで回帰モデルの精度が向上
- logistic modelでのstackingも含めて複数のモデルをマージ
4th Place Solution
- Regressorは
efs=1
のみのデータで学習 - Regressorのtargetは
inverse_normal_cdf(rank%)
でz-score変換。予測後に戻す
5th Place Solution
-
efs
の確率 (a
) を予測するモデル群と、efs=1
のランク (b
) を予測するモデル群を独立して学習し、それらを組み合わせた。-
p = (a * b) - ((1 - a) * S_RATIO)
を使用
-
-
efs_time < 13.326
を「unsafe」と定義し、約2%の異常データを学習から分離。 - 約900個の AutoGluon モデルを統合(
a
とb
に150モデルずつ、追加ターゲットを110モデル)。
6th Place Solution
- 複数の回帰, 分類モデルの結果を one-layer NN (with no non-linearities)でstacking
- stackingではpolynomial feature(2nd-order)も特徴量として使用
9th Place Solution
- GBDT系:
efs=1
のデータのみで Regressorを学習。Clasiffierで出力した確率を掛け合わせる。 - NN系: 全てのデータを使って学習。GBDT Clasiffierの出力(確率) を加算
- 最終的に全てもモデルをrank ensemble
11th Place Solution
- 特徴量エンジニアリングを少々行っている
-
dri_score
andconditioning_intensity
などのOrdinal encodingなど - Crossing donor_age and age_at_hct features to extract some
-
12th Place Solution
- 98のモデルで3層のensembleを適用。
- 第2層では リッジ回帰、ヒルクライミング、AutoGluonを使用。
15th Place Solution
- Kaplan-Meier, Nelson-Aalen, Rank Gauss を試行し、最適なものを選択。
- Rank Gaussはtargetの情報量を落とさないために使用
- GBDT モデルを 30 種類作成し、2回のスタッキングを適用。
-
efs=1
のみのデータ, 全てのデータそれぞれで学習したモデルもアンサンブルで使用
関連書籍
- Kaggleで勝つデータ分析の技術
- Kaggleに挑む深層学習プログラミングの極意 (KS情報科学専門書)
- 実践Data Scienceシリーズ PythonではじめるKaggleスタートブック (KS情報科学専門書)
以上
Discussion