555. Parkinsons Freezing of Gait Prediction | tlvmc-parkinsons-freezing-gait-prediction
首先,我要感谢主办方和Kaggle组织了这场如此有趣的比赛。我相信获胜者和获奖者们提出的方法,无论公共榜还是私有榜都获得了高分,这些方法对主办方都会很有帮助。
我将所有数据压缩为固定长度2048,因为最短的训练数据长度为2359。
压缩方法:
作为特征,我使用了每个折叠块内的均值、标准差、最大值、最小值和中位数。此外,添加各个百分位点(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,因此我将其选为最终提交(很高兴没有陷入排行榜波动)。
| 折 | 模型 | CV分数 |
|---|---|---|
| 0(排除"2d57c2") | LSTM(多任务) | 0.179 |
| 1 | LSTM(1D CNN头) | 0.337 |
| 2 | LSTM(添加百分位特征) | 0.278 |
| 3 | LSTM(1D CNN头) | 0.293 |
| 编号 | 模型 | 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事件的模型。如果举办第二届、第三届比赛,我很乐意继续参与。非常感谢!