第 27 名解决方案(公开榜第 8 名):共享目标使用 1DCNN,非共享目标使用 ChemBERTa
第 27 名解决方案(公开榜第 8 名):共享目标使用 1DCNN,非共享目标使用 ChemBERTa
我们对共享和非共享目标采用了不同的策略。
1. 非共享目标部分
CV 策略
分割是基于构建块(building blocks)进行的,正如我们在这个有用的笔记本中看到的那样。每个构建块被排序后系统性地采样,以避免采样不平衡。
模型
我们使用 ChemBERTa-10M-MTR 作为每个蛋白质的基础模型。
训练
微调:
- 对于所有蛋白质:我们使用 400 万采样数据对每个模型进行微调。
- 我们使用 400 万样本对每个相应蛋白质的模型进行了微调。
- 对于 sEH 三嗪核心(Triazine core):我们使用了混合数据集,一半数据来自外部来源,一半来自常规训练数据。
- 对于 sEH 非三嗪核心(NonTriazine core):我们使用了 exclusively 在包含各种核心的外部数据上训练的数据集。选择这种方法是为了 potentially 提高对未知核心的预测。
- 防止过拟合:为了减轻过拟合,我们冻结了 ChemBERTa 模型前三层的权重。
集成方法
性能:我们非共享目标模型的最终公开榜分数(mask share)为 0.173。
2. 共享目标部分
对于共享目标,我们使用了 1DCNN 模型,改进了 Kaggle 公开笔记本。
CV 策略
我们使用了由 StratifiedKFold 生成的 5 折分割。使用了所有训练数据。
模型
- 增加了滤波器数量(32 到 64,每层翻倍)
- 增强了卷积层(padding='same',变化的核大小)
- 添加了 BatchNormalization
- 引入了快捷连接(shortcut connections)和注意力机制(Attention mechanism)
- 调整了 Dropout 率(0.1 到 0.2)
- 修改了全连接层

训练
- 增加了 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 数据进行训练)
- 步骤:
- 通过使用每个模型,进行交叉验证的每折预测,成为 x。竞赛组织者提供的训练数据中的结合值成为 y。使用 Catboost 作为 stacking 模型,因为 Catboost 是处理类别数据(如 bb)的好方法。(但实际上,我们没有使用 bb 作为输入...)
- 为了预测提交数据的结合值,使用每个模型预测的测试数据结合值作为 x。
- 最后,合并共享和非共享的预测。
共享 公开榜:0.506→0.496, 私有榜 0.261 → 0.253
非共享 公开榜 0.506 → 0.497, 私有榜 0.261 → 0.263
我们尝试了一些基于图的方法,GCN, 3DGNN (Sphere),但对我们不起作用。
我们还尝试了通过 SMILES 字符串枚举调整嵌入,但不起作用。
其他...
- 基于骨架探索, 搜索了非三嗪核心 并且,训练了没有核心的训练数据但效果不佳。(模型 = 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 的奉献、合作和不懈的努力。如果没有他们的辛勤工作和团队合作,我们的成就将是不可能的。