🏥

CIBMTR上位解法MEMO

2025/03/08に公開

コンペの概要

  • 造血幹細胞移植(HCT)を受ける患者の生存率を予測する。
  • 評価指標はストラティファイド・コンコーダンス指数(C-index)を元にしたもの
    • 人種ごとの C-indexの平均-標準偏差が最終的な評価指標
  • 特徴量エンジニアリングやターゲット変換、アンサンブルが鍵となったコンペでした。

(割と)共通している手法

  • 特徴量エンジニアリング
    • あまり特徴量を工夫している解法はほとんどない(target変換などが大事)
    • One-hotエンコーディングや、数値特徴量のコピーをカテゴリ特徴量として追加。
  • ターゲット変換
    • Kaplan-Meier, Nelson-Aalenを使った efs_time の変換
  • 分類モデル(Classifier)と回帰モデル(Regressor)の独立トレーニング
    • ほぼ全ての上位解法で、efs の確率 (P(efs=0) or P(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=0efs_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 モデルを統合(ab に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 and conditioning_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のみのデータ, 全てのデータそれぞれで学習したモデルもアンサンブルで使用

関連書籍

以上

Discussion