对于艾老师博客的补充,方便我个人理解与使用。
数据预处理:
EDA:探索性数据分析。
查看我们要预测的是label,所以查看label的分布,有助于我们加一些正则项或者帮助我们理解数据的分布。
查看序列label的分布——发现序列缺失比较严重,甚至有很多没有任何label的段——发现有很多序列的中段和尾段没有label,怀疑是设备“空转”造成的(采集任务没有打开)。
由于序列缺失严重——我们怀疑序列是不是非常的杂乱,而与我们理想中的”一个onset对应一个wakeup,且睡眠时间基本集中在晚上与中午“的情况不相符。——看了一下label的序列,是不是存在o-o-w或者o-w-w的情况,这样的情况说明一些睡眠片段仅标记onset和wakeup。这是一个很不让人难受的消息!!
由于label出现了让人头大的分布,我们就将目光投向了其他特征,发现enmo的值也存在异常,会有很多片段出现常值,这不是我们所期待的。因为常值就意味着这部分的序列中该特征与对应的label没有关系,他们之间的关系的建模更是无从下手。
总的来说,EDA的结果表明,赛方给的数据集不够干净,特征与label的关系也不够清晰。但这也是这次比赛的一个难点,让整个工程对数据的泛化能力更强。毕竟应用场景是小孩子的睡眠,不可控因素过多。
针对此,我们做了一些尝试:
在训练集中提出了缺失率过高的序列;
对后半段趋势严重的序列,进行截断;
将upper clip enmo 设为 1 。(为啥来着?)
最后方案为:
将所有数据集分5折。对于每个fold,作为训练集时将缺失率过高的序列筛除,作为验证集不做筛选。
特征工程:
1.传感器特征:enmo和anglez特征。
将enmo和anglez特征进行平滑和一阶差分,再求绝对值。
2.时间特征:小时,日,周等。
对各种事件特征数据使用sin和cos函数的实现循环。
很奇怪的是:根据我们在eda中发现的 “周末与周中的onset和wakeup的时间存在偏移(周末睡得晚,起得晚)” 这一现象,我们将“是否是周末”这一特征加入模型,发现效果反而有下降,这是违反我们直觉的。
不同阶数的差分,滚动窗口,anglez和enmo的交互特征等特征工程并没有带来分数的提升。
模型:
采用了模型融合的方案,融合方案是在输出预测概率层面进行融合。后面会详细的介绍。
我们采用的方案有
我们引入了一个新的输出特征:asleep。将onset和wakeup进行匹配,形成一个个sleep事件。再将“是否睡眠的状态”作为一个新特征。
模型的输出为asleep onset wakeup。
后处理:
通过寻找概率峰值,判断label的位置。——还存在一个”如何合理地匹配onset和wakeup成事件“的问题,还有不同睡眠事件的重叠部分。——应该信任哪一个事件呢?也就是应该信任哪一个组合呢?——单纯使用onset和wakeup的score之和,是一个方案。但过于暴力,在一些重叠度比较高的窗口之间无法做出有效的区分。——NMS 极大值抑制,可以消除高IOU (高重叠比)的一些冗余窗口(事件)。
NMS的通俗来讲就是抑制非极大值,保留极大值。
然后通过optuna进行寻参(寻的是find_peaks 和 NMS 两个后处理中的参数)。
模型组合:
把各模型输出的输出概率进行平均,然后再送到后处理方法中以检测事件。
一个教训:第cv得分的模型只要与之前考虑的模型相比是异构的,仍然可以提高最终性能。