老肥今天和大家分享的是山东省第三届数据应用创新创业大赛的心电图智能事件识别
赛题的Top2方案,完整代码已开源,需要的同学可以点击底部阅读原文
一键直达。
本次比赛是我第二次参加的心电图竞赛,主要采用的是基于ResNet改写的1DCNN模型。而上一次参加的则是AIWIN的赛题,比赛中因为数据不可开放、只能使用线上较差的计算资源而提前放弃,当时主要采用了树模型与特征工程的思路,完整代码同样可以在我的GitHub仓库中找到。
心电图(ECG)是一种简单、经济的院内检查手段,是患者住院或日常体检的常用检测项目。由计算机辅助医生对心电信号进行识别,有望减轻医生工作负担,并降低人工造成的漏诊。对于某一时长的 ECG 数据,识别其包含哪些心律失常事件,是目前热门的研究方向。评价指标为F1宏平均
。
在对数据进行初步观察后,我们可以发现这是一个类别不均衡的多标签分类
问题,并且心电图的数据长度也并不一致,为了将数据送入到CNN中进行训练,我们需要将其长度转成一致。
这里主要采取了两种不同的数据预处理
的思路,第一种是以多数类长度16001为基准长度,这里采用长度不足16001在末尾补零,长度超过16001的末尾截断的处理,另外考虑到读取csv文件的速度慢,完成上述操作之后将所有心电图均转化为mat矩阵文件保存;
第二种则是使用重采样
统一将心电信号变为一致的长度,我们采用长度6666,并以字典形式保存所有数据,方便快速读取(减少Dataset的IO用时,避免总是出现GPU处于等待读取数据的情况,是一种典型的以空间换取时间的做法)。
接下来是网络模型构建
(搭积木)的环节,也是本赛题最为核心的上分点,我们首先采取的backbone是1D版本的ResNet34
(和原ResNet的差别仅在于将2DCNN换成1DCNN),通过参考心电图历史竞赛的相关方案,我们对网络进行改进以更加适配该任务,增大了卷积核的大小
以增加感受野,增加SE通道注意力
模块以增强模型性能,具体结构如下图所示:
在上述模型的基础上我们又提出了se_resnet34_plus1模型,该模型在网络末端增加了maxpooling
将其与原先的meanpooling的输出进行拼接送入全连接层,使用maxpooling取出了特征图的最大值可以很好地捕捉心电图的异常,有效地提升了模型性能。
为了进一步加强初始感受野,我们在se_resnet34_plus1模型的基础上提出了se_resnet34_plus2模型,在数据输入的第一个卷积层,我们将其分成四个不同大小卷积核的分支,卷积核大小分别为9、15、31、45
, 同样有效地提升了性能。
再进一步的,我们提出了se_resnet34_plus3模型,在第一层卷积拼接后添加注意力SE模块,再在接近输出的全连接层增为两层,增加激活函数Swish
,继续提升模型性能。
在模型训练时,我们选择带权重的BCELoss,权重通过正标签数量的对数反比
进行计算,一种方式以评价指标f1-macro作为早停指标,训练得到总指标得分最高的单模型;另外一种方式以每个类别的f1得分作为保存模型的依据,一次同时保存18个在每个类别中的最佳模型。
后处理
我们一共采用了两种。
1)根据评分指标,我们可以通过线下验证集计算最优的阈值(常规的阈值后处理),能够显著的提升成绩(百分位)。
2)另外根据我们对数据标签的分析得到了互斥标签,即A、B事件不会同时发生,从而得到诸如此类的后处理方式:B取值为1时,强制将A改写为0,一样可以得到稳定的提升(千分位)。
模型融合
的部分,我们相当暴力地将历史迭代的模型根据oof进行加权融合,融合的权重通过贝叶斯优化的方法获得。
以上就是本次分享的全部内容啦,需要完整代码的同学可以点击阅读原文
一键直达!
- ——END——
-
-
-
-
- 觉得有用的话,就关注一下吧,感谢支持!
点击下面阅读原文看“完整代码”