642. CIBMTR - Equity in post-HCT Survival Predictions | equity-post-HCT-survival-predictions
首先,祝贺最终在这场竞赛中“幸存”的队伍,并感谢在论坛中分享经验和提供帮助的参与者。
我也独立训练了分类器和回归器模型,然后将它们与一个魔法函数结合起来,就像第 2 名和第 4 名的解决方案一样。主要思想是,当患者具有高的 efs == 0 概率时,我们应该给他们一个高分。否则,我们应该给他们一个相对较低的分数,并更多地关注 efs_time 的排名。因此,回归器只需要关注 efs == 1 的排名任务。
这里是简化的 代码。
y_combine = data['efs'].astype('str')+'|'+data['X']['race_group'].astype('str')
skf = StratifiedKFold(n_splits=10, shuffle=True, random_state=888)
skf.split(X,y_combine)
P(efs=0)| 模型 | AUC |
|---|---|
| lightgbm | 0.7603 |
| catboost | 0.7617 |
| xgboost | 0.7606 |
| nn | 0.75902 |
| tabm | 0.7596 |
| gnn | 0.7591 |
| ranknn | 0.7598 |
| ranktabm | 0.7597 |
| rankgnn | 0.7586 |
按 efs 分组并归一化排名
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)
XGBoost, LightGBM, CatBoost (NN 类模型对我来说效果不好,如果有人成功使用了 NN 类模型,请告诉我。)
efs==1 样本上的性能。在 LB 数据上进行推理时设置 efs=1。efs==1 和 efs==0 应用样本权重,比例为 0.6:0.4efs==1 的样本上训练回归器。当使用这个模型对 efs==0 的样本进行推理时,它仍然显示出预测和 ground truth 之间明显的相关性。这很奇怪,因为由于各种可能导致数据删失的原因,efs==0 的 efs_time 是没有意义的。我猜这是因为 SurvalGAN 算法。顺便说一句,事实证明 efs==0 和 efs==1 的样本之间存在相似的模式。因此,通过添加 efs==0 的样本,回归器在 efs==1 上的性能显著提高!efs==1 上的原始一致性指数 (Concordance Index)| 模型 | C-index |
|---|---|
| xgboost | 0.770229 |
| lightgbm | 0.767615 |
| catboost | 0.769340 |
def model_merge(Y_HAT_REG,Y_HAT_CLS,a=2.96,b=1.77,c=0.52):
'''
Y_HAT_REG 和 Y_HAT_CLS 需要缩放到 0~1
a,b,c 需要用 optuna 调整
'''
y_fun = (Y_HAT_REG>0)*c*(np.abs(Y_HAT_REG))**(b)
x_fun =(Y_HAT_CLS>0)*(np.abs(Y_HAT_CLS))**(a)
res = (1-y_fun)*x_fun+y_fun
res = pd.Series(res).rank()/len(res)
return res
这是合并函数的样子(没有排名转换),其中 x 是 efs==0 的概率,y 是预测的 efs_time(缩放到 0~1)
创建分类器和回归器之间的组合,然后通过 5 折交叉验证找到合并函数的最佳 (a, b, c),然后获得合并后的预测。
这里是组合的分层一致性指数。忽略合并函数中的排名转换,确信没有泄漏
| 分类器 (cls) | 回归器 (reg) | CV 分层 C-index |
|---|---|---|
| xgboost | xgboost | 0.6938821198444668 |
| xgboost | catboost | 0.693390761259049 |
| xgboost | lightgbm | 0.6920553689042972 |
| catboost | xgboost | 0.6946771227057665 |
| catboost | catboost | 0.6942415329389815 |
| catboost | lightgbm | 0.6928675187239672 |
| lightgbm | xgboost | 0.6935306031275579 |
| lightgbm | catboost | 0.693123814234674 |
| lightgbm | lightgbm | 0.6917244174625249 |
| tabm | xgboost | 0.6943607674628444 |
| tabm | catboost | 0.6936616324722884 |
| tabm | lightgbm | 0.6922428015362854 |
| nn | xgboost | 0.6939542378441973 |
| nn | catboost | 0.6932931191267933 |
| nn | lightgbm | 0.6920700218390199 |
| gnn | xgboost | 0.6940062476514388 |
| gnn | catboost | 0.6932012736212297 |
| gnn | lightgbm | 0.6921340326054011 |
| ranktabm | xgboost | 0.693141398733159 |
| ranktabm | catboost | 0.6927626179572159 |
| ranktabm | lightgbm | 0.6912730733179469 |
| ranknn | xgboost | 0.6944776101013886 |
| ranknn | catboost | 0.6936542865352446 |
| ranknn | lightgbm | 0.6924528052605144 |
| rankgnn | xgboost | 0.6934854451860402 |
| rankgnn | catboost | 0.692783734834767 |
| rankgnn | lightgbm | 0.6916329456191074 |