基于深度学习和机器学习的心电图智能分析参赛总结
文章目录前言一、参赛经过二、深度学习技术在心电图智能分析中的应用三、机器学习技术在心电图智能分析中的应用1.引入库2.读入数据四、结果及讨论前言 2019年夏天我参加了清华大学主办的首届中国心电智能大赛,获得复赛第1,决赛第6;后来趁热打铁,又参加了天池平台上的合肥高新杯心电人机智能大赛,获得初赛第2,决赛第9。这两个比赛已经过去一年多时间了,现在经过一定时间的沉淀,可能认识更加深刻一些,就想写
前言
2019年夏天我参加了清华大学主办的首届中国心电智能大赛,获得复赛第1,决赛第6;后来趁热打铁,又参加了天池平台上的合肥高新杯心电人机智能大赛,获得初赛第2,决赛第9。这两个比赛已经过去一年多时间了,现在经过一定时间的沉淀,可能认识更加深刻一些,就想写一写总结,把其中一些技巧和思考记录下来。
由于心电图是一维数据,既可以用一维卷积神经网络来做,也可以用传统的机器学习方法人工提取特征做,我两种方法都用了,发现各有所长。关于这两次比赛,CSDN和知乎上已经有几篇介绍,两种方法的都有,我的算法结构、特征提取和他们大同小异,所以这方面就不多介绍,只介绍一下我的不同的地方,并重点对预测结果进行分析讨论。
一、参赛经过
清华赛初赛仅需要分析是正常还是异常心电图,复赛异常心电图又细分为AF、FDAVB、RBBB、LAFB、PVC、PAC、ER、TWC供8类,决赛的时候又增加了其他类,复赛和决赛在京东云平台进行,数据无法下载。为了这个比赛,我先啃了两厚本心电图医学专著,当然这比赛必须用编程实现,我是从参加这个比赛才首次接触深度学习,得益于开源精神,群里有人开源,我在别人开源基础上修改,也顺利进入了复赛。尝到站在别人肩膀上的幸福感后,复赛我下了很大的功夫查找相关文献和开源代码,经过仔细吸收消化,合并了一套自己的代码,并且又花了大量时间来分析数据,调参优化,复赛竟然拿下了第一。决赛开始后,一方面可能高手开始发力;另一方面,主办方临时修改游戏规则,改成48小时黑客松,就是现场48小时连续编程跑结果,然后紧接着立即开始答辩,我这年龄根本没法和年轻人比,想当年我做数学建模时也熬过72小时,但现在实在是熬不起,到后面头脑已经完全晕了,仅拿到了第6名。
天池赛难度比清华赛更高,初赛是54类异常,复赛是有33类异常,几乎把各种心电病症都囊括了,初赛和复赛的训练数据总共有4万多条。数据在天池网站可下载,但标注质量不是很高。毕竟天池的高手更多,我初赛拿到第2,复赛只拿到第9.
两个比赛的链接:清华赛,天池赛
二、深度学习算法
1.网络结构
清华赛提供的是12导联心电图数据,天池赛提供8导联,但是另外4个导联可以推导出来,所以都可以认为是12导联数据。可以使用1维卷积神经网络来做,至于网络结构,我发现只要主流组件用上,其实各种结构并没有很大差别,不需要迷信某种结构有神奇的效果,无非是调参见高低。我在清华赛中使用了15层较深的网络,在合肥赛中用了非常宽的网络,都可以做到不错的效果,这两个赛的网络结构在CSDN和知乎上也有好几篇分享,我就不再展开。
2.数据处理
因为深度学习算法是数据驱动的,数据处理很重要。样本数据长度不一,数据对齐是为了把不同长度的数据通过截断或补零对齐,对齐后的长度太短会浪费一些信息,太长则增加计算量。我使用了15000点长度,对应时长是30秒。
数据增强更重要一些。数据增强要保证两点,1是保证标签是正确的,2是新增的样本要和已有样本尽量有较大的差异性。我使用增强方法是:选择一个已有训练样本,在其中随机选择一定时长的一段(但不少于5000),然后再乘以随机数进行幅值伸缩。这样可以保证标签不变且数据和原样本不同。
图1 数据增强方法
图2 数据对齐方法,超过15000的截断,不足15000的统一左侧补零补足15000
3.训练和调参
调参非常重要,所有的操作措施,包括网络结构、数据增强等等,都可以认为是模型的一种超参,都需要用本地验证来确定这种操作是否有效,还是那句老话:实践是检验真理的唯一标准。
调参的口诀:快、准、狠。
快:一定要尝试更多种可能才能发现更好的参数,时间总是有限的,如果我们能够把每次验证的速度加快,我们就可以验证更多的参数可能性,就能够找到更好的参数。那怎么加快呢?这可是一套大学问,除了硬件、浮点精度等常规操作外,我通过这次比赛也总结了一套数据使用技巧。概要来说就是先确定多少训练样本是刚好够用的,多大的采样频率/分辨率是刚好够用的,在调参之初先通过几次试验确定这些数据,我们就不必使用全量训练样本,而是使用一个小比例但又不影像结果判断的小训练集来做为基准进行调参,这样可以大大提高速度。
准:只有快不行,必须保证验证是准确有效的。
狠:就是调参时要大胆尝试各种可能,不要迷信书本上的理论,什么方法都可以试一试,一切以实践为准。
三、机器学习算法
在清华赛中使用机器学习算法各类的效果都不如深度学习,但在天池赛中由于类别特别多,有些类别的分类精度机器学习算法比深度学习还高。所以天池赛可以使用两种方法最后再合并(或融合)。
1.特征构造
深度学习网络会自带滤波功能,所以可以实现端到端的操作,但机器学习通常要先滤波操作一下。我使用小波滤波。然后需要提取R峰,可以使用biosppy库实现。得到所有R峰位置之后,可以用统计法得到以下几类特征。(1)心率类,RR间期的各种统计指标。(2)波形类,根据R峰划分每个心动周期,统计每个周期内的波形特征,包括P波、QRS、T波的长度、幅值等等。总之尽量根据心电图诊断的人类医学经验来构造特征,但很多特征并不易构造,只能尽量逼近。
2.训练
我使用lightgbm建立模型,常规技术都用上,包括特征重要性排序及筛选、训练参数调参、f1指标跟踪早停,5折交叉融合等。
四、结果及讨论
因为我是外行跨界做这个的,我做这个题的初衷之一是想知道AI到底有多神奇,它能在多大程度上替代人类,能够有多大的实用价值,我想这也是很多像我这样的外行面对这几年AI大火的形势下想知道的问题。那么通过心电图智能分析赛这么个点深入刺探之后,我觉得有了一定的认识,下面总结一下。
1,AI的水平高于普通人。心电图还是很难的,我看了两本心电图医学书籍之后,只能判断一些非常简单的症状,我远不如我的程序准确度高。下图例1~例4是清华赛复赛数据中随机抽取的一些AI诊断结果。
例1↓
例2↓
例3↓
例4↓
2,AI水平不如专科医生。我专门找了我一位同学,北京某大医院心内科专家,我对他进行了盲测,结果发现他和AI的结果大多数是一致的,但不一致的基本都是AI错。我们又进一步把不一致的情况分为几种:一是症状比较模棱两可,AI的结论和他的结论都有一定道理,如下图例5;二是训练集中数据不足导致AI没有学到某些情况,如下图例6;三是训练集标注错误导致AI学到了假知识,如下图例7;四是有一些图的病症确实比较复杂,AI没有掌握,如下图例8。我同学也承认AI水平还是让他吃惊的,如果能够补充更多数据,并修正标注错误,准确度还可进一步提高。
例5↓
例6↓
例7↓
例8↓
总的来说,训练样本都是由人类专家标注的,AI又基于这些训练样本进行学习,所以它不可能超过人类专家,答辩会时一位医学专家也提到:医生能看出来的AI不一定能看出来,专家看不出来的AI肯定看不出来,我要这AI有何用呢?另外,由于深度学习的不可解释性,它所提取的特征难以被看懂并修改,所以即使我们通过错例分析知道它犯了哪些错误,我们也很难纠正它。结论是目前AI还不能够达到替代专科医生的水平,但它可以用在非心电科医生辅助诊断,病人自主预诊断,或疾病大规模筛查中,用以解决我国专科医生不足的痛点。
更多推荐
所有评论(0)