返回列表

20th place solution

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

开始: 2023-03-09 结束: 2023-06-08 临床决策支持 数据算法赛
第20名解决方案 - Moro

第20名解决方案

作者:Moro(MASTER)
排名:第20名
发布时间:2023年6月9日
得票数:21票

感谢组织者带来这场精彩的比赛,也感谢所有参与者的交流分享。
在此分享我的解决方案。

概述

  • 数据集:tdcsofg + defog(不使用 notype/未标注数据)
  • 模型:Conv1d 神经网络(tdcsfog 和 defog 的通用模型)
  • 6 个模型集成

1. 基线模型

2. 验证策略

  • GroupKFold:5折(groups=Subject)
  • 由于数据不平衡,我调整了种子,使病例数量和比例尽可能保持一致

3. 数据预处理

  • 对齐加速度单位(tdcsfog 除以 9.8066)
  • 特征:
    • 原始数据:AccV, AccML, AccAP
    • AccMG: np.sqrt(AccV² + AccML² + AccAP²)
    • Time_freq: df["Time"] / df["Time"].max()
    • tdcs 标志
    • 滚动窗口特征
# 滚动窗口特征
for col in ["AccV", "AccML", "AccAP", "AccMG"]:
    for w in [10, 50, 100, 1000]:
        df[f"{col}_win{w}_std"] = df[col].rolling(window=w, min_periods=1).std().fillna(0)
        df[f"{col}_win{w}_delta"] = df[col].rolling(window=w, min_periods=1).max() - \
                                    df[col].rolling(window=w, min_periods=1).min()
        df[f"{col}_win{w}_diff"] = df[col] - df[col].rolling(window=w, min_periods=1).mean()

4. 模型

  • 我定义了 2 个模型:
    • 模型 A:
      • 输入特征:54 个特征(全部特征)
      • 窗口大小=32:过去=24,未来=8,wx=8
      • 输入 - (Conv1d:ks=3/5/10 - GAP) × 3 - MLP - 输出
    • 模型 B:
      • 输入特征:6 个特征(3个原始 + MG + Time_freq + tdcs)
      • 窗口大小=256:过去=192,未来=64,wx=1
      • 输入 - Conv1d:ks=90 - GAP - MLP - 输出
  • 训练参数:
    • 损失:BCEWithLogitsLoss / BCE+CELoss(4标签)
    • 优化器:Adam(2e-5)
    • 轮次:10

模型结构图

5. 后处理

  • 预测值的移动平均:窗口=500
  • label 1 是连续的,因此我能稍微提高分数(+0.004)

6. 集成

  • 我训练了 6 个模型
  • 集成方法为等权重平均
id inputs win_size Acc-units model local-cv public private
v10 54个特征 32(wx=8) 模型A 0.290 0.392 0.316
v13 54个特征 32(wx=8) 模型A(自定义) 0.300 0.376 0.305
v51b 54个特征 + 2个特征 48(wx=8) 除以 9.8 模型A 0.302 0.386 0.321
v60 54个特征 32(wx=8) 除以 9.8 模型A (+CELoss) 0.301 0.388 0.306
v59 54个特征 32(wx=8) 模型A(其他cv) 0.324 0.390 0.312
v58 3个原始+3个特征 256(wx=1) 除以 9.8 模型B 0.306 0.350 0.312
集成 0.411 0.324

未生效的方法

  • Transformer / LSTM / 1dcnn+LSTM / wavenet:未提高分数
  • 傅里叶变换 / MFCC 数据转换:分数变差
  • RobustScaler:几乎相同
  • 对 notype 和未标注数据的伪标签:分数变差
  • 使用 Subject 数据:分数变差
  • 为 tdcsfog 和 defog 分别建模:分数变差

一些在顶尖队伍中有效的方法,我可能实现有误。

我的问题

  • 为什么匹配和不匹配加速度单位得到的分数相似?(有时不匹配反而更好)
  • 我不想包含 Time_freq 来使模型更通用。没有它如何提高分数?

感谢阅读。

同比赛其他方案