返回列表

12th place solution: Simple features and LSTM.

555. Parkinsons Freezing of Gait Prediction | tlvmc-parkinsons-freezing-gait-prediction

开始: 2023-03-09 结束: 2023-06-08 临床决策支持 数据算法赛
第12名解决方案:简单特征与LSTM

第12名解决方案:简单特征与LSTM

首先,我要感谢主办方和Kaggle组织了这场如此有趣的比赛。我相信获胜者和获奖者们提出的方法,无论公共榜还是私有榜都获得了高分,这些方法对主办方都会很有帮助。

解决方案概览

  • 基于LSTM的4个模型组成的集成
  • 使用4类特征:均值、标准差、最大值、最小值、中位数
  • 使用无类型(Notype)数据作为验证数据
  • 为tDCS FOG和DeFOG分别选择模型

数据预处理

我将所有数据压缩为固定长度2048,因为最短的训练数据长度为2359。

压缩方法:

  1. 将原始数据扩展到超过原始长度的目标长度的最小倍数(通道数, 目标大小 × n)
  2. 将数据折叠为(通道数, 目标大小, n)的形状

作为特征,我使用了每个折叠块内的均值、标准差、最大值、最小值和中位数。此外,添加各个百分位点(15~90百分位)也很有帮助。很少使用每个ID和受试者的信息,仅将"Visit"作为多任务学习的标签。

def resize_func(x, target_size=2048, use_percentile_feat=False):
    ch = x.shape[0] 
    input_size = x.shape[1]
    
    pad = target_size - input_size % target_size
    factor = (input_size + pad) / input_size
    
    x = np.array([ndi.zoom(xi, zoom=factor, mode='reflect') for xi in x])
    x = x.reshape((ch, target_size, -1))
    
    res = {} 
    res['mean'] = np.mean(x, axis=2).reshape(ch, -1)
    res['max'] = np.max(x, axis=2).reshape(ch, -1)
    res['min'] = np.min(x, axis=2).reshape(ch, -1)
    res['med'] = np.median(x, axis=2).reshape(ch, -1)
    res['std'] = np.sqrt(np.var(x, axis=2).reshape(ch, -1))
    if use_percentile_feat:
        for p in [15, 30, 45, 60, 75, 90]:
            res[f"p{p}"] = np.percentile(x, [p], axis=2).reshape(ch, -1)
    
    return res

模型架构

使用的模型是LSTM:一个简单的4模块模型,以及一个曾在类似竞赛中获得第三名的模型。对于DeFOG,我还使用了Transformer模型

交叉验证策略

  • tDCS FOG:
    在tDCS FOG中,我使用了4折StratifiedGroupKfold,以Event标签和Subject作为分组。然而,某些折的CV分数相当高。这可能是因为在受试者"2d57c2"中,困难类别(如StartHesitation和Walking)的样本大量出现且持续时间较长,降低了假阳性率。因此,我选择了排除该受试者后的分数作为模型选择依据。我个人认为,造成排行榜波动的原因也在于公共数据中存在这样的受试者,导致许多队伍过拟合了它。

  • DeFOG:
    由于DeFOG的标注数据很少,我将所有标注数据用作训练数据。由于三个标签的损失与仅Event标签的损失之间存在相关性,我使用Nototype作为验证数据。虽然无法进行最终选择,但我用包括tdcsfog在内的所有数据进行了训练,基于Notype数据选择的模型是我最好的私有榜分数(此笔记本)。

最终提交

我为tdcsfog和defog各选择了4个模型并进行了集成。对于tDCS FOG,我选择了每折中CV分数最高的模型。最佳公共分数已有足够高的CV,因此我将其选为最终提交(很高兴没有陷入排行榜波动)。

  • tDCS FOG:CV分数 0.28
模型 CV分数
0(排除"2d57c2") LSTM(多任务) 0.179
1 LSTM(1D CNN头) 0.337
2 LSTM(添加百分位特征) 0.278
3 LSTM(1D CNN头) 0.293
  • DeFOG:CV分数 0.381(Event)
编号 模型 CV分数
0 LSTM 0.292
1 LSTM(添加百分位特征) 0.318
2 LSTM(长序列4096) 0.286
3 Transformer 0.286

排行榜分数:
公共LB:0.444
私有LB:0.341

最后,我很高兴能凭借这枚金牌成为Kaggle Master。然而,虽然获得了金牌,但我很失望未能设计出能在定量和定性上都能很好捕捉FOG事件的模型。如果举办第二届、第三届比赛,我很乐意继续参与。非常感谢!

同比赛其他方案