返回列表

18th place with only Kaggle and free Colab

485. NBME - Score Clinical Patient Notes | nbme-score-clinical-patient-notes

开始: 2022-02-01 结束: 2022-05-03 临床决策支持 数据算法赛
仅使用 Kaggle 和免费 Colab 获得18名

仅使用 Kaggle 和免费 Colab 获得18名

作者:Michal (MASTER) | 比赛排名:18th

首先,非常感谢 NBME 和 Kaggle 组织了如此有趣的比赛。

我写这篇文章主要是为了证明,即使是在像这样的比赛中,不拥有或租用昂贵的 GPU 也能获得不错的结果。我在免费 Colab(T4 gpu)上进行了大部分实验,使用的是数据子样本和较小的模型。当某些想法看起来有希望时,我会用更大的模型和更多的数据来测试,最终在 Kaggle 上训练并测试了一个完整的 fold。

因为我的实验资源有限,我查阅了 NBME 比赛的所有讨论,并阅读了类似比赛的解决方案,以找出哪些方法有效,所以我要感谢所有在讨论中分享知识的人。这是我第一次参加 NLP 比赛,如果没有 Kaggle 社区,我不可能取得这么好的成绩。

对我有效的方法:

  • 保留换行符 - 按照此处描述的方法修改分词器。
  • 将文本和特征转换为小写。
  • 为换行符添加额外的 token:["\r", "\n", "\t"]。
  • 为一些缩写添加额外的 token:["cc","hpi", "pmhx", "pmh", "rx", "fhx", "shx", "phi", "meds", "sh", "fh", "ros", "psh", "hx", "pshx", "fmhx"]。
  • MLM 预训练(1 个 epoch,0.2 掩码概率,约 70% 准确率)。
  • 伪标签。
  • 来自 Roberta strikes back 的后处理修复空格方法。

我的模型集成

我的集成模型有点像大杂烩,因为我没有资源重新训练模型,所以我只能利用现有的资源:

  1. deberta-v3-large (公榜: 0.888, 私榜: 0.890) - 权重: 0.4
    5 折,分词器不删除换行符,小写,添加 token,MLM 预训练并在伪标签(20k 样本)上微调。
  2. deberta-large-mnli (公榜: 0.885, 私榜: 0.886) - 权重: 0.2
    在 95% 的训练数据上训练,分词器不删除换行符,小写,添加 token,MLM 预训练并在伪标签(20k 样本)上微调。
  3. deberta-v3-large (公榜: ???, 私榜: ???) - 权重: 0.4
    5 折中的 2 折(GPU 时间耗尽),普通分词器,无额外 token,MLM 预训练并在伪标签(20k 样本)上微调。

模型 1 和 2 使用了从所有模型(1、2、3)平均得出的伪标签,这提升了 CV(可能是泄露)和单模型分数,但在集成中的效果没有我预期的那么好。因此,对于模型 3,我只使用了它自己预测的伪标签(跨 fold 平均),这提升了 CV(泄露)、单模型分数,并且我认为对集成的帮助更大。

最终预测是模型字符级预测的加权和,并进行了后处理以修复空格。

同比赛其他方案