Kaggle-cmi

对于艾老师博客的补充,方便我个人理解与使用。


Kaggle: CMI睡眠检测前排方案万字总结

数据预处理:

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得分的模型只要与之前考虑的模型相比是异构的,仍然可以提高最终性能。

  • 19
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值