说明
首届中国心电智能大赛决赛 公开发布版
比赛网址 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,
由此计算每一类的Precision、Recall和F1分数:
最后对10个类别得到的F1求平均,同时决赛阶段还加入了运行速度的要求以及算法创新性的要求,根据这三个点给出综合评分。好的,来谈一下自己的理解
根据对数据的了解的情况,这个问题可以定义为一个多标签分类问题,同时数据存在长度不一致,样本数量不平衡的问题需要注意考虑。
决赛总体的思路考虑的是多个模型的融合,简要情况如下
- 特征提取 + xgboost
- 形态学特征
- 人口统计学特征
- 非线性特征等
- raw ECG + Deeplearning
- tf + Deeplearning
- Ensemble
最终的结果上,几条思路得到的效果都一般,ensemble带来的提高并不多,甚至还有降低,下面给出的代码仅仅包含部分思路,并没有把4条思路全都包含进来,其中第二条思路是总体上效果最好的一个。
final_codes文件夹下包括了思路二(raw ECG + Deeplearning)的主要代码
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导当成了向量表示,文本的embedding,但是现在想想这种向量表示有其相似程度的体现嘛,这个是文本的embedding去完成的东西。
- 首先一个,就是上升到二维以图片的形式卷积,但同时只沿时间维度strides,这样能保证尺度的一致,方便后续再加上lstm反映时间信息、注意力机制等
- 第二一个,对每一导联的单独训练,得到12个模型进行融合,相比于第一个还计算12导之间的信息,这个相当于直接先丢了,再深层的feature或者相当于最后的融合过程再去体现12导的关系
- 我觉得上面两个都是可供考虑的方案,但是没试过,后面才想到的。
- 滤波,对于12导联数据的滤波
- 定位,1985年的PanTompkins算法在异常的心电数据定位上,有多高的置信度呢?这个事情也是今年的icbeb challenge在做的事情,后续可关注其进展 icbeb2019
- 特征工程,关于特征的探讨
这次比赛,12导联是一个挑战点,以及其它的一些小问题这次并没有处理得很好,很多地方都有很多提升的空间,从4月初开始接触深度学习这东西,到现在差不多4个月了吧,才算真正有了点了解。关于深度学习的学习就到此为止先告一段落,前路也再没有前人可以为我拨开迷雾,以大量时间作为投入得到产出和回报率太低了,说到底可能还是我太渣,这个先停一下,我一定会回来的(灰太狼既视感),后续有时间的话在18年的icbeb的数据基础上继续完成一下。
-
ICBEB2018 challenge的比赛网址。
本次有很多思路以及代码都源自于18年的这次比赛。 -
小宋是呢开源的一个初赛解决方案Github
当时这个方案可算是很多选手的入门指南了,自己也算从中才入了个门 -
12处理方式里面提到的csdn博客
这个上面也有不少深度学习展开的心电方面的研究,一些思路上觉得是可供参考的
特此感谢以上的开源方案 ~ ,祝愿各位未来能取得更好的进展