ECG ×AI: 机器/深度学习的ECG应用入门(4)
传统机器学习:特征工程+分类器
1.引言
在前期阶段我们已经完成了数据来源与识别对象的相关工作。下一步就需要将注意力转向机器或深度学习算法的实际应用了。鉴于本人编写这些文章的目的并非旨在阐述机器或深度学习理论方面的内容,默认情况下,在涉及这部分内容时,默认不会有过于深入的理论探讨。对于不清楚的部分,请自行查阅相关资料
在此部分中, 我们首先聚焦于传统机器学习架构, 这种架构的核心模式是基于'特征工程+分类器'的方法论. 即首先人工构造一组能够反映样本特性的重要指标, 然后在后端阶段选择合适的分类器模型, 例如支持向量机(SVM), k最近邻分类器(k-NN), 决策树等单个或集成算法. 在这一过程中, 经常会进行优化工作, 包括优化特征选择和调整分类器参数等关键环节. 通常而言, 后端所采用的分类器算法已经较为成熟, 如果想要对其本质进行改进则需要深厚的理论支撑, 在实际应用领域对此类算法进行较大规模改动的情况极为罕见. 因此我们可以得出结论: 若想采用传统的机器学习算法框架来进行问题求解, 关键在于如何巧妙地构建有效的特征向量. 对于我们当前关注的ECG信号分析任务而言, 如何提取具有判别意义的相关特征将是实现目标的关键所在.
2.特征设计与分类
1)对于传统机器学习,不设计特征行不行?
在之前的步骤中,我们已经获取了心拍数据,在每个样本中包含250个采样点。是否可以直接将这些采样点作为特征进行分析呢?
初看似乎也没什么问题,并且甚至可以避免进行特征提取这一环节。然而这种做法未必是最佳方案。如果不对这些数据进行预处理的话,在经过计算后系统的维度将直接达到样本点数量级即250维水平这在机器学习理论中常称这种现象为‘维度灾难’问题(可自行查阅相关资料以深入理解这一概念)。值得注意的是这些相邻特征点之间存在高度冗余性其主要集中在信号快速变化的区域而它们所携带的信息差异微乎其微这种特性无疑会对分类器的工作造成一定的负面影响因此对于分析心电图(ECG)信号而言建立高质量的特 trưng选择与工程化处理就显得尤为重要;而对于后端分类系统而言构建高质量的特征集合同样不可或缺。
2)常用ECG特征
(1)ECG形态特征
通过查阅一些ECG领域的医用手册,我们可以知道,医生在通过ECG诊断心血管疾病时,其实关注的是各个波形的变化情况,例如,当QRS波变大变宽时,可能发生了室性早搏;ST段抬高时,可能发生了心肌梗死。这样,通过最直观的波形变化,结合医生的经验,可以进行疾病的诊断。所以,这就引出来了第一类常用的特征:形态特征。常用的形态特征有:
P 段高度、QRS 段高度、T 段高度、PR 隔度、QRS 隔度、QT 隔度、ST 隔度、PR 段宽度、ST 段宽度以及 RR 隔度如图所示

这些都是一些可以直接从ECG信号中提取出的"一级"特征,在这些基础特征的基础上还可以组合成各种各样的"二级"特征,比如QRS波面积(QRS间期×QRS振幅)等。在形态特征方面具有显著的优势在于直观易懂且具有较强的可解释性;然而其明显的缺点就在于需要对心拍中的各个波段进行精确的定位工作而要做到这一点确实存在很大的难度。前面已经说明过目前除了QRS波的定位检测算法已经相当成熟可靠外其他波段的定位算法可靠性都不太高。如果无法实现这些波段的精准定位这对于后续分类器的表现会产生较大的影响因此近年来单纯依赖形态特征求取的方法相关的研究也相对较少。
(2)ECG变换系数特征
上面提到直接提取形态特征的方法虽然直接却存在致命缺陷 那么是否可以通过某种非直接的方式获取既有效又少量又能充分表征心拍的关键特征呢 当前大部分采用传统机器学习框架的研究普遍采用了以下这一方案 即运用一系列数学转换手段对ECG信号进行处理 从而获得有限数量的系数值 并利用这些数值来表征心拍特性 最为常用且效果显著的就是小波变换 由于其独特的多尺度解析特性 小波变换能够有效提取出高质量的小波系数 这些数值则成为表征心拍的重要特征

