返回列表

2nd Place Solution

642. CIBMTR - Equity in post-HCT Survival Predictions | equity-post-HCT-survival-predictions

开始: 2024-12-04 结束: 2025-03-05 临床决策支持 数据算法赛
第二名解决方案

作者: Ahmet Erdem (及团队成员)

发布日期: 2025 年 3 月 6 日

竞赛排名: 第 2 名

团队成员: Tarik Karakas, Anil Ozturk, Gunes Evitan, Ahmet Erdem, Davut Polat

第二名解决方案

首先,我想感谢我的队友们这段有趣的旅程。

Solution Diagram

既然我们知道数据是合成的以及它是如何产生的,我们查看了 SurvivalGAN 论文。正如你在这张图片中看到的,TimeRegressor 是与特征和类别信息一起训练的。因此我们将问题分为两部分:

  • efs 分类
  • efs_time 回归

对于回归部分,我们训练并集成了 2 个模型,将 efs 作为额外特征提供。然后在测试集和验证集上进行推理时设置 efs=1。通过这个技巧,我们估计如果有 efs,efs 时间可以持续多久。我们的模型是 xgboost 和 histgbm。

对于分类,我们使用 RealMLP, HistGBM 和 Catboost 模型,没有进行特征工程。我们通过 CV 上调优的权重对这些模型进行集成。然后我们将它与回归预测结合来计算风险评分:
R = p(efs=1) * p(efs_time | efs=1)
在我们的案例中,p(efs_time | efs=1)sigmoid(-regression_prediction)

此外,我们训练了一个神经网络来近似竞争指标并直接预测风险评分。它使用树模型的回归预测,并优化近似竞争指标和辅助二元分类损失。

def loss_func(y_risk, y_time, y_efs):
    y_risk, y_time, y_efs = y_risk.ravel(), y_time.ravel(), y_efs.ravel()
    
    loss = []
    for i in range(len(y_risk)):
        if y_efs[i] == 1:
            filt = y_time[i] < y_time
            s = (y_risk - y_risk[i]).tanh()
            loss.append(s[filt])
            
    loss = torch.cat(loss).mean()
    return loss

我们将它与我们的主流程进行排名集成(rank ensemble)。

附录

AutoGluon

一旦像我们那样将问题分为两部分,即使使用自动化机器学习也有可能获得金牌。

以下是我们使用 AutoGluon 的实验结果:

AutoGluon 设置 OOF 分数 公共排行榜 私有排行榜
中等质量 (Medium Quality) 0.6884 0.694 0.697
高质量 (High Quality) 0.6910 0.694 0.698
最佳质量 (Best Quality) 0.6921 0.695 0.699

后处理 (Postprocess)

Anil 尝试通过调整 OOF 预测上的自定义 sigmoid 函数来改进 efs-classifier 模型的输出:

calibrated_proba = 1 / (1 + np.exp(-beta * (raw_proba - gamma)))

这种校准导致 OOF 提高了约 0.002,但导致公共排行榜下降 0.001,私有排行榜提高 0.001。

同比赛其他方案