第一名解决方案
第一名解决方案
作者:Jiayang Gao
发布时间:2020-10-08
首先,非常感谢 Kaggle 团队和斯坦福团队主办这次比赛,以及所有的重新评分工作。非常感谢分享他们的内核和想法的人——我从你们那里学到了很多,也受到了你们的启发。祝贺所有的获奖者!
我的想法主要集中在数据方面(特别是使用伪标签的方式),以及一些特征工程。我在架构方面仍然是一个初学者/学习者——我的最初版本是基于 @xhlulu 的 solid gru baseline。我添加了距离嵌入(将在后面的“特征”部分详细说明),正如 @cpmpml 在 NFL 比赛中所做的那样。在 @mrkmakr 发布了 excellent ae+gnn kernel 之后,我将我的框架与这个内核合并,基本上就是在最后的全连接层之前添加一个 GRU 层。(我个人一直很喜欢阅读 @mrkmakr 的内核。我在 NFL 比赛中通过阅读他的内核开始学习神经网络,我也从这个内核中学到了很多!)
数据预处理和权重
- 我没有使用 SN_filter。相反,我给误差较大的单个位置赋予 Nan 值(从 error>10 和 value/error<1.5 开始——可以通过改变这个来增加多样性)。我编辑了损失函数,以便 Nan 目标在训练期间不会造成损失。在所有 5 个目标中,大约有 20K 个值被标记为 Nan,这比使用 SN_filter 损失的数据要少得多。
- 我计算了序列之间的编辑距离,并基于此进行了聚类(试图逆向工程组织者对数据所做的处理)。我发现许多聚类只包含 1 个序列,但有些聚类包含多达 60 个序列。因此,我决定给出与
1/sqrt(count_in_cluster) 成比例的样本权重。
- 我的样本权重也有利于“更接近”私有数据集的序列。
- 我分配列权重 [0.3,0.3,0.3,0.05,0.05] 以有利于计分列。
数据增强
- 在训练和测试时间都反转序列。如果你也编码序列的开始和结束,这会有更好的效果。
- 目标的随机扰动。由于目标具有测量误差,我根据误差按比例随机扰动目标。
- 我的一些版本使用了 @its7171 的 arnie augmented data。我主要用它来增加多样性。
特征
- 许多其他人讨论的一些基于标准 bpp/配对的特征。
- 用于距离嵌入的“距离”矩阵——它可以计算为序列中的位置差,正如 @mrkmakr 在他的内核中所做的那样,或者也可以计算为调整主要配对后的位置差:例如,如果位置 (5,20) 是一对,那么 5 到 4、6、20 的距离为 1,到 3、7、19、21 的距离为 2——这可以迭代计算。
- 到最近配对位置的距离,以及到最近未配对位置的距离。这是一个非常强的特征,在复杂模型中甚至可能恶化性能,因为(我猜)它阻止模型使用注意力层学习这个特征。然而,在简单模型中,这有很大帮助,并且它提供了多样性。
伪标签(针对私有测试集,以及一个随机生成的数据集)
最后是我最喜欢的部分。我从中获得了至少 80 个基点,如果时间/计算能力允许,可能更多。
- 我一开始尝试对私有数据集和训练集的位置 68-107 进行伪标签。没有成功,这促使我做一些 EDA。然后我意识到我的预测(来自不同的单一模型)在训练集的位置 68-107 和测试集的位置 91-130 有更大的方差。如果我的预测在位置 68-130 更嘈杂,我会非常担心,但标准差直到位置 91 才开始增加。这让我想知道,最后 39 个位置是否是特殊的