问题提出
在ECG心电图分类中,我们对于数据的预处理通常都是先通过R峰定位找出QRS波的位置,然后截取心拍,对得到的心拍打上标签,就得到了我们的处理对象。但是ECG通常有12导联,也就是一种病症对应的ECG可以得到12个导联的心拍,对于这些心拍,我们是将每个心拍全部打上一样的标签,还是将12个导联的心拍一一组合得到一个多维向量组合,并给这个向量组合打上标签,或者只取包含明显特征的几个导联的心拍进行组合再打上标签呢?
三尖瓣环II导联的部分截图,可见一个导联可以取出多个心拍
三尖瓣环aVR导联部分截图
问题分析
查阅资料得知,以往临床医师通常根据部分导联中比较明显的特征作为临床诊断的依据,所以第三种猜想是合理的,但是,实际上其他导联也包含着一些能代表差异的信息,只是特征不明显,所以理论上,综合分析12个导联的信息是最准确的,那么第二种组合方式也有道理。相较而言第一种方式的处理方式比较简单粗暴,可能会对后续模型训练的效果产生较大影响。
这是我在实验前的个人猜想:
我通过观察心电图发现:从医生的角度来看,若要判断一个病症,通常还是要找特征明显的地方,医学上对于各个病症的特征也有规定,既然医生是根据这些规定判断出来的,机器学习人工智能应该也要顺着医生的思路,才能得到与医生高度相似的诊断结果,毕竟机器判断出来的结果也需要医生确定判断的是否正确,所以我觉的应当聚焦在特征明显的几个部位。
实验细节
所以接下来,我想对第二种和第三种组合方式进行实验,通过实验来证明哪种组合方式更有效。
以Brugada和正常两类心电图的二分类为例,brugada综合征的异常症状主要集中在v1-v3导联ST段抬高,再针对本次实验的数据集,我发现每张图的v2导联都存在明显的特征,基于这一点,我准备了三组数据,想做个对比试验,来证实:异常特征明显的部位截取的心拍做成的数据得到的准确率比12导联综合起来的准确率要高。
这三组数据分别是:①只截取v2部位的心拍,②截取v1-v3导联,组成三元组向量,③截取12导联,组成12元组向量。数据截取心拍的时候采用Python的biosppy工具包,BioSPPy是基于Python的生理信号处理工具包,该工具包汇总了多种面向生理信号分析的信号处理和模式识别方法。在这个工具包中,我选择了这个R波接口算法:
biosppy.signals.ecg.hamilton_segmenter
这是个简单接口算法,只需要提供采样率和生理信号即可。我将采样率定为360HZ,为了将异常特征尽量包含在一个心拍里(特征主要体现在ST段和T波),所以以R峰为中心,向前截取0.2s,向后截取0.5s.一个心拍包含252个采样点。
在跑数据之前做了一个预测,若我的想法正确,那么①的效果最好,②的效果稍差,③的效果应该要更差一些。
实验结果(Acc)
模型 | v2导联 | v1-v3导联 | 12导联组 |
---|---|---|---|
AlexNet | 1.0000 | 0.9714 | 0.9856 |
VGGNet | 0.9929 | 0.9929 | 0.9928 |
由实验结果可见推测基本成立,但是可能是由于实验数据数量少,规模少,且采用的训练的深度模型结构复杂,所以三种情况的准确率都非常高,没有很明显的差异。
这个实验的代码见该篇文章绑定资源(在文章首部)