谷歌呼吸机压力预测比赛
参考:
数据探索
特征解释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)代表吸气还是呼气过程,预测的目标是压力。
每次呼吸的time step从0开始,间隔上有很小的区别,持续两秒多的时间。对于一次呼吸来说(肺部特征一定),pressure取决于所有过去的u_in,而u_in取决于过去以及当下的pressure。
值得注意的是,压力值只存在950个离散值, 所以后续处理除了取Median or mean以外,还可以取最近的这950个可能的值,稍微提升模型表现。 另外估计某个时间点的压力值时,可以使用这个点之后也就是未来的u_in特征。这看起来似乎不合理,原因是这里搭建的模型,是用来模拟真实场景,服务于研究人员设计新的呼吸机控制器。所以不一定要能够在呼吸过程中预测出压力。
金牌方案
首先大部分团队选择作为回归任务来处理,不过也有把他当成分类任务(950个离散值),而取得很好的成绩的。
神经网络模型全胜 ~ 高分方案中完全没有树模型的身影。毕竟特征比较少(NN可以自己提取特征),而数据集又足够大。其中大部分使用的是LSTM模型(4到5层),框架和平台以Tensorflow和TPU为主。使用pytorch训练的时间则要更长一些,而且同样的模型,用pytorch训练却达不到Tensorflow的效果,这可能是两个框架初始化的方法不一样,于是@junkoda在pytorch中复现了Tensorflow的初始化方法,成功缩小了差距。另外,训练时长似乎在这场比赛中很关键,冠军团队训练了整整2500个epoch。
这里顺便插播一篇挺有意思的论文,描述了Grokking现象,简单来说就是复杂的模型虽然可能会难以训练成功,但是当过拟合发生后,如果训练时间足够长的话,却能够在某个时间点忽然开窍,成功泛化。这有点像双下降现象, 不过双下降是对于参数量而言的,也许两者之间有紧密的练习。有趣的是,作者说这篇论文的起因是同事忘记关电脑度假去了。无论如何,以后可以试试不使用earlystop,看看会不会有奇迹发生。
另外,UnderPressure团队使用了Transformer,把时间步长当作特征,因此也不需要位置编码。
还有让我觉得很惊艳的是,头几名中大部分团队都用到一个技巧。
那就是他们找到了主办方团队的论文,比赛用的数据集其实是用结合神经网络和PID控制的呼吸机采集的。所以,他们就想办法把这个PID控制器的参数给破解了,冠军团队甚至连添加的噪声都找到了,靠这个后处理方法他们完美匹配了66%的预测。
特征
特征包括以下三类以及他们的混合:
- 原始特征 :
冠军团队仅使用了原始特征和LSTM就取得了很好的效果。 - 手工生成的特征
- Conv1D生成的特征。
auxiliary-loss
似乎对模型提升有很大帮助,大部分高分团队都使用了压力(目标p_i)或者其差值(比如p_i - p_i-1)作为辅助损失,也有一支队伍使用的过去压力之和。
预处理
- Scaling: 大部分团队使用了Robust Scaling,也有小部分只使用了 np.log1p。
- 数据增广:第三名Upstage团队使用了一些数据增广方法,其中MixUp效果比较显著。
- 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