小波变换的内容丰富,在深入探讨了许多难以理解的数学概念与运算之后
此外,在文献中还有一种方法采用多项式拟合的技术。也就是说,在分析一个心动周期时会使用多项式拟合法,并从中提取出各次幂系数作为特征参数。总的来说,在这种基于ECG变换系数的方法中可以减少对某些关键点位置直接识别的需求。其复杂性相比直接定位关键点则大大降低。然而这种方法的一个缺点是难以直观理解所提取到的信息。因此在选择这些系数作为特征时会面临一定的挑战性问题。
这两种常用的特征各有优缺点。但是当前趋势表明,并非所有情况下第一种都适用。倾向于选择提取难度较低的第二种特征,并且这种选择背后有其合理性和必然性。这些方法不仅在理论上有较高的研究价值,并且在实际应用中展现出更大的可行性与可靠性。这也可能是这类论文较多的主要原因
3)常用分类器
这一观点无需过多赘述即可明白。
就其本质而言,
多数经典的分类器都具备适用性,
只要能达到预期效果,
当前各类分类器算法的支持体系相当完善,
我们能够方便地调用高效的工具库,
从而避免重复造轮子。
这一观点无需过多赘述即可明白。
稍作补充说明后即可见端倪:
就其应用层面而言,
多数经典的分类器都具备适用性,
只要能达到预期效果,
当前各类分类器算法的支持体系相当完善,
我们能够方便地调用高效的工具库,
从而避免重复造轮子。
这一观点无需过多赘述即可明白。
稍作补充说明后即可见端倪:
立即进入实例演示部分吧!
3.示例:心律失常的SVM识别
在本节中,我们采用了大名鼎鼎的支持向量机(SVM)作为分类器的后端选择。同样地,在Matlab环境下进行了相关实验。为了方便起见,在GitHub上开源了一个压缩包:libsvm-3.21.zip。需要注意的是,libsvm并非Matlab内置的库模块,因此其安装过程略显复杂。不过为了方便起见,在GitHub上开源了一个压缩包:libsvm-3.21.zip。解压该文件包后,默认情况下它会被存储在一个名为libsvm-3.21的文件夹内(默认情况下)。然而在Matlab环境中调用该工具包时,请注意将其matlab子文件夹添加到当前可搜索路径中即可调用此工具包。建议将整个 libsvm 文件夹放置于Matlab安装目录下的toolbox目录下以供后续使用。另外值得注意的是,在64位操作系统环境下编译所得的工具包仅适用于64位版本的Matlab运行环境。如果目标系统是基于32位的操作系统,则建议参考书籍《MATLAB神经网络43个案例分析》中的相关内容以获取完整的安装指导说明
在执行以下步骤前,必须调用load函数将存储在(.mat格式)中的心拍数据文件加载到工作空间环境中。此时我们能够观察到正常类别的心拍数量远超其他三个非正常类别的心拍数量,这表明存在明显的数据分布失衡问题。为此,在实验过程中,我们从每个类别中仅选取5000个样本用于建模训练,并因此导致整个数据集的规模缩减至2×1e4。所有后续步骤所需的Matlab代码已通过个人GitHub仓库公开,并附有链接:Classification-SVM.m。读者可以通过此文件学习并实践相关内容。
1)特征提取
在这里我们利用小波变换的系数作为我们的特征指标. 在分析原因时, 除了考虑到小波变换具有的多分辨率特性外, 还必须注意到在该过程中隐含了降维机制的存在. 在实现层面, 我们可以选择使用Matlab平台提供的内置函数集合, 这不仅简化了操作流程, 而且显著降低了工作难度.
详细的过程是这样的:我们对每个心拍信号进行了五层的小波分解,并采用db6小波作为基函数。借助Matlab的wavedec函数(建议查阅Matlab官方文档以获取该函数的具体功能信息)即可轻松完成整个操作。
[C,L]=wavedec(sig,5,'db6');
其中,C代表各阶小波变换后的系数矩阵,sig表示我们在此处提取的250点心拍信号。
在完成五级小波分解后并结合两倍下采样的处理流程中,
我们选择了原始信号经小波变换所得系数中的"近似"
部分作为研究对象,
即取自于五级分解后的a分量。
根据L中所反映的信息,
这部分数据对应于前25个系数。
选择"近似"
分量的原因在于其能够有效去除细节信息,
从而更能凸显出信号的一般性规律特征。
这一做法在疾病诊断中具有重要意义,
因为不同患者或同一患者在不同时间段由于身体状况的变化可能导致心电图出现细节上的差异变化。
这些细节特征往往呈现出一定的个性特征,
不适合作为判定疾病的一般性特征依据。
重视一般性规律性的研究思路,
有助于避免机器学习算法陷入"过拟合"
困境。
基于此考虑,
我们选择这25个系数作为表征每个心拍信号特性的代表值
从初步分析来看, 特征提取似乎并不复杂. 然而, 我们这里只是一个简单的例子, 不能保证这些特征就是最佳选择. 真正优秀的特征通常需要丰富的经验和大量实验数据的支持. 只有经过深入研究和实践积累, 才能提炼出高质量的特征. 以小波变换系数为例, 具体包括分解阶数、数量、基函数等多种因素的选择, 这些参数的不同取值都会直接影响到最终的系数质量. 这仅仅是基础层面上的系数提取, 在此基础之上还可以进行各种优化处理得到二级甚至更高阶的特征. 这种多层次的构建过程在实际应用中至关重要
2)数据集选取与划分
采用均匀分配策略将数据划分为两组:一部分作为训练集合(共1万样本),另一组作为测试集合(也包含1万样本)。随后通过调用Matlab中的randperm函数生成打乱后的索引列表,并从中选取前1万索引对应的数据用于构建训练数据。
3)特征归一化
在机器学习任务中,并非所有情况下都需要进行特征提取与维度缩减技术即特征归一化. 在本案例中 为了提升支持向量机(SVM)的学习效率和模型性能 采用了特征归一化的策略. 具体而言 本研究中的"归 normalize"过程特指同一特征指标在不同样本实例上的取值范围进行标准化处理. 通过调用Matlab内置函数mapminmax对其进行数据标准化. 需要注意的一点是 该函数对输入数据矩阵的具体行列维度有严格要求 即需要明确哪些方向代表样本数量 哪些方向代表不同的属性指标. 在实际操作中 我们首先采用mapminmax函数对训练集的数据进行标准化处理 将其缩放到0至1之间 并记录下所需的信息 然后在此基础上 对测试集的数据同样应用这一预存的信息 完成测试集数据域的整体平移缩放变换
[train_x,ps]=mapminmax(train_x',0,1); %利用mapminmax内建函数特征归一化到0,1之间;
test_x=mapminmax('apply',test_x',ps);
4)模型训练与测试
使用libsvmtrain函数与libsvmpredict函数分别建立模型并验证其准确性,请特别留意这两个工具在处理数据时需要关注其顺序以及格式规范
model=libsvmtrain(train_y,train_x,'-c 2 -g 1'); %模型训练;
[ptest,,]=libsvmpredict(test_y,test_x,model); %模型预测;
在libsvm训练中,默认采用的是径向基函数(RBF)核。其中需要人工指定两个超参数:C和γ。在这里我们将其设定了两个典型值:C=2 和 γ=1。需要注意的是,C和γ的不同取值可能导致显著的结果差异。若要获得更好的模型性能,则需通过参数调优来实现。有效缓解模型在欠拟合与过拟合之间的平衡。这也是所有机器学习与深度学习问题中最依赖经验积累与最为耗时复杂的环节之一。常见的参数优化策略主要包括手动调节、网格搜索以及启发式优化等技术手段。
5)结果统计与展示
该部分主要基于分类器的实际预测输出(libsvmpredict在上一步骤生成的ptest向量),与预期的结果(标签)进行对比分析,并计算各分类的准确率等指标。完整的代码实现可参考作者提供的GitHub仓库。如前所述,在基于上述特征提取方法及参数配置的情况下,我们可以获得以下关于准确率的具体信息(由于每次运行时采用不同的训练集与测试集组合可能导致结果差异,请注意观察):

