返回列表

1st place solution

402. OpenVaccine: COVID-19 mRNA Vaccine Degradation Prediction | stanford-covid-vaccine

开始: 2020-09-11 结束: 2020-10-06 药物研发 数据算法赛
第一名解决方案

第一名解决方案

作者:Jiayang Gao
发布时间:2020-10-08

首先,非常感谢 Kaggle 团队和斯坦福团队主办这次比赛,以及所有的重新评分工作。非常感谢分享他们的内核和想法的人——我从你们那里学到了很多,也受到了你们的启发。祝贺所有的获奖者!

我的想法主要集中在数据方面(特别是使用伪标签的方式),以及一些特征工程。我在架构方面仍然是一个初学者/学习者——我的最初版本是基于 @xhlulusolid gru baseline。我添加了距离嵌入(将在后面的“特征”部分详细说明),正如 @cpmpmlNFL 比赛中所做的那样。在 @mrkmakr 发布了 excellent ae+gnn kernel 之后,我将我的框架与这个内核合并,基本上就是在最后的全连接层之前添加一个 GRU 层。(我个人一直很喜欢阅读 @mrkmakr 的内核。我在 NFL 比赛中通过阅读他的内核开始学习神经网络,我也从这个内核中学到了很多!)

数据预处理和权重

  1. 我没有使用 SN_filter。相反,我给误差较大的单个位置赋予 Nan 值(从 error>10 和 value/error<1.5 开始——可以通过改变这个来增加多样性)。我编辑了损失函数,以便 Nan 目标在训练期间不会造成损失。在所有 5 个目标中,大约有 20K 个值被标记为 Nan,这比使用 SN_filter 损失的数据要少得多。
  2. 我计算了序列之间的编辑距离,并基于此进行了聚类(试图逆向工程组织者对数据所做的处理)。我发现许多聚类只包含 1 个序列,但有些聚类包含多达 60 个序列。因此,我决定给出与 1/sqrt(count_in_cluster) 成比例的样本权重。
  3. 我的样本权重也有利于“更接近”私有数据集的序列。
  4. 我分配列权重 [0.3,0.3,0.3,0.05,0.05] 以有利于计分列。

数据增强

  1. 在训练和测试时间都反转序列。如果你也编码序列的开始和结束,这会有更好的效果。
  2. 目标的随机扰动。由于目标具有测量误差,我根据误差按比例随机扰动目标。
  3. 我的一些版本使用了 @its7171arnie augmented data。我主要用它来增加多样性。

特征

  1. 许多其他人讨论的一些基于标准 bpp/配对的特征。
  2. 用于距离嵌入的“距离”矩阵——它可以计算为序列中的位置差,正如 @mrkmakr 在他的内核中所做的那样,或者也可以计算为调整主要配对后的位置差:例如,如果位置 (5,20) 是一对,那么 5 到 4、6、20 的距离为 1,到 3、7、19、21 的距离为 2——这可以迭代计算。
  3. 到最近配对位置的距离,以及到最近未配对位置的距离。这是一个非常强的特征,在复杂模型中甚至可能恶化性能,因为(我猜)它阻止模型使用注意力层学习这个特征。然而,在简单模型中,这有很大帮助,并且它提供了多样性。

伪标签(针对私有测试集,以及一个随机生成的数据集)

最后是我最喜欢的部分。我从中获得了至少 80 个基点,如果时间/计算能力允许,可能更多。

  1. 我一开始尝试对私有数据集和训练集的位置 68-107 进行伪标签。没有成功,这促使我做一些 EDA。然后我意识到我的预测(来自不同的单一模型)在训练集的位置 68-107 和测试集的位置 91-130 有更大的方差。如果我的预测在位置 68-130 更嘈杂,我会非常担心,但标准差直到位置 91 才开始增加。这让我想知道,最后 39 个位置是否是特殊的
同比赛其他方案