586. Child Mind Institute - Detect Sleep States | child-mind-institute-detect-sleep-states
祝贺Kaggle和主办方举办这次比赛,这是一次非常有趣且充满挑战的比赛。在开始之前,特别感谢@kyakovlev,能够与你合作并向你学习是一次非凡的经历。
1. 预处理
2. 训练(GRU + UNET + LGB)
3. 推理和后处理

对于最终提交,我们的GRU + UNET模型仅使用7个特征。我们尝试添加更多特征,但本地验证中没有发现有效的特征。
我们决定将序列划分为单日序列,并将粒度从5秒降低到30秒。因此,我们得到了长度为2880的序列,其中通常包含入睡和醒来事件。以下是模型的典型输入:

将anglez变为绝对值,这在本地验证中提升了+0.002。
对于仅有的两个变量(anglez和enmo),我们尝试寻找有用的聚合特征(diff、mean、median、skew等),但只有标准差(anglez_abs_std和enmo_std)有效。
检测噪声是我们解决方案的另一个关键点。我们发现在同一序列中相同小时、分钟和秒重复完全相同的值时,这基本上是噪声。图中红线表示我们检测到的噪声:

为了将时间信息融入模型,我们决定在小时-分钟级别添加2个频率编码变量(一个用于入睡,一个用于醒来)。
一个好的增强技巧是在训练期间反转所有序列,这使我们能够获得更多序列,并将本地验证提升了0.01。
整个比赛过程中,公开排行榜让我们非常困惑,我们甚至怀疑代码中存在错误。因此,在比赛进行到一半时,我们研究了每个变量在排行榜上的表现,结果如下:

我们的最佳模型是GRU,单独在本地验证中得到了0.835的分数。
比赛结束后,我们发现私有排行榜与本地验证的相关性比公开排行榜更高。公开排行榜存在不稳定性,这让我们非常困扰,因为我们真的以为代码中存在错误。
我们最佳的私有提交是这个集成模型:(GRU*0.68 + UNET * 0.2 + LGB*0.12)
CV: ~0.840 / 公开LB 0.784 / 私有LB 0.848
自从组队以来,我们一直试图让LGB具有竞争力。我们终于在比赛结束前一天开始让它对集成模型有所贡献。因此,我认为在这一部分我们本可以再花几天时间来进一步优化LGB模型。
无论如何,在我们最后一次提交中,可以看到它为私有排行榜贡献了+0.002的提升。
单个LGB模型达到的最高分数是:公开0.757 / 私有0.82。
对于我们最终选择的最佳提交,我们集成了多个模型(8个GRU和2个UNET)。
推理运行时间约为1.5小时。
对于后处理,我们尝试了多种方法,但基本上我们所做的就是按照针对预测优化的特定距离保留峰值。
当然,我们可能会遗漏一些内容,所以欢迎随时提问,我会更新帖子。
这是一个可以用多种方式解决的问题,正如我们在不同解决方案中所看到的。我们要提到这是一场真正具有挑战性的比赛,与其他团队的持续竞争将我们推向了极限(一切都非常激烈)。除此之外,我们希望我们能够帮助实现主办方的使命并为其提供有用的帮助。
GitHub代码地址:https://github.com/FNoaGut/child-mind-institute-detect-sleep-states-3rd-place-solution