本次实验中,基于SVM的模型在测试集上的预测准确率达到1-\alpha水平,即达到1-\alpha的标准下完成了分类任务。具体而言,在测试集中识别的四个目标类别分别达到了各自的准确率数值:正常类别(N)的准确率为1-\alpha_1;室性早搏(V)为1-\alpha_2;右束支阻滞(R)为1-\alpha_3;左束支阻滞后(L)为最高分值。研究者提醒大家,在实际应用过程中需要注意这些特殊点的具体表现形式及其对结果的影响程度。此外,在代码库中还提供了评估多分类问题性能的一种常用指标工具——混淆矩阵。通过工作空间中的操作菜单打开名为'Conf_Mat'的混淆矩阵文件即可完成数据验证过程

类别1至4分别代表正常心拍(N)、早搏心拍(V)、右束支阻滞心拍(R)及左束支阻滞心拍(L)。通过分析混淆矩阵可以看出分类器的分类结果表现如何以及各类别之间的分布情况。主对角线上的单元格表示各类别被正确分类的数量(即真正例),而非主对角线上的单元格则表示各类别的误判情况(即假正例和假反例)。以第二行第四列为例,在测试集中有128个早搏心拍被错误分类为左束支阻滞心拍(即假反例),这是所有误判案例中最多的类型;而第四行第三列单元格中的误判数量为零,则表明左束支阻滞心拍并未被误诊为右束支阻滞心拍的情况发生过。通过深入研究混淆矩阵中的各项指标分布情况以及各类型间的差异程度,在实际应用中可以根据经验采取相应的优化措施来提升模型性能。
在此基础上, 我们以经典的SVM算法为例, 实现了一个基础性ECG数据分析系统的构建. 该系统涵盖了从特征提取到模型训练与评估全过程, 并且成功地实现了目标检测这一核心目标(值得注意的是, 当前效果尚具提升空间, 具体改进方向将在后续章节详细探讨). 对于用户而言, 紧急情况下能够快速掌握并动手实践是本项目的重点价值所在. 此外, 本章所涉的技术细节和优化空间也值得深入挖掘. 包括如何提取质量更高、更具判别的特征指标; 如何合理选取更为合适的超参数设置; 以及如何选择更加匹配的任务场景分类器等技术细节和优化空间. 不管怎样, 核心理念始终如一: 在传统机器学习框架中, 我们的首要任务应当聚焦于"高质量"特征数据与"精准化"参数配置这两个关键维度.
4.小结
该部分对传统机器学习框架在ECG分类中的应用进行了总体上的概述与说明。表面上看这一过程简洁实用,然而其中核心环节——特征的选择过程,却是一个高度复杂且富有挑战性的任务,需要具备丰富的经验以及大量的实验验证支持。为此,我们强烈推荐相关领域的综述文章作为进一步深入研究的重要参考资料。
** 相关代码文件下载:https://github.com/Aiwiscal/ECG-ML-DL-Algorithm-Matlab
参考文献如下:作者信息部分使用方括号列出姓名、年份和期刊名称缩写。具体信息包括Yeh Y C, Wang W J, Chiou C W三位作者于2010年在《Expert Systems with Applications》期刊上发表的一篇文章题为《Feature selection algorithm for ECG signals using range-overlaps method》,文章编号为J.卷号37期号4页码范围从3499到3512
[2] Raj S, Ray K C. They employ a DCT-based DOST approach combined with PSO-optimized SVM for the analysis of ECG signals.
[3] 刘涛等. 基于VQ特征提取的心电拍分类中的字典学习[J]. Expert Systems with Applications, 2016, 53: 129-137.
[4] Kamath, C. Electrophysiologists' classification of ECG beats using extracted features from both temporal and spectral domains of Teager energy functions[J]. IET signal processing, 2011, 5(6): 575-581.
An electrophysiologic approach using ECG-based categorization was devised to analyze the temporal dynamics of resuscitation-associated heart rhythm patterns with the aim of facilitating post-resuscitation data analysis. published in IEEE Transactions on Biomedical Engineering in 2017, issue 64(10), pages 2411-2418.
