返回列表

27th Place Solution (8th in Public): 1DCNN for share and ChemBERTa for non-share

616. NeurIPS 2024 - Predict New Medicines with BELKA | leash-BELKA

开始: 2024-04-04 结束: 2024-07-08 药物研发 数据算法赛
第 27 名解决方案(公开榜第 8 名):共享目标使用 1DCNN,非共享目标使用 ChemBERTa

第 27 名解决方案(公开榜第 8 名):共享目标使用 1DCNN,非共享目标使用 ChemBERTa

作者: shina

团队成员: Shizuku, shina, kyu999, S_Kikuchi

发布时间: 2024-07-10

竞赛排名: 第 27 名

我们对共享和非共享目标采用了不同的策略。

1. 非共享目标部分

CV 策略

分割是基于构建块(building blocks)进行的,正如我们在这个有用的笔记本中看到的那样。每个构建块被排序后系统性地采样,以避免采样不平衡。

模型

我们使用 ChemBERTa-10M-MTR 作为每个蛋白质的基础模型。

训练

微调:

  • 对于所有蛋白质:我们使用 400 万采样数据对每个模型进行微调。
  • 我们使用 400 万样本对每个相应蛋白质的模型进行了微调。
  • 对于 sEH 三嗪核心(Triazine core):我们使用了混合数据集,一半数据来自外部来源,一半来自常规训练数据。
  • 对于 sEH 非三嗪核心(NonTriazine core):我们使用了 exclusively 在包含各种核心的外部数据上训练的数据集。选择这种方法是为了 potentially 提高对未知核心的预测。
  • 防止过拟合:为了减轻过拟合,我们冻结了 ChemBERTa 模型前三层的权重。

集成方法

  • 对于大多数蛋白质:我们测试了三种集成方法 - 简单平均、CV 加权平均、以及 CV 加权平均的 5 次方。我们选择了 CV 加权平均的 5 次方,因为它产生了最高的 LB 分数。

    集成方法 公开榜 私有榜
    简单平均 0.486 0.272
    CV 加权平均 0.488 0.271
    CV 加权平均^5 0.496 0.266
  • 对于 sEH 非三嗪核心:我们使用了三个不同种子运行的简单平均集成。

性能:我们非共享目标模型的最终公开榜分数(mask share)为 0.173。

2. 共享目标部分

对于共享目标,我们使用了 1DCNN 模型,改进了 Kaggle 公开笔记本

CV 策略

我们使用了由 StratifiedKFold 生成的 5 折分割。使用了所有训练数据。

模型

  • 增加了滤波器数量(32 到 64,每层翻倍)
  • 增强了卷积层(padding='same',变化的核大小)
  • 添加了 BatchNormalization
  • 引入了快捷连接(shortcut connections)和注意力机制(Attention mechanism)
  • 调整了 Dropout 率(0.1 到 0.2)
  • 修改了全连接层
    1DCNN 模型结构图

训练

  • 增加了 epoch 数量(20 到 30)
  • 减少了 ReduceLROnPlateau 的 patience(5 到 3)
  • 允许轻微过拟合

这些改进旨在故意让模型稍微过拟合,使其能够更深入地学习共享目标数据并提高分数。这种策略允许模型捕捉训练数据的更详细特征,从而提高预测性能。

分数

我们比较了 15 折中 fold0 的 LB 分数以评估我们的模型改进。结果如下表所示:

模型 公开榜 私有榜
原始笔记本模型 0.359 0.217
改进模型 0.387 0.220

这些结果证明了我们改进策略的有效性。通过增加模型复杂度和允许更深层次的学习,我们显著提高了公开榜上的分数。
通过这一单折比较确认改进后,我们 proceeded 我们的最终策略:

  • 我们创建了一个新的 5 折模型,与用于比较的 15 折模型分开。
  • 我们将改进的模型架构应用于所有 5 折。
  • 最后,我们使用这 5 折创建了一个平均集成以生成最终预测。

我们 5 折集成 1DCNN 模型在公开榜(mask nonshare)上的最终性能为 0.347。
这种方法允许我们利用模型改进的好处,同时利用集成技术进一步增强我们的预测。

最终模型性能:

榜单 共享 (Mask NonShare) 非共享 (Mask share)
公开榜 0.347 0.173
私有榜 0.224 0.059

尝试过但效果不佳的方法

  • 共享和非共享的 Stacking 方法(为每个蛋白质构建了一个模型)
    • 模型:共享目标使用 1DCNN, LGBM2, ChemBERTa;非共享目标使用 ChemBERTa, 1DCNN, LGBM1, 和 LGBM2(LGBM1 使用 morgan4+rdkit+descriptors 和所有数据进行训练,LGBM2 使用 ECFP6 和 10M 数据进行训练,其他使用 10M 数据进行训练)
  • 步骤:
  1. 通过使用每个模型,进行交叉验证的每折预测,成为 x。竞赛组织者提供的训练数据中的结合值成为 y。使用 Catboost 作为 stacking 模型,因为 Catboost 是处理类别数据(如 bb)的好方法。(但实际上,我们没有使用 bb 作为输入...)
  2. 为了预测提交数据的结合值,使用每个模型预测的测试数据结合值作为 x。
  3. 最后,合并共享和非共享的预测。

其他...

  • 基于骨架探索, 搜索了非三嗪核心 并且,训练了没有核心的训练数据但效果不佳。(模型 = ChemBERTa, 公开榜=0.281 私有榜=0.161) (请忽略我们笔记本中的评论,只是复制了原件并参考了代码。)
  • Catboost 用于 stacking 也为蛋白质使用了一个模型,但效果不佳 (1 折 CV BRD4: 0.326 HSA: 0.138 sEH: 0.680 )
  • 小规模样本实验
    • 特征添加:在 LGBM 模型中添加了化学属性作为特征, alongside 分子指纹。
    • 指纹比较:比较了多种类型分子指纹的性能。
    • ECFP 半径优化:调查并确定了 ECFP 的最佳半径。
    • 泛化性能:验证了使用 sEH 外部数据来增强模型的泛化性能。
    • 数据过滤影响:检查了通过使用读取计数过滤 sEH 外部数据对模型精度的影响。
    • 嵌入替换:用 Malformer 嵌入替换分子指纹以评估性能变化。
    • 数据增强:评估了使用 SMILES 枚举生成的增强数据的有效性。
    • 模型比较:比较了原始模型 ChemBERTa (10M smiles) 与更新模型 ChemBERTa2 (77M smiles) 的性能。

致谢

我们要感谢 Kaggle 组织了如此有趣的比赛。我们也感谢 @ahmedelfazouan@tetsuya3510 分享了影响我们解决方案的笔记本。非常感谢我的队友 @kyu999, @shunsukekikuchi, 和 @kokishinbara 的奉献、合作和不懈的努力。如果没有他们的辛勤工作和团队合作,我们的成就将是不可能的。

同比赛其他方案