返回列表

9th Place Solution

600. HMS - Harmful Brain Activity Classification | hms-harmful-brain-activity-classification

开始: 2024-01-09 结束: 2024-04-08 临床决策支持 数据算法赛
第九名方案

首先,我们要对哈佛大学和Kaggle组织如此有趣的比赛表示衷心的感谢。这是一场在预处理和建模方面可以尝试多种方法的竞赛,使我们通过不断试错学到了大量知识。

概述

  • 加权集成的2D模型。CV评分(vote_num≥10)为0.2023。
  • 为高效融合大量oof预测,使用了L-BFGS-B算法。

ishikei 部分

数据集

原始脑电特征

  • 信号预处理方法与sqrt4kaido的方法相似。
  • 创建了多种通道的波形,最多50个通道(纵向/横向双极montage,原始波形)。
  • 部分模型还使用了EKG通道作为输入,这有助于提升集成的多样性。

模型

  • 双编码器(原始脑电、脑电频谱图)、三编码器(原始脑电、脑电频谱图、kaggle频谱图)模型。

特征提取器

原始脑电

  • 通过在不同时间窗口组合(50 s与10 s、40 s与10 s、30 s与10 s等)裁剪序列并使用GRU提取每个时间窗口的特征,创建了2D波形图。

脑电频谱图

  • EEG梅尔频谱图按照chris的方法生成(4通道)。

编码器与分类头

  • 每个波形图、梅尔频谱图不在宽高轴上拼接,而是先分别通过backbone网络,随后在应用注意力层后取平均。
  • 在原始脑电和脑电频谱图特征之间使用了对比损失(contrastive loss),这使CV和LB提升约0.01。
  • 作为辅助损失,预测波形中是否存在NaN,这略微提升了CV约0.002~5。
  • 使用的backbone包括efficientnetv2_s、efficientnetv2_m和resnet34d。
ishikei 流程图

训练

  • 5折StratifiedGroupKFold。
  • 通常,从每个eeg_id中选取一个eeg_sub_id用于训练和测试。选取的sub_id是标注人数最多且最接近序列中心的。
  • 首先在vote_num≥4的数据上进行训练,然后切换到vote_num≥10进行微调。
  • 部分模型对vote_num<10的数据进行了伪标签处理,即在vote_num≥10的模型微调后,用该checkpoint为vote_num<10的数据生成伪标签。
  • 最后,使用伪标签数据(vote_num<10)与真实标签数据(vote_num≥10)共同进行若干轮的微调。

集成

  • 为高效融合大量团队成员的oof预测(约150个模型),使用了L-BFGS-B。该方法在速度和精度上均优于Nelder-Mead。
  • 首先使用全部150个模型计算集成权重。由于超过一半的模型权重接近零,随后在剔除这些模型后重新计算集成权重。
  • 如此逐步去除低权重模型,并重复该过程,以获得CV与模型数量的良好平衡。(通常最终保留约20~30个模型)。

sqrt4kaido 部分

整体流程

  • 使用第二阶段流程:
    • 第一阶段:vote_num ≥ 4
    • 第二阶段:vote_num ≥ 10
    • 交叉验证:分层5折(或10折)

标签

  • 训练时,随机从每个eeg_id中选取一个标签。
  • 训练时,如果vote_num≥10,则对有投票的非零类进行加票或减票(标签增强)。
  • 验证时,对所有label_id进行推理并对每个eeg_id的预测取平均,然后再对所有eeg_id的结果取平均。

预处理

  • 使用60 Hz陷波滤波器和0.4 Hz高通滤波器。
  • 采用Robust Scaler进行归一化。
  • 数据增强技术:
    • 垂直翻转
    • 乘以‑1
    • 波形混合(mixup)
    • 通道交换
  • 使用16个通道(纵向双极montage)。

模型

sqrt4kaido 流程图
  • 创建了包含4个编码器的模型:
    • 1D LSTM:
      • 将信号通过LSTM(对每个通道共享权重,分别处理每个通道,而不是一次处理全部16个通道),分别对50 s和10 s数据进行处理,然后拼接结果形成2D图像。
    • 1D WaveNet:
      • 将信号通过WaveNet(对每个通道共享权重,分别处理每个通道,而不是一次处理全部16个通道),分别对50 s和10 s数据进行处理,然后拼接结果形成2D图像。
    • 2D频谱图(使用torchaudio):
      • 对50 s数据计算频谱图并输入2D模型(resnet18d)得到嵌入(分别处理每个通道,而不是一次处理全部16个通道)。
      • 对10 s数据使用更细的分辨率计算频谱图并输入2D模型得到嵌入(同样分别处理每个通道)。
      • 将上述结果拼接为2D图像。
    • Kaggle频谱图:
      • 将4个通道(例如LL~)输入2D模型(resnet18d)得到嵌入(分别处理每个通道,而不是一次处理全部4个通道)。
    • 将上述各结果送入后续2D模型(tf_efficientnet_b0_ns),拼接后通过线性层。
    • 损失:每个输出的KL散度损失 + 对比损失。
    • CV:0.2247(vote_num ≥ 10,10折)。

集成

  • 合并4种编码器的模型。
  • 采用5折和10折交叉验证。
  • 使用tf_efficientnet_b0_ns和tf_efficientnetv2_s.in21k_ft_in1k模型。
  • 使用16通道或30通道(加入横向双极montage)。

2g 部分

整体流程

  • (与ishikei和sqrt4kaido部分基本相同)
  • 第一阶段:vote_num ≥ 4(使用vote_num作为样本权重)
  • 第二阶段:使用vote_num ≥ 10进行微调
  • 第三阶段:使用第二阶段模型预测的伪标签(vote_num < 10),对第一阶段模型进行再微调,真实标签为vote_num ≥ 10。

预处理

  • 训练数据按EEG_id和标签(seizure、lrpd等)分组。(在训练时随机选择每条记录的Sub_id作为数据增强的一种方式)
  • 信号预处理:使用Butter低通滤波器(参考此处)。

特征

  • 生成了多种通道的波形,最多50个通道。主要使用双banana链,偶尔也使用其他链。
  • 50 s或10 s数据中NaN和常量(如9999、‑9999)的比例。(在模型的最后一层进行拼接)
2g 特征示意图

模型

  • 特征提取器(感谢@cdeotte、@abaojiang分享的出色 notebooks)
  • 使用50 s和10 s的脑电特征。
  • 在输入特征提取器之前使用1D卷积进行下采样。
  • 左右脑对应的脑电特征配对后,通过1D卷积降至单通道并下采样。
  • 特征提取器的输出拼接形成图像。
  • 该图像使用EfficientNet_b0_ns或EfficientNet_v2进行最终预测。
  • 还进行了二元预测(是否为other),使用BCELoss。(损失比例:KLDLoss(6类):BCELoss(二元)=0.7:0.3)
2g 模型流程图

训练

  • 5折StratifiedGroupKFold。
  • 训练时,随机从每个EEG_id中选取一个标签(偏移)。
  • CV评分计算:对所有label_id进行推理,对每个EEG_id的预测取平均,然后对所有EEG_id再取平均(与sqrt4kaido部分相同)。

数据增强

  • 垂直翻转
  • 随机遮挡若干EEG特征(将整个特定通道切除)。
  • 时间平移:有时有效,有时无效。
同比赛其他方案