首先,我们要感谢 Kaggle 团队和主办方举办这场精彩的比赛。此外,我们也感谢那些分享了出色 notebooks 和深刻见解的人们。
遗憾的是,我们未能获得金牌,但我们将简要介绍我们的解决方案。
- 模型
自定义 DNN(基于 此 notebook)
我们训练了 4 折(共 100 折交叉验证)的 DNN,并通过简单平均进行集成。
我们尝试了 RNN、LSTM 或 transformer,但由于时间和计算资源有限,未能使它们奏效。 - 数据
我们根据 auxiliary、有效时间窗口和电荷,为每个事件选择 200 个脉冲。 - 特征
基于小数据实验,我们选择 [x, y, z, time, charge, auxiliary, valid_time_window, string, qe, scatter, absorption] 作为输入特征。也许其中一些特征在大数据训练中并不必要,因为模型可以从数据中隐式地学习它们。但我们没有足够时间验证,因此将其保留。 - 预测
我们让模型预测中微子来自的方向 (x, y, z) 以及它们去往的方向。在训练期间,我们对两者分别计算损失。在推理时,我们将其中一个方向翻转,取平均值,得到一个 (x, y, z) 方向。 - 损失函数
我们使用了 VonMisesFisher3DLoss。我们尝试了其他损失函数或分箱与分类方法,但该损失函数效果最佳。 - 其他
我们使用 polars 进行数据处理。处理速度非常快,我们最佳得分的提交仅耗时约 30 分钟。
这是一个遗憾,但我们仅用 GNN 和少量努力就获得了相当不错的分数,并持续改进分数。阅读排名靠前队伍的解决方案后,我们认为应该拓宽视野,尝试多种解决方案。
株式会社Rist 和 株式会社ScrumSign 作为赞助商支持了 KaiRA 及其所属学生的学习,在此表示诚挚感谢。我谨代表 KaiRA 致以谢意。