【Kaggle日记】呼吸机压力预测 2021-11-09

谷歌呼吸机压力预测比赛
参考:
数据探索
特征解释u_in和pressure
特征解释R和C
金牌方案总结
#1方案 LSTM + PID
#2方案 Inverse of a PID
安全吗?

数据集和任务

训练数据集包括600多万次记录,
一共是七万多次呼吸过程,每次呼吸都是80次记录。
特征中,R(Resistance),C(Capacitance)两个是和肺部相关的数值特征,分别只有3个和2个取值,代表肺部的狭窄程度和肺部的可伸缩性。而u_in 代表了控制的空气输入量,u_out(0或1)代表吸气还是呼气过程,预测的目标是压力。

简化示意图,来源参考3

每次呼吸的time step从0开始,间隔上有很小的区别,持续两秒多的时间。对于一次呼吸来说(肺部特征一定),pressure取决于所有过去的u_in,而u_in取决于过去以及当下的pressure。

u_in是一个连续数值特征。u_out在呼吸过程中先是0,然后在25到32的时间步长中变为1。 也就是从吸气到呼气的过程。

值得注意的是,压力值只存在950个离散值, 所以后续处理除了取Median or mean以外,还可以取最近的这950个可能的值,稍微提升模型表现。 另外估计某个时间点的压力值时,可以使用这个点之后也就是未来的u_in特征。这看起来似乎不合理,原因是这里搭建的模型,是用来模拟真实场景,服务于研究人员设计新的呼吸机控制器。所以不一定要能够在呼吸过程中预测出压力。

金牌方案

首先大部分团队选择作为回归任务来处理,不过也有把他当成分类任务(950个离散值),而取得很好的成绩的。

神经网络模型全胜 ~ 高分方案中完全没有树模型的身影。毕竟特征比较少(NN可以自己提取特征),而数据集又足够大。其中大部分使用的是LSTM模型(4到5层),框架和平台以Tensorflow和TPU为主。使用pytorch训练的时间则要更长一些,而且同样的模型,用pytorch训练却达不到Tensorflow的效果,这可能是两个框架初始化的方法不一样,于是@junkoda在pytorch中复现了Tensorflow的初始化方法,成功缩小了差距。另外,训练时长似乎在这场比赛中很关键,冠军团队训练了整整2500个epoch。

这里顺便插播一篇挺有意思的论文,描述了Grokking现象,简单来说就是复杂的模型虽然可能会难以训练成功,但是当过拟合发生后,如果训练时间足够长的话,却能够在某个时间点忽然开窍,成功泛化。这有点像双下降现象, 不过双下降是对于参数量而言的,也许两者之间有紧密的练习。有趣的是,作者说这篇论文的起因是同事忘记关电脑度假去了。无论如何,以后可以试试不使用earlystop,看看会不会有奇迹发生。

Grokking现象

另外,UnderPressure团队使用了Transformer,把时间步长当作特征,因此也不需要位置编码。

还有让我觉得很惊艳的是,头几名中大部分团队都用到一个技巧。
那就是他们找到了主办方团队的论文,比赛用的数据集其实是用结合神经网络和PID控制的呼吸机采集的。所以,他们就想办法把这个PID控制器的参数给破解了,冠军团队甚至连添加的噪声都找到了,靠这个后处理方法他们完美匹配了66%的预测。

特征

特征包括以下三类以及他们的混合:

  1. 原始特征 :
    冠军团队仅使用了原始特征和LSTM就取得了很好的效果。
  2. 手工生成的特征
  3. Conv1D生成的特征。

auxiliary-loss

似乎对模型提升有很大帮助,大部分高分团队都使用了压力(目标p_i)或者其差值(比如p_i - p_i-1)作为辅助损失,也有一支队伍使用的过去压力之和。


预处理

  1. Scaling: 大部分团队使用了Robust Scaling,也有小部分只使用了 np.log1p。
  2. 数据增广:第三名Upstage团队使用了一些数据增广方法,其中MixUp效果比较显著。
  3. Pseudo-labels

集成

KFold和StratifiedCV一般情况下没什么区别,不过StratifiedCV总不会比Kfold差,另外高分团队取的折数都较多,10~15+。

其他

State-of-the-art Deep Learning library for Time Series and Sequences:
https://github.com/timeseriesAI/tsai

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容