Skip to content

首届中国心电智能大赛决赛阶段解决方案-公开版 比赛网址 http://mdi.ids.tsinghua.edu.cn/

License

Notifications You must be signed in to change notification settings

CbGeSky/Pub--1stECG

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

11 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

首届中国心电智能大赛--决赛阶段 Public Version

说明
首届中国心电智能大赛决赛 公开发布版
比赛网址 http://mdi.ids.tsinghua.edu.cn/
由于比赛自身的性质,本项目包含的内容仅限于本团队提出的最终决赛阶段的解决方案,任何有关数据的问题请直接与大赛主办方联系。

问题描述

首先看下官方的描述

决赛赛题

各团队需要在决赛规定时间内,利用组委会提供的训练集和验证集数据,设计并实现模型和算法,预测常规心电图所代表的正常或异常类别。各团队在测试集上的预测结果将用于计算成绩。比赛中所使用的常规心电图类别主要有正常心电图,八种异常心电图(心房颤动、一度房室传导阻滞、右束支阻滞、左前分支阻滞、室性早搏、房性早搏、早复极图形改变和T波改变),以及“其他心电图”。“其他心电图”较广泛地覆盖了以上9类无法准确描述的心电图数据。

决赛数据情况

决赛数据分为训练集、验证集和测试集等三个部分。注意这里再重申一遍,由于比赛的方式,我们也仅限于比赛期间才具有部分数据的访问权,比赛结束后,选手没法接触到任何的数据,有任何与数据集访问使用下载等有关的问题请直接联系大赛主办方。

心电数据存为MAT格式。其中存储了12个导联的电压信号(包含了I, II, III, aVR, aVL, aVF, V1, V2, V3, V4, V5和V6),同时也包含了性别和年龄等变量。电压单位为毫伏,采样率为500赫兹。训练数据对应的标签存储在REFERENCE.csv文件中,各类别编号和英文缩写如下表所示。

编号 类别 英文缩写
0 正常心电 Normal
1 心房颤动 AF
2 一度房室传导阻滞 FDAVB
3 完全性右束支阻滞 CRBBB
4 左前分支阻滞 LAFB
5 室性早搏 PVC
6 房性早搏 PAC
7 早期复极图形改变 ER
8 T波改变 TWC
9 其它类别 OTHERS

评价指标

首先,针对第j个类别定义如下四个变量,其中0≤j≤9,

评价指标S1

由此计算每一类的Precision、Recall和F1分数:

评价指标S2

最后对10个类别得到的F1求平均,同时决赛阶段还加入了运行速度的要求以及算法创新性的要求,根据这三个点给出综合评分。

好的,来谈一下自己的理解

赛题解读

根据对数据的了解的情况,这个问题可以定义为一个多标签分类问题,同时数据存在长度不一致,样本数量不平衡的问题需要注意考虑。

解决思路

决赛总体的思路考虑的是多个模型的融合,简要情况如下

  1. 特征提取 + xgboost
    1. 形态学特征
    2. 人口统计学特征
    3. 非线性特征等
  2. raw ECG + Deeplearning
  3. tf + Deeplearning
  4. Ensemble

最终的结果上,几条思路得到的效果都一般,ensemble带来的提高并不多,甚至还有降低,下面给出的代码仅仅包含部分思路,并没有把4条思路全都包含进来,其中第二条思路是总体上效果最好的一个。

代码说明

final_codes文件夹下包括了思路二(raw ECG + Deeplearning)的主要代码

Dependencies

Packages

python 3.6+
numpy
pandas
scipy
scikit-learn
scikit-multilearn
xgboost
tensorflow
keras

Hardwares

gpu (not necessary, better if have)
enough memory

总体目录树结构(下面的代码是提交用于测试结果的最终代码,由于不包含模型文件,提供了一个train文件作为替代之用)

提交的代码文件由下面的文件组成
|__ answers.csv     由测试集数据预测生成的标签文件
|__ chanllenge.py   主体代码,完成测试集数据的读取,模型的读取,并给出预测结果
|__ f_model.py      模型的定义
|__ f_preprocess.py 包含一些预处理的过程
|__ README.txt      简单的说明,未编辑
|__ run.sh          shell下的执行文件,用于给定测试集位置参数执行chanllenge.py生成answer.csv, 用以结果评测。
|__ model           模型存放位置
  |__ model_01.h5   训练得到的模型,模型结构定义见f_model

|__ f_train.py      模型训练,是不包含在提交代码中的,提供可用于自行训练得到模型测试结果。

代码执行:

  • 由run.sh指定测试集路径,在shell下调用执行challeng.py文件生成answers.csv用于结果评价。

  • train.py可用于模型训练

决赛结束之后

结束之后,考虑过几个问题

  • 模型到0.8左右做不动了,这个模型的识别能力就到这里了
  • 简单的加权 ensemble 的结果反而是decrease的

后续想想,可能的结果无非就是过拟合,欠拟合,以及两边的处理方式不一两个模型相当于提取的特征没法协同。以及后续想过一些继续提升的方案,

12导的处理方式

  • 这个是之前就在一个博客看到过,他当时提到过这个问题,我没太当回事,也没想明白,自己这个网络是如何处理12导联的以及如果不一起处理又该怎么办。
  • 现在想想,这可能确实是一个问题,之前我是把12导当成了向量表示,文本的embedding,但是现在想想这种向量表示有其相似程度的体现嘛,这个是文本的embedding去完成的东西。
  • 首先一个,就是上升到二维以图片的形式卷积,但同时只沿时间维度strides,这样能保证尺度的一致,方便后续再加上lstm反映时间信息、注意力机制等
  • 第二一个,对每一导联的单独训练,得到12个模型进行融合,相比于第一个还计算12导之间的信息,这个相当于直接先丢了,再深层的feature或者相当于最后的融合过程再去体现12导的关系
  • 我觉得上面两个都是可供考虑的方案,但是没试过,后面才想到的。

后续的考虑点

  • 滤波,对于12导联数据的滤波
  • 定位,1985年的PanTompkins算法在异常的心电数据定位上,有多高的置信度呢?这个事情也是今年的icbeb challenge在做的事情,后续可关注其进展 icbeb2019
  • 特征工程,关于特征的探讨

写在最后(Public 版)

这次比赛,12导联是一个挑战点,以及其它的一些小问题这次并没有处理得很好,很多地方都有很多提升的空间,从4月初开始接触深度学习这东西,到现在差不多4个月了吧,才算真正有了点了解。关于深度学习的学习就到此为止先告一段落,前路也再没有前人可以为我拨开迷雾,以大量时间作为投入得到产出和回报率太低了,说到底可能还是我太渣,这个先停一下,我一定会回来的(灰太狼既视感),后续有时间的话在18年的icbeb的数据基础上继续完成一下。

参考材料&致谢

  1. ICBEB2018 challenge的比赛网址
    本次有很多思路以及代码都源自于18年的这次比赛。

  2. 小宋是呢开源的一个初赛解决方案Github
    当时这个方案可算是很多选手的入门指南了,自己也算从中才入了个门

  3. 12处理方式里面提到的csdn博客
    这个上面也有不少深度学习展开的心电方面的研究,一些思路上觉得是可供参考的

特此感谢以上的开源方案 ~ ,祝愿各位未来能取得更好的进展

About

首届中国心电智能大赛决赛阶段解决方案-公开版 比赛网址 http://mdi.ids.tsinghua.edu.cn/

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published