心音是诊断心血管疾病常用的医学信号之一。本文对心音正常/异常的二分类问题进行了研究,提出了一种基于极限梯度提升(XGBoost)和深度神经网络共同决策的心音分类算法,实现了对特征的选择和模型准确率的进一步提升。首先,本文对预处理后的心音信号进行心音分割,在此基础上提取了 5 个大类的特征,前 4 类特征采用递归特征消除法进行特征选择,作为 XGBoost 分类器的输入,最后一类为梅尔频率倒谱系数(MFCC),作为长短时记忆网络(LSTM)的输入。考虑到数据集的不平衡性,本文在两种分类器中皆使用了加权改进的方法。最后采用异质集成决策方法得到预测结果。将本文所提心音分类算法应用于 PhysioNet 网站在 2016 年发起的 PhysioNet 心脏病学挑战赛(CINC)所用公开心音数据库,以测试灵敏度、特异性、修正后的准确率以及 F 得分,结果分别为 93%、89.4%、91.2%、91.3%,通过与其他研究者应用机器学习、卷积神经网络(CNN)等方法的结果比较,在准确率和灵敏度上有明显提高,证明了本文方法能有效地提高心音信号分类的准确性,在部分心血管疾病的临床辅助诊断应用中有很大的潜力。
引用本文: 王子超, 金衍瑞, 赵利群, 刘成良. 基于极限梯度提升和深度神经网络共同决策的心音分类方法. 生物医学工程学杂志, 2021, 38(1): 10-20. doi: 10.7507/1001-5515.202006025 复制
引言
心血管疾病是全球第一死因,据世界卫生组织 2016 年统计,每年有 1 790 万人死于心血管疾病,占全球死亡人数的 31%,其中 85% 是因心脏病发作和中风所致[1]。心音是心脏收缩和舒张引起的振动产生的声音,现已作为诊断心血管疾病常用的医学信号之一。基本心音通常包括第一心音(first heart sound,S1)和第二心音(second heart sound,S2),是心脏周期中最容易辨认的声音。然而,心脏的机械活动可能引起其他声音,如第三、第四心音和一些心脏杂音等,在时域和频域上很难区分,造成异常和正常心音的分离也很困难。近几十年来,研究人员对心音的自动诊断识别展开了广泛的研究。
心音分析通常包括三个步骤:预处理、心音分割和心音分类。心音图通常受到不同类型的噪声污染,预处理中滤波的目的是为了消除这些噪声,确定基准点的位置,同时避免信号偏移。在滤波后,研究者往往会采取重采样或下采样,在保持数据一致性的基础上减少计算成本。心音分割是指确定心音信号中 S1、S2 和心脏的收缩期、舒张期 4 个状态的位置区间,在大多数研究中作为心音分类特征工程的前提。国内外研究学者对许多心音分割方法进行了研究,典型的方法可以分为四类:① 基于包络的方法;② 基于心音特征的方法;③ 基于机器学习的方法;④ 基于深度学习的方法。对于基于包络的方法,Moukadem 等[2]提出了一种通过 S 变换计算局部频谱的香农能量包络的方法。对于基于心音特征的方法,Pedrosa 等[3]利用自相关函数分析信号中的周期性分量特征来分割心音。对于基于机器学习的方法,Schimidt 等[4]基于隐式半马尔科夫模型(hidden semi-Markov models,HSMM)模拟心音的预期持续时间,利用包络和频带特征推导 HSMM 基于高斯分布的发射概率,该模型对心音的分割结果为 98.8% 的灵敏度和 98.6% 的阳性预测率。在 Schmidt 等[4]研究的基础上,Springer 等[5]基于 HSMM,利用逻辑回归进行发射概率估计,并改进维特比算法,在单独测试集上的平均 F1 得分为 95.63%。但是上述研究所用数据集没有足够多的心音记录,也没有公开发布数据便于其他研究者比较结果。为此,PhysioNet 网站在 2016 年以心脏病学(Computing in Cardiology,CINC)挑战赛的形式发布了公开心音数据集[6],记录了 7 个不同研究小组独立收集的 9 个心音数据库。基于此数据集,并随着深度学习的蓬勃发展,Messner 等[7]提出一种使用频谱和包络特征,基于深度递归神经网络的事件检测方法,该方法与当时最先进的 Springer 等[5]心音分割方法效果接近。Renna 等[8]结合了卷积神经网络(convolutional neural network,CNN)和 HSMM 时序建模方法,用于精准推断发射概率分布,阳性预测率为 94%。
目前很多最新的心音分析研究都基于上述提到的公开心音数据集,限于数据集标签的限制,心音分类通常为二分类(正常/异常)。心音分类方法一般分为两类:① 基于心音分割的分类方法;② 无需心音分割的分类方法。对于基于心音分割的分类,在 2016 PhysioNet CINC 挑战赛上,Potes 等[9] 基于 Springer 等[5]心音分割方法,对信号提取 124 个时频特征,并利用自适应增强(adaptive boosting,Adaboost)分类器对这些特征进行分类,此外还提取了 4 个频带的信号,将其输入一维 CNN 进行识别,两者共同决策分类,灵敏度和特异性的平均值(后文统称为平均准确率)为 86.02%。Chen 等[10]基于支持向量机(support vector machine,SVM)对心音的时频域特征进行了评估和扩展,再通过集成学习构建分类模型,该模型的灵敏度和特异性(后文统称为精度)为 95.9%、91.7%。Oztavli 等[11]提取时频、梅尔频率倒谱系数(Mel-frequency cepstral coefficients,MFCC)、心率等特征,得出了叠加分类器比单独分类器精度要高的结论。对于无需心音分割的分类,同年挑战赛上,Zabihi 等[12]直接提取 18 个时频域相关特征通过 20 个人工神经网络进行投票分类,平均准确率为 85.9%。Yadav 等[13]提取心音信号的倒谱特征和傅里叶变换特征,通过 SVM 分类的精度分别为 100%、90%。Upretee 等[14]提出了一种简单的时变频谱特征,即质心频率,通过 SVM 和 k 最近邻(k-nearest neighbors,kNN)分类器也取得了非常好的效果。Li 等[15]利用小波散射变换提取特征,采用多维缩放方法进行降维,通过双支持向量机分类的精度为 98%。Hamidi 等[16]采用了曲线拟合与将 MFCC、分形特征叠加融合两种特征提取的方法,分类器采用 kNN,第二种特征提取方法的分类结果较优,平均准确率为 77%。然而,上述部分研究[10]、[13-15]在实验数据集上存在一些问题:仅取公开数据集中的一部分记录,并且大大提升异常比例,没有考虑数据集不平衡的影响,这些方法在实验测试集上的精度可能比其应用在实际中的结果偏高。另外,这些基于机器学习的分类研究也存在一个不足:对心音信号特征的提取有些不完整,有些数量太大,部分模型虽然通过降维筛选了一部分特征,但缺少对特征的验证。
随着深度学习受到越来越广泛的关注,许多研究者也将其应用至心音分类领域。Ren 等[17]使用小波变换从等长切割的心音中提取比例图像并通过 CNN 对心音进行分类,该方法的分类效果要优于 SVM,但精度不高。Li 等[18]通过降噪自动编码器提取心音深层特征,利用 1 维 CNN 作为分类器,分类准确率为 99%。但是上述研究对原始数据集进行了扩展,将信号分为 3 s 的片段,样本从每一条心音记录优化为每一个片段,没有考虑到心音序列时长不等这一性质的影响,并且允许同一记录的片段出现在训练集和测试集中,因此分类准确率比实际偏高,不符合临床应用的环境。目前较为科学的研究是训练集和测试集来自于不同心音记录。Krishnan 等[19]采用一维 CNN 和前馈神经网络对未分割心音进行分类,平均准确率为 85.7%。Meintjes 等[20]将连续小波变换得到的尺度图作为特征通过 CNN 进行分类,平均准确率为 86%。Noman 等[21]开发了一维和二维 CNN 组合的时频集成 CNN,平均准确率为 88.8%。Singh 等[22]对心音进行连续小波变换得到二维图像,通过 Krizhevsky 等[23]提出的大型深层 CNN(AlexNet)训练,平均准确率为 90%。上述最新研究表明,基于深度神经网络的心音帧时频特征分类系统,优于一般机器学习方法或传统分类方法,目前分类的平均准确率在 90% 左右。不过,上述深度学习方法也存在忽略心音显性特征的问题。另外,Qian 等[24]提出了一种基于小波表示和深度递归神经网络的心音多分类(正常、轻度、严重)方法,为心音多分类的研究拓展了思路。
针对以往研究存在的关于实验数据集划分不规范、精度不高等问题,本文对分割后的心音特征展开研究,提出了一种基于极限梯度提升(extreme gradient boosting,XGBoost)和深度神经网络共同决策的心音分类算法。XGBoost 是由 Chen 等[25]提出的集成学习方法,在梯度增强决策树的基础上引入正则化项,现已被广泛应用于许多领域,例如 Shi 等[26]采用 XGBoost 对心电信号的多类特征进行分层聚类。而本文采用的深度神经网络为长短时记忆网络(long short-term memory network,LSTM),是 Hochreiter 等[27]提出的一种特殊的循环神经网络,可利用门控单元对细胞状态的信息进行增减控制。对比以往研究,本文算法创新点在于:① 对于心音信号提取的特征较之前研究的类别更广泛;② 对数量庞大的特征采取了递归特征消除法进行特征选择;③ 采取 XGBoost 和 LSTM 共同决策的方法进行分类,平均准确率较以往研究有所提高;④ 考虑了数据集不平衡的问题,对两种模型都进行了加权改进。为验证本文方法的有效性,将本研究所提算法应用于 2016 PhysioNet/CINC 挑战赛所使用的心音数据集[6],并基于 Springer 等[5]的心音分割方法,提取心音信号在时域、频域、小波变换、小波包变换、MFCC 的 5 类特征,通过递归特征消除法训练 XGBoost 模型,以 MFCC 作为 LSTM 的输入特征序列,以期分类准确率有较大提升,并提高对异常心音信号的识别灵敏度。综上所述,本文研究是基于 XGBoost 和 LSTM 共同决策的心音分类方法,以提升心音信号分类准确率为目的,对心音分析领域具有一定意义,旨在推动心音分类算法在心血管疾病临床诊断上的应用。
1 方法
如图 1 所示,本文提出的分类方法主要由三个阶段组成:① 预处理阶段,对信号进行滤波和消除尖峰处理,并对心音进行分割;② 特征提取阶段,根据心音分割结果提取出时域、频域、小波、小波包、MFCC 五大类特征,前四类特征采用递归特征消除法作为 XGBoost 的特征选择,MFCC 特征作为 LSTM 的输入序列特征;③ 分类阶段,采用基于 XGBoost 和 LSTM 的异质集成决策方法,得到最终的分类结果。

1.1 数据来源
本文使用的心音记录数据来自于 PhysioNet 网站上的心音记录的分类-2016 年心脏病学挑战赛(Classification of Heart Sound Recordings-The PhysioNet Computing in Cardiology Challenge 2016)数据库(网址为 https://www.physionet.org/content/challenge-2016/1.0.0/),该数据库是一个用于评估心音算法的开放访问数据库[6]。该数据库的心音信号从人体的 4 个不同部位采集,分别是主动脉区、肺心病区、三尖瓣区和二尖瓣区,共有 3 240 条样本记录,采样频率为 2 kHz,持续时间在 5~120 s 范围。心音记录被标记为两种类型:正常记录和异常记录。正常记录来自健康人群,异常记录来自心脏疾病确诊患者(通常包括心脏瓣膜缺损、冠心病等),异常记录没有更具体的分类。数据集是不平衡的,正常记录的数量为 2 575,异常记录的数量为 665。
1.2 预处理和心音分割
预处理的目的是为了消除心音信号中的噪声,平滑信号,这一操作不但能提升心音分割效果,并且能提升最终分类模型的性能。首先,对所有的心音记录进行下采样至 1 000 Hz,并用巴特沃思滤波器对采样后的信号进行 25~400 Hz 之间的带通滤波,消除低频和高频噪声影响。采用 Schmidt 等[4]在分割心音时的预处理方法消除信号尖峰,具体流程为:① 将信号分为多个 500 ms 的窗口;② 在每个窗口找到最大绝对振幅(maximum absolute amplitude,MAA);③ 如果至少有一个 MAA 超过平均 MAA 值的三倍,则选择具有最大 MAA 的窗口,定义 MAA 点的位置为尖峰的顶部,MAA 之前的最后一个过零点为尖峰的起始点,MAA 之后的第一个过零点为尖峰的结束点,消除尖峰代替为 0。
一般而言,心音信号的一个心动周期可以分为 S1、收缩期、S2、舒张期 4 个状态。对于后续自动心音分类方法而言,需要提取信号相关特征作为分类模型的输入。除此之外,为了保证信号输入的一致,对于数据集中的每一条心音记录,需要切割其信号初始部分以保证从 S1 状态开始。因此心音分割的目的是为了得到 S1、收缩期、S2、舒张期四个状态所包含的信息来作为后续心音分割方法的输入特征。
采用 Springer 等[5]基于逻辑回归和 HSMM 的心音分割方法,具体流程为:① 从预处理后的记录中提取同态包络、希伯特包络、正值小波包络、功率谱密度等特征向量,作为 HSMM 模型的观察序列;② 通过 Schmidt 等[4]对心脏周期和收缩期持续时间的估算定义,计算得到心率和收缩期的时间间隔;③ 设置 HSMM 模型隐藏序列为 S1、收缩期、S2、舒张期四个状态,假设各个状态的持续时间满足一个与心率和收缩期时间间隔相关的高斯分布,并引入状态持续时间概率;④ 每一个状态的观测概率由一个逻辑回归模型估计得到,并且通过贝叶斯公式计算发射概率;⑤ 通过扩展持续时间的 Viterbi 算法来估计最可能的状态序列以及达到该状态序列的可能性。
1.3 特征提取
对于心音信号的特征提取,Liu 等[6]综合部分文献,从心音分割的 4 种状态的位置信息中提取了 20 个特征。为了充分利用心音信号中的隐藏信息,本文提取的特征在表 1 中列出,并在下面对其进行了说明。

时域特征分为时域间隔特征和时域振幅特征,在心音分割得到 S1、S2、收缩期、间隔期的位置后,分别计算其时间间隔、平均振幅、偏度、峰度等特征,并在每个心脏跳动周期内计算平均值和标准差。
频域特征通过汉明窗和离散傅里叶变换估计 S1、收缩期、S2、舒张期四个心音状态的功率谱,将频域划分为 9 个频带(25~45 Hz、45~65 Hz、65~85 Hz、85~105 Hz、105~125 Hz、125~150 Hz、150~200 Hz、200~300 Hz、300~500 Hz),取四个状态在这 9 个频带上的中值功率的平均值。
小波变换特征利用 db4 小波对心音信号进行 5 层分解,得到了不同频率区间的小波分解系数,包括第 1~5 层的细节系数,记为变量 cD1~cD5,以及一个近似系数,记为变量 cA5,然后根据每一层小波系数得到不同频率区间的重构信号,细节系数重构的信号记为 D1~D5,近似系数重构的信号记为 A5。小波变换特征分为系数特征和能量特征。系数特征取第 3、4、5 层的细节系数 cD3~cD5 和近似系数 cA5 的最大值、最小值、均值和标准差。能量特征取每个周期内四个心音状态在重构信号 D3~D5 和 A5 上的单位频率能量的平均值。
小波包熵特征利用 db4 小波对心音信号进行 5 层小波包分解,得到除根节点(原始信号)外的 62 个节点的小波包系数,取最后一层共 32 个节点的小波包熵。
MFCC 是梅尔刻度频域提取出的倒谱参数。先对信号进行预加重,然后分帧、加窗,通过快速傅里叶变换得到各帧的频谱和功率谱。通过梅尔刻度滤波器将频率范围刻画在梅尔刻度区间的多个频域子带上,对子带能量求对数,最后通过离散余弦变换得到 MFCC 系数,表示心音信号时域上的每一帧在梅尔刻度频域上的能量系数。
此阶段提取的时域、频域特征、小波变换特征和小波包熵特征作为 XGBoost 分类器的输入特征,提取的 MFCC 矩阵作为 LSTM 的输入特征。
1.4 递归特征消除
上一节提取的特征一共有 136 个,数量庞大,容易出现过拟合,因此需要对特征进行筛选。采用递归特征消除,通过重复训练模型,对特征进行排序,去除分数最小的特征,其流程如下:
(1)假设初始有 M 维特征,特征集为 F = [f1,f2,,fM],并且初始化排序后的特征集为 R = [];
(2)如果 F ≠ Ø:
(a)样本从 F 中选取特征,训练模型;
(b)计算模型中每个特征的得分(XGBoost 模型中的得分为特征重要性):sk,k = 1,2,,M;
(c)找到分数最小的特征:f * = argmin(sk);
(d)从 F 中去除 f *,更新 R = [f *,R];
(3)从 R 中选择排名较高的特征。
1.5 XGBoost
XGBoost[24]是一种基于决策树的集成学习提升方法,将弱的基分类器组合为更强的分类器。
假设共有 K 个基分类器,对于输入样本 xi,其输出 为 K 个基模型结果的累加之和,如式(1)所示:
![]() |
其中,fk(xi)是第 k 个基模型对于 xi 的输出, 是所有树的集合。目标函数 Obj 加入了正则化项,如式(2)所示:
![]() |
其中,l(yi,)为损失函数,度量预测值
和真实值 yi 的偏差,Ω(fk)为正则项,衡量树的复杂性。学习至第 t 棵树时,假设第 t 次迭代要训练的树模型为 ft(xi),
为前 t − 1 棵树的预测结果,则此时目标函数 Obj(t)如式(3)所示:
![]() |
通过泰勒展开后简化常数项,式(3)可转化为如式(4)所示:
![]() |
其中,gi 为 l(yi,)对
的一阶偏导数,hi 为 l(yi,
)对
的二阶偏导数,Ω(ft)为正则项,其定义如式(5)所示:
![]() |
其中,T 是树的叶子数, 为 T 维叶子节点权重向量的 L2 范数,γ、λ 为描述叶子数复杂性和惩罚尺度的常数系数。假设样本与叶子节点的映射关系为 q,第 j 个叶子节点的样本集合为 Ij 如式(6)所示:
![]() |
则,式(5)可转化为:
![]() |
定义函数,则,式(7)可以简化为如式(8)所示:
![]() |
假设树的结构是固定的,对目标函数 Obj(t)最小化可以求出所有叶子权重的最优值 ωj*,如式(9)所示:
![]() |
此时目标函数 Obj(t)的最优值也可计算得到,如式(10)所示:
![]() |
在训练过程中,XGBoost 采用贪心算法选择最优分裂节点,定义每次分裂后的左右两个子树集合为 IL、IR,式(8)定义的函数 G、H 对应为 GL、HL、GR、HR,于是评估每个特征在每个特征值上的收益 Gain,如式(11)所示:
![]() |
1.6 LSTM
LSTM[26]是循环神经网络的一种,其网络层结构如图 2 所示。

t 时刻 LSTM 模块包含两个传输状态:细胞状态矩阵 Ct 传递的是 t 时刻之前历史信息的选择性记忆,隐藏状态矩阵 ht 存储的是当前 t 时刻的总体信息。LSTM 由三个门控单元组成:遗忘门、输入门和输出门。LSTM 在 t 时刻工作时一共有四个阶段:
(1)遗忘阶段:ztf 作为遗忘门,控制上一个状态 Ct 信息的保留比例,其表达式如式(12)所示:
![]() |
其中,Wf 为隐藏层 ht − 1 和输入 xt 在遗忘门的的权重矩阵,bf 为截距,σ 为 sigmoid 函数,将输出映射在[0,1]之间,表示遗忘部分的选择比例。
(2)存储阶段:确定需要在细胞状态中保存的信息。第一部分,zti 为输入门,确定哪些信息需要更新,其表达式如式(13)所示:
![]() |
其中,Wi 为 ht − 1 和 xt 在输入门的的权重矩阵,bi 为截距。第二部分,通过一个 tanh 层创建一个实质信息向量 zt,其表达式如式(14)所示:
![]() |
其中,WC 为 ht − 1 和 xt 在此部分对应的权重矩阵,bC 为截距,tanh 为双曲正切函数,作为激活函数。
(3)更新阶段:将 Ct − 1 保留下的信息加上 t 时刻输入的信息,从而更新 Ct,其表达式如式(15)所示:
![]() |
其中,“”为哈达玛积运算。ztf 为遗忘门保留的比例,Ct − 1 为实质信息,两者结合就是保留下的历史信息。同理,zti 与 zt 结合为实际输入的信息。
(4)输出阶段:zto 作为输出门,确定细胞状态中可以输出的信息,其表达式如式(16)所示:
![]() |
其中,Wo 为 ht-1 和 xt 在输出门的权重矩阵,bo 为截距。zto 与当前时刻选择性记忆的实质信息 Ct 结合,得到当前状态的输出 ht,其表达式如式(17)所示:
![]() |
其中,tanh 函数对 Ct 进行了放缩。最终输出 yt 的表达式如式(18)所示:
![]() |
其中,Wyh、by 为此部分的权重矩阵和截距。
1.7 异质集成决策方法
分类决策方法借鉴集成学习中投票法的硬投票思想,考虑基分类器的准确性和多样性,采用 XGBoost 和 LSTM 两种高效模型的异质集成方式,得到最终的分类结果。异质不仅体现在分类器类型不同、算法不同,在训练时提取的特征也不同。
为了提升预测模型对异常的灵敏度,最终的决策方法对硬投票也进行了改进,基于整个数据集异常记录较少的事实。XGBoost 为正常/异常的二分类模型,而 LSTM 的预测结果除了正常/异常外,加入了不确定的结果选项。所以将决策规则定义为:若 LSTM 预测为异常,则最终分类结果为异常;若 LSTM 预测为正常或者不确定,则最终分类结果为 XGBoost 的分类结果,如图 3 所示。

2 实验设计
2.1 评价指标
本研究采用灵敏度 Se,特异性 Sp 和准确率 Acc 来评估分类器的性能,如式(19)~式(21)所示:
![]() |
![]() |
![]() |
其中,TP 为真阳性,表示正确预测异常的数量;FN 为假阴性,表示异常未被预测的数量;TN 为真阴性,表示正确预测正常的数量;FP 为假阳性,表示被错误预测为异常的数量。
在对心音记录分类过程中,除了异常和正常之外,可能会出现由于噪声或信号质量差等原因对预测不确定的情况。因此根据 PhysioNet 挑战赛[6]确定的分数规则,对灵敏度 Se 和特异性 Sp 添加不确定权重系数(这里设为 0.5)进行修正,修正后的准确率 MAcc 如式(22)所示:
![]() |
考虑到临床上假阴比假阳的风险大很多,漏诊会耽误治疗,而假阳可以通过进一步检查排除,因此适当增加灵敏度权重,更具有临床价值。本实验引入另一项评价指标 F 得分 Fβ,综合灵敏度和特异性的调和值,如式(23)所示:
![]() |
为了适当提升灵敏度的重要性,β 取值要大于 1,本实验取 β = 1.1,F 得分记为 F1.1。
2.2 XGBoost 模型设计
通过数学软件 Matlab 2016a(MathWorks,美国)对心音数据集的 3 240 条心音记录进行预处理和心音分割,提取了前四个类别的 136 个特征。通过 Python 编程语言开发撰写时使用的集成开发环境 PyCharm 2020.1(JetBrains,捷克)对这些特征进行缺失值和归一化处理,然后以 XGBoost 的特征重要性为得分排名的依据,对所有记录的 136 个特征进行 3 折交叉验证的递归特征消除,XGBoost 的特征重要性通过式(11)计算的收益 Gain 得到。选择得分排名前 20 的特征,作为 XGBoost 的输入特征,如图 4 所示,纵坐标显示的特征与表 1 中的特征标记一一对应。

随后,对数据集进行划分,测试集比例为 0.3,由于数据集正负样本不平衡,划分时采用分层抽样,确保正常/异常两个标签对应的样本比例。
对训练集采用 5 折交叉验证的网格搜索方法,比较 XGBoost 模型对应每一种情况的得分,选择最优的模型参数。首先确定需优化参数的网格搜索范围与搜索步长,然后通过每一轮情况的损失函数计算相对应的模型得分,选择得分最高的模型为最优模型。实验得到最优模型参数:树的个数为 500,树的深度为 5 层,叶子节点最小权重为 2,惩罚项系数为 0,L1 正则化系数为 10,L2 正则化系数为 3,学习率为 0.05。由于数据集正负样本不平衡,正常异常比例在 4:1 左右,因此设置模型参数中的异常权重为 4。最后将得到的 XGBoost 最优模型应用于测试集上,预测分类结果。
2.3 MFCC-LSTM 模型设计
对训练集的心音记录进行移位,保证从 S1 状态开始,然后进行 3 s 等时间段切割(因为心动周期一般为 1 s 左右,保证切割后的每一段心音都能保留一个完整的心动周期),确保得到的 MFCC 特征时间长度相等。使用 Python 对切割后的心音进行 MFCC 分析,设置参数:窗口为汉明窗,帧长(窗口长度)为 25 ms,帧移(窗口之间步长)为 10 ms,返回的倒谱数量为 12,滤波器组中过滤器数量为 26 个,快速傅里叶变换的采样点数为 512,倒谱的正弦升降参数为 22。
训练集中的 2 268 个心音样本经过切割和 MFCC 分析后,转变为 15 733 个 MFCC 样本,作为 LSTM 训练的输入,标签也随之扩展。每个样本的输入特征维度为,表示心音记录在 299 帧时间段内,在 12 个梅尔刻度等级上的倒谱特征,明显包含时序特征,因此 LSTM 架构如图 5 所示,时间步 t 的总长为 299,每一时间步的输入 xt 维度为 12,隐藏层为 l 层,每一层含 s 个隐藏元,即每一层的隐藏状态信息 ih(t)(i = 0,1,
,l)为 s 维向量,皆随着时间步 t 而传递,同时传递的还有细胞状态信息 C(t),输出 y(t)为 2 维向量,表示异常和正常两种标签的概率,因此,最后一个时间步 t = 299 时的输出 y(299)为最终的模型输出 out。

训练 LSTM 模型时采用批处理,训练轮数(epoch)为 20,每轮的批次(batch)为 50,学习率为 0.001,每个批次中设置随机失活(dropout)为 0.5,通过忽略一半的隐层节点减少过拟合。优化参数的权重更新采用自适应矩估计(adaptive moment,Adam)优化器,损失函数使用的是交叉熵损失函数,由于正负样本不平衡,在损失函数中设置正常、异常标签的权重比例为 0.2 和 0.8。调整网络的超参数(隐藏层数 l,隐藏元个数 s)的范围分别为{20,50,100,150,200}和{1,2,3},比较其结果。
对于测试集中的心音记录也进行切割和 MFCC 分析,每一条记录由多个心音片段的 MFCC 特征组成,每一个特征通过训练的 LSTM 进行预测,最后对这一条记录得到的多个分类结果进行硬投票:取输出最多的那一类标签(如果心音被切割为偶数段,且两类标签数量相等,则结果为不确定)。
3 实验结果和讨论
3.1 实验结果
将得到的 XGBoost 模型在测试集上进行预测,根据式(19)~式(23)计算模型得分:Acc = 92.3%、Se = 76.9%、Sp = 96.2%、MAcc = 86.6%、F1.1 = 84.6%。
LSTM 采用不同结构(隐藏层数,每层隐藏元数)进行实验。如表 2 所示列出了所有结构的实验预测结果,发现 LSTM 的预测结果对异常的灵敏度普遍都很高,由于异常在样本中的比例较低,造成准确率略低,但修正后的准确率是令人满意的;隐藏元较少时,准确率较低,但当隐藏元个数增加到一定程度时,对结果影响不大;隐藏层数的增加对结果有一定帮助,2 层效果最佳。因此取 2 层 100 隐藏元。

最后采用 1.7 小节中决策方法对 XGBoost 和 LSTM 共同决策,最终模型预测结果为:Acc = 90.1%、Se = 93.0%、Sp = 89.4%、MAcc = 91.2%、F1.1 = 91.3%。
3.2 预处理方法的对比实验
为了验证预处理步骤对心音分类方法的影响,本文还增加了一组对比实验,用于分析预处理步骤对 LSTM 模型分类性能的影响。在对比实验中,取消预处理步骤,直接进行心音分割,提取特征,最后通过 LSTM 模型分类的实验结果为:Se = 88.4%、Sp = 86.1%、MAcc = 87.3%、F1.1 = 87.4%,发现各项评估得分都低于 3.1 小节中有预处理步骤的 LSTM 预测结果(Se = 91.7%、Sp = 88.3%、MAcc = 90.0%、F1.1 = 90.2%)。对比实验结果表明,预处理步骤能提升该心音分类模型的性能。
3.3 比较与讨论
本实验研究了不同深度神经网络对心音分类的影响,对心音信号划分相同训练集,提取 MFCC 特征,然后使用了以下分类方法:① CNN 分类;② LSTM 分类;③ 分别通过单独的 CNN 和单独的 LSTM,最后通过融合层合并在一起分类;④ 采用 Sainath 等[28]提出的卷积-长短时记忆-全连接深度神经网络(convolutional,long short-term memory,fully connected deep neural networks,CLDNN),即先通过 CNN 再通过 LSTM,最后通过全连接层分类。为了使本文研究方法的高效性更具有说服力,本实验结果也与最新的基于同一数据集的心音分类方法,即文献[9, 12, 16, 19-22]中的方法进行比较。所有心音分类方法的性能比较如表 3 所示。

结果表明:① 深度神经网络与传统机器学习方法比较,对心音分类的效果(MAcc 和 F1.1)更好,主要体现在对异常记录识别的灵敏度更高,虽然整个数据集异常比例较少,造成误诊的成本增加,但是大大降低了漏诊的风险。② 在深度神经网络的研究中,纯粹的 LSTM 比其他网络的分类效果要更好,主要因为提取的 MFCC 特征具有明显的时序性,适用于 LSTM 网络,而 CNN 对于时域和频域特征维度的提取可能引起一些信息的遗失,因此本文采用的是 LSTM 网络。③ 本文提出的基于 XGBoost 和 LSTM 的共同决策方法,XGBoost 保证分类的特异性较高,进一步引入 LSTM 共同决策,在略微降低特异性的前提下大幅提升了整个分类模型的灵敏度,最终分类的准确率比目前最新的方法有所提升。
4 结论
本文提出了一种基于 XGBoost 和 LSTM 共同决策的心音分类方法。首先,在心音分割确定 S1、收缩期、S2、舒张期四个状态的基础上,提取了四个类别的 136 个特征,通过递归特征消除法筛选出 20 个特征作为 XGBoost 分类器的输入特征。其次,提取了具有时序性的 MFCC 特征,作为深度神经网络 LSTM 的输入。最终对这两种模型的分类结果进行决策,得到最后的分类结果。实验中,本文分别对 XGBoost 和 LSTM 分类器的调优采用了网格搜索法和结构调参法,选取了各自的最优模型,并针对数据集不平衡问题,在各自模型中分别加入加权改进。结果表明,该方法在测试集上对心音异常/正常的分类结果为:Acc = 90.1%、Se = 93.0%、Sp = 89.4%、MAcc = 91.2%、F1.1 = 91.3%,与最新的其他分类方法相比,该方法在准确性和灵敏度上有所提升,达到了更好的分类效果,为部分心血管疾病的临床辅助诊断提供一种较好的选择。
利益冲突声明:本文全体作者均声明不存在利益冲突。
引言
心血管疾病是全球第一死因,据世界卫生组织 2016 年统计,每年有 1 790 万人死于心血管疾病,占全球死亡人数的 31%,其中 85% 是因心脏病发作和中风所致[1]。心音是心脏收缩和舒张引起的振动产生的声音,现已作为诊断心血管疾病常用的医学信号之一。基本心音通常包括第一心音(first heart sound,S1)和第二心音(second heart sound,S2),是心脏周期中最容易辨认的声音。然而,心脏的机械活动可能引起其他声音,如第三、第四心音和一些心脏杂音等,在时域和频域上很难区分,造成异常和正常心音的分离也很困难。近几十年来,研究人员对心音的自动诊断识别展开了广泛的研究。
心音分析通常包括三个步骤:预处理、心音分割和心音分类。心音图通常受到不同类型的噪声污染,预处理中滤波的目的是为了消除这些噪声,确定基准点的位置,同时避免信号偏移。在滤波后,研究者往往会采取重采样或下采样,在保持数据一致性的基础上减少计算成本。心音分割是指确定心音信号中 S1、S2 和心脏的收缩期、舒张期 4 个状态的位置区间,在大多数研究中作为心音分类特征工程的前提。国内外研究学者对许多心音分割方法进行了研究,典型的方法可以分为四类:① 基于包络的方法;② 基于心音特征的方法;③ 基于机器学习的方法;④ 基于深度学习的方法。对于基于包络的方法,Moukadem 等[2]提出了一种通过 S 变换计算局部频谱的香农能量包络的方法。对于基于心音特征的方法,Pedrosa 等[3]利用自相关函数分析信号中的周期性分量特征来分割心音。对于基于机器学习的方法,Schimidt 等[4]基于隐式半马尔科夫模型(hidden semi-Markov models,HSMM)模拟心音的预期持续时间,利用包络和频带特征推导 HSMM 基于高斯分布的发射概率,该模型对心音的分割结果为 98.8% 的灵敏度和 98.6% 的阳性预测率。在 Schmidt 等[4]研究的基础上,Springer 等[5]基于 HSMM,利用逻辑回归进行发射概率估计,并改进维特比算法,在单独测试集上的平均 F1 得分为 95.63%。但是上述研究所用数据集没有足够多的心音记录,也没有公开发布数据便于其他研究者比较结果。为此,PhysioNet 网站在 2016 年以心脏病学(Computing in Cardiology,CINC)挑战赛的形式发布了公开心音数据集[6],记录了 7 个不同研究小组独立收集的 9 个心音数据库。基于此数据集,并随着深度学习的蓬勃发展,Messner 等[7]提出一种使用频谱和包络特征,基于深度递归神经网络的事件检测方法,该方法与当时最先进的 Springer 等[5]心音分割方法效果接近。Renna 等[8]结合了卷积神经网络(convolutional neural network,CNN)和 HSMM 时序建模方法,用于精准推断发射概率分布,阳性预测率为 94%。
目前很多最新的心音分析研究都基于上述提到的公开心音数据集,限于数据集标签的限制,心音分类通常为二分类(正常/异常)。心音分类方法一般分为两类:① 基于心音分割的分类方法;② 无需心音分割的分类方法。对于基于心音分割的分类,在 2016 PhysioNet CINC 挑战赛上,Potes 等[9] 基于 Springer 等[5]心音分割方法,对信号提取 124 个时频特征,并利用自适应增强(adaptive boosting,Adaboost)分类器对这些特征进行分类,此外还提取了 4 个频带的信号,将其输入一维 CNN 进行识别,两者共同决策分类,灵敏度和特异性的平均值(后文统称为平均准确率)为 86.02%。Chen 等[10]基于支持向量机(support vector machine,SVM)对心音的时频域特征进行了评估和扩展,再通过集成学习构建分类模型,该模型的灵敏度和特异性(后文统称为精度)为 95.9%、91.7%。Oztavli 等[11]提取时频、梅尔频率倒谱系数(Mel-frequency cepstral coefficients,MFCC)、心率等特征,得出了叠加分类器比单独分类器精度要高的结论。对于无需心音分割的分类,同年挑战赛上,Zabihi 等[12]直接提取 18 个时频域相关特征通过 20 个人工神经网络进行投票分类,平均准确率为 85.9%。Yadav 等[13]提取心音信号的倒谱特征和傅里叶变换特征,通过 SVM 分类的精度分别为 100%、90%。Upretee 等[14]提出了一种简单的时变频谱特征,即质心频率,通过 SVM 和 k 最近邻(k-nearest neighbors,kNN)分类器也取得了非常好的效果。Li 等[15]利用小波散射变换提取特征,采用多维缩放方法进行降维,通过双支持向量机分类的精度为 98%。Hamidi 等[16]采用了曲线拟合与将 MFCC、分形特征叠加融合两种特征提取的方法,分类器采用 kNN,第二种特征提取方法的分类结果较优,平均准确率为 77%。然而,上述部分研究[10]、[13-15]在实验数据集上存在一些问题:仅取公开数据集中的一部分记录,并且大大提升异常比例,没有考虑数据集不平衡的影响,这些方法在实验测试集上的精度可能比其应用在实际中的结果偏高。另外,这些基于机器学习的分类研究也存在一个不足:对心音信号特征的提取有些不完整,有些数量太大,部分模型虽然通过降维筛选了一部分特征,但缺少对特征的验证。
随着深度学习受到越来越广泛的关注,许多研究者也将其应用至心音分类领域。Ren 等[17]使用小波变换从等长切割的心音中提取比例图像并通过 CNN 对心音进行分类,该方法的分类效果要优于 SVM,但精度不高。Li 等[18]通过降噪自动编码器提取心音深层特征,利用 1 维 CNN 作为分类器,分类准确率为 99%。但是上述研究对原始数据集进行了扩展,将信号分为 3 s 的片段,样本从每一条心音记录优化为每一个片段,没有考虑到心音序列时长不等这一性质的影响,并且允许同一记录的片段出现在训练集和测试集中,因此分类准确率比实际偏高,不符合临床应用的环境。目前较为科学的研究是训练集和测试集来自于不同心音记录。Krishnan 等[19]采用一维 CNN 和前馈神经网络对未分割心音进行分类,平均准确率为 85.7%。Meintjes 等[20]将连续小波变换得到的尺度图作为特征通过 CNN 进行分类,平均准确率为 86%。Noman 等[21]开发了一维和二维 CNN 组合的时频集成 CNN,平均准确率为 88.8%。Singh 等[22]对心音进行连续小波变换得到二维图像,通过 Krizhevsky 等[23]提出的大型深层 CNN(AlexNet)训练,平均准确率为 90%。上述最新研究表明,基于深度神经网络的心音帧时频特征分类系统,优于一般机器学习方法或传统分类方法,目前分类的平均准确率在 90% 左右。不过,上述深度学习方法也存在忽略心音显性特征的问题。另外,Qian 等[24]提出了一种基于小波表示和深度递归神经网络的心音多分类(正常、轻度、严重)方法,为心音多分类的研究拓展了思路。
针对以往研究存在的关于实验数据集划分不规范、精度不高等问题,本文对分割后的心音特征展开研究,提出了一种基于极限梯度提升(extreme gradient boosting,XGBoost)和深度神经网络共同决策的心音分类算法。XGBoost 是由 Chen 等[25]提出的集成学习方法,在梯度增强决策树的基础上引入正则化项,现已被广泛应用于许多领域,例如 Shi 等[26]采用 XGBoost 对心电信号的多类特征进行分层聚类。而本文采用的深度神经网络为长短时记忆网络(long short-term memory network,LSTM),是 Hochreiter 等[27]提出的一种特殊的循环神经网络,可利用门控单元对细胞状态的信息进行增减控制。对比以往研究,本文算法创新点在于:① 对于心音信号提取的特征较之前研究的类别更广泛;② 对数量庞大的特征采取了递归特征消除法进行特征选择;③ 采取 XGBoost 和 LSTM 共同决策的方法进行分类,平均准确率较以往研究有所提高;④ 考虑了数据集不平衡的问题,对两种模型都进行了加权改进。为验证本文方法的有效性,将本研究所提算法应用于 2016 PhysioNet/CINC 挑战赛所使用的心音数据集[6],并基于 Springer 等[5]的心音分割方法,提取心音信号在时域、频域、小波变换、小波包变换、MFCC 的 5 类特征,通过递归特征消除法训练 XGBoost 模型,以 MFCC 作为 LSTM 的输入特征序列,以期分类准确率有较大提升,并提高对异常心音信号的识别灵敏度。综上所述,本文研究是基于 XGBoost 和 LSTM 共同决策的心音分类方法,以提升心音信号分类准确率为目的,对心音分析领域具有一定意义,旨在推动心音分类算法在心血管疾病临床诊断上的应用。
1 方法
如图 1 所示,本文提出的分类方法主要由三个阶段组成:① 预处理阶段,对信号进行滤波和消除尖峰处理,并对心音进行分割;② 特征提取阶段,根据心音分割结果提取出时域、频域、小波、小波包、MFCC 五大类特征,前四类特征采用递归特征消除法作为 XGBoost 的特征选择,MFCC 特征作为 LSTM 的输入序列特征;③ 分类阶段,采用基于 XGBoost 和 LSTM 的异质集成决策方法,得到最终的分类结果。

1.1 数据来源
本文使用的心音记录数据来自于 PhysioNet 网站上的心音记录的分类-2016 年心脏病学挑战赛(Classification of Heart Sound Recordings-The PhysioNet Computing in Cardiology Challenge 2016)数据库(网址为 https://www.physionet.org/content/challenge-2016/1.0.0/),该数据库是一个用于评估心音算法的开放访问数据库[6]。该数据库的心音信号从人体的 4 个不同部位采集,分别是主动脉区、肺心病区、三尖瓣区和二尖瓣区,共有 3 240 条样本记录,采样频率为 2 kHz,持续时间在 5~120 s 范围。心音记录被标记为两种类型:正常记录和异常记录。正常记录来自健康人群,异常记录来自心脏疾病确诊患者(通常包括心脏瓣膜缺损、冠心病等),异常记录没有更具体的分类。数据集是不平衡的,正常记录的数量为 2 575,异常记录的数量为 665。
1.2 预处理和心音分割
预处理的目的是为了消除心音信号中的噪声,平滑信号,这一操作不但能提升心音分割效果,并且能提升最终分类模型的性能。首先,对所有的心音记录进行下采样至 1 000 Hz,并用巴特沃思滤波器对采样后的信号进行 25~400 Hz 之间的带通滤波,消除低频和高频噪声影响。采用 Schmidt 等[4]在分割心音时的预处理方法消除信号尖峰,具体流程为:① 将信号分为多个 500 ms 的窗口;② 在每个窗口找到最大绝对振幅(maximum absolute amplitude,MAA);③ 如果至少有一个 MAA 超过平均 MAA 值的三倍,则选择具有最大 MAA 的窗口,定义 MAA 点的位置为尖峰的顶部,MAA 之前的最后一个过零点为尖峰的起始点,MAA 之后的第一个过零点为尖峰的结束点,消除尖峰代替为 0。
一般而言,心音信号的一个心动周期可以分为 S1、收缩期、S2、舒张期 4 个状态。对于后续自动心音分类方法而言,需要提取信号相关特征作为分类模型的输入。除此之外,为了保证信号输入的一致,对于数据集中的每一条心音记录,需要切割其信号初始部分以保证从 S1 状态开始。因此心音分割的目的是为了得到 S1、收缩期、S2、舒张期四个状态所包含的信息来作为后续心音分割方法的输入特征。
采用 Springer 等[5]基于逻辑回归和 HSMM 的心音分割方法,具体流程为:① 从预处理后的记录中提取同态包络、希伯特包络、正值小波包络、功率谱密度等特征向量,作为 HSMM 模型的观察序列;② 通过 Schmidt 等[4]对心脏周期和收缩期持续时间的估算定义,计算得到心率和收缩期的时间间隔;③ 设置 HSMM 模型隐藏序列为 S1、收缩期、S2、舒张期四个状态,假设各个状态的持续时间满足一个与心率和收缩期时间间隔相关的高斯分布,并引入状态持续时间概率;④ 每一个状态的观测概率由一个逻辑回归模型估计得到,并且通过贝叶斯公式计算发射概率;⑤ 通过扩展持续时间的 Viterbi 算法来估计最可能的状态序列以及达到该状态序列的可能性。
1.3 特征提取
对于心音信号的特征提取,Liu 等[6]综合部分文献,从心音分割的 4 种状态的位置信息中提取了 20 个特征。为了充分利用心音信号中的隐藏信息,本文提取的特征在表 1 中列出,并在下面对其进行了说明。

时域特征分为时域间隔特征和时域振幅特征,在心音分割得到 S1、S2、收缩期、间隔期的位置后,分别计算其时间间隔、平均振幅、偏度、峰度等特征,并在每个心脏跳动周期内计算平均值和标准差。
频域特征通过汉明窗和离散傅里叶变换估计 S1、收缩期、S2、舒张期四个心音状态的功率谱,将频域划分为 9 个频带(25~45 Hz、45~65 Hz、65~85 Hz、85~105 Hz、105~125 Hz、125~150 Hz、150~200 Hz、200~300 Hz、300~500 Hz),取四个状态在这 9 个频带上的中值功率的平均值。
小波变换特征利用 db4 小波对心音信号进行 5 层分解,得到了不同频率区间的小波分解系数,包括第 1~5 层的细节系数,记为变量 cD1~cD5,以及一个近似系数,记为变量 cA5,然后根据每一层小波系数得到不同频率区间的重构信号,细节系数重构的信号记为 D1~D5,近似系数重构的信号记为 A5。小波变换特征分为系数特征和能量特征。系数特征取第 3、4、5 层的细节系数 cD3~cD5 和近似系数 cA5 的最大值、最小值、均值和标准差。能量特征取每个周期内四个心音状态在重构信号 D3~D5 和 A5 上的单位频率能量的平均值。
小波包熵特征利用 db4 小波对心音信号进行 5 层小波包分解,得到除根节点(原始信号)外的 62 个节点的小波包系数,取最后一层共 32 个节点的小波包熵。
MFCC 是梅尔刻度频域提取出的倒谱参数。先对信号进行预加重,然后分帧、加窗,通过快速傅里叶变换得到各帧的频谱和功率谱。通过梅尔刻度滤波器将频率范围刻画在梅尔刻度区间的多个频域子带上,对子带能量求对数,最后通过离散余弦变换得到 MFCC 系数,表示心音信号时域上的每一帧在梅尔刻度频域上的能量系数。
此阶段提取的时域、频域特征、小波变换特征和小波包熵特征作为 XGBoost 分类器的输入特征,提取的 MFCC 矩阵作为 LSTM 的输入特征。
1.4 递归特征消除
上一节提取的特征一共有 136 个,数量庞大,容易出现过拟合,因此需要对特征进行筛选。采用递归特征消除,通过重复训练模型,对特征进行排序,去除分数最小的特征,其流程如下:
(1)假设初始有 M 维特征,特征集为 F = [f1,f2,,fM],并且初始化排序后的特征集为 R = [];
(2)如果 F ≠ Ø:
(a)样本从 F 中选取特征,训练模型;
(b)计算模型中每个特征的得分(XGBoost 模型中的得分为特征重要性):sk,k = 1,2,,M;
(c)找到分数最小的特征:f * = argmin(sk);
(d)从 F 中去除 f *,更新 R = [f *,R];
(3)从 R 中选择排名较高的特征。
1.5 XGBoost
XGBoost[24]是一种基于决策树的集成学习提升方法,将弱的基分类器组合为更强的分类器。
假设共有 K 个基分类器,对于输入样本 xi,其输出 为 K 个基模型结果的累加之和,如式(1)所示:
![]() |
其中,fk(xi)是第 k 个基模型对于 xi 的输出, 是所有树的集合。目标函数 Obj 加入了正则化项,如式(2)所示:
![]() |
其中,l(yi,)为损失函数,度量预测值
和真实值 yi 的偏差,Ω(fk)为正则项,衡量树的复杂性。学习至第 t 棵树时,假设第 t 次迭代要训练的树模型为 ft(xi),
为前 t − 1 棵树的预测结果,则此时目标函数 Obj(t)如式(3)所示:
![]() |
通过泰勒展开后简化常数项,式(3)可转化为如式(4)所示:
![]() |
其中,gi 为 l(yi,)对
的一阶偏导数,hi 为 l(yi,
)对
的二阶偏导数,Ω(ft)为正则项,其定义如式(5)所示:
![]() |
其中,T 是树的叶子数, 为 T 维叶子节点权重向量的 L2 范数,γ、λ 为描述叶子数复杂性和惩罚尺度的常数系数。假设样本与叶子节点的映射关系为 q,第 j 个叶子节点的样本集合为 Ij 如式(6)所示:
![]() |
则,式(5)可转化为:
![]() |
定义函数,则,式(7)可以简化为如式(8)所示:
![]() |
假设树的结构是固定的,对目标函数 Obj(t)最小化可以求出所有叶子权重的最优值 ωj*,如式(9)所示:
![]() |
此时目标函数 Obj(t)的最优值也可计算得到,如式(10)所示:
![]() |
在训练过程中,XGBoost 采用贪心算法选择最优分裂节点,定义每次分裂后的左右两个子树集合为 IL、IR,式(8)定义的函数 G、H 对应为 GL、HL、GR、HR,于是评估每个特征在每个特征值上的收益 Gain,如式(11)所示:
![]() |
1.6 LSTM
LSTM[26]是循环神经网络的一种,其网络层结构如图 2 所示。

t 时刻 LSTM 模块包含两个传输状态:细胞状态矩阵 Ct 传递的是 t 时刻之前历史信息的选择性记忆,隐藏状态矩阵 ht 存储的是当前 t 时刻的总体信息。LSTM 由三个门控单元组成:遗忘门、输入门和输出门。LSTM 在 t 时刻工作时一共有四个阶段:
(1)遗忘阶段:ztf 作为遗忘门,控制上一个状态 Ct 信息的保留比例,其表达式如式(12)所示:
![]() |
其中,Wf 为隐藏层 ht − 1 和输入 xt 在遗忘门的的权重矩阵,bf 为截距,σ 为 sigmoid 函数,将输出映射在[0,1]之间,表示遗忘部分的选择比例。
(2)存储阶段:确定需要在细胞状态中保存的信息。第一部分,zti 为输入门,确定哪些信息需要更新,其表达式如式(13)所示:
![]() |
其中,Wi 为 ht − 1 和 xt 在输入门的的权重矩阵,bi 为截距。第二部分,通过一个 tanh 层创建一个实质信息向量 zt,其表达式如式(14)所示:
![]() |
其中,WC 为 ht − 1 和 xt 在此部分对应的权重矩阵,bC 为截距,tanh 为双曲正切函数,作为激活函数。
(3)更新阶段:将 Ct − 1 保留下的信息加上 t 时刻输入的信息,从而更新 Ct,其表达式如式(15)所示:
![]() |
其中,“”为哈达玛积运算。ztf 为遗忘门保留的比例,Ct − 1 为实质信息,两者结合就是保留下的历史信息。同理,zti 与 zt 结合为实际输入的信息。
(4)输出阶段:zto 作为输出门,确定细胞状态中可以输出的信息,其表达式如式(16)所示:
![]() |
其中,Wo 为 ht-1 和 xt 在输出门的权重矩阵,bo 为截距。zto 与当前时刻选择性记忆的实质信息 Ct 结合,得到当前状态的输出 ht,其表达式如式(17)所示:
![]() |
其中,tanh 函数对 Ct 进行了放缩。最终输出 yt 的表达式如式(18)所示:
![]() |
其中,Wyh、by 为此部分的权重矩阵和截距。
1.7 异质集成决策方法
分类决策方法借鉴集成学习中投票法的硬投票思想,考虑基分类器的准确性和多样性,采用 XGBoost 和 LSTM 两种高效模型的异质集成方式,得到最终的分类结果。异质不仅体现在分类器类型不同、算法不同,在训练时提取的特征也不同。
为了提升预测模型对异常的灵敏度,最终的决策方法对硬投票也进行了改进,基于整个数据集异常记录较少的事实。XGBoost 为正常/异常的二分类模型,而 LSTM 的预测结果除了正常/异常外,加入了不确定的结果选项。所以将决策规则定义为:若 LSTM 预测为异常,则最终分类结果为异常;若 LSTM 预测为正常或者不确定,则最终分类结果为 XGBoost 的分类结果,如图 3 所示。

2 实验设计
2.1 评价指标
本研究采用灵敏度 Se,特异性 Sp 和准确率 Acc 来评估分类器的性能,如式(19)~式(21)所示:
![]() |
![]() |
![]() |
其中,TP 为真阳性,表示正确预测异常的数量;FN 为假阴性,表示异常未被预测的数量;TN 为真阴性,表示正确预测正常的数量;FP 为假阳性,表示被错误预测为异常的数量。
在对心音记录分类过程中,除了异常和正常之外,可能会出现由于噪声或信号质量差等原因对预测不确定的情况。因此根据 PhysioNet 挑战赛[6]确定的分数规则,对灵敏度 Se 和特异性 Sp 添加不确定权重系数(这里设为 0.5)进行修正,修正后的准确率 MAcc 如式(22)所示:
![]() |
考虑到临床上假阴比假阳的风险大很多,漏诊会耽误治疗,而假阳可以通过进一步检查排除,因此适当增加灵敏度权重,更具有临床价值。本实验引入另一项评价指标 F 得分 Fβ,综合灵敏度和特异性的调和值,如式(23)所示:
![]() |
为了适当提升灵敏度的重要性,β 取值要大于 1,本实验取 β = 1.1,F 得分记为 F1.1。
2.2 XGBoost 模型设计
通过数学软件 Matlab 2016a(MathWorks,美国)对心音数据集的 3 240 条心音记录进行预处理和心音分割,提取了前四个类别的 136 个特征。通过 Python 编程语言开发撰写时使用的集成开发环境 PyCharm 2020.1(JetBrains,捷克)对这些特征进行缺失值和归一化处理,然后以 XGBoost 的特征重要性为得分排名的依据,对所有记录的 136 个特征进行 3 折交叉验证的递归特征消除,XGBoost 的特征重要性通过式(11)计算的收益 Gain 得到。选择得分排名前 20 的特征,作为 XGBoost 的输入特征,如图 4 所示,纵坐标显示的特征与表 1 中的特征标记一一对应。

随后,对数据集进行划分,测试集比例为 0.3,由于数据集正负样本不平衡,划分时采用分层抽样,确保正常/异常两个标签对应的样本比例。
对训练集采用 5 折交叉验证的网格搜索方法,比较 XGBoost 模型对应每一种情况的得分,选择最优的模型参数。首先确定需优化参数的网格搜索范围与搜索步长,然后通过每一轮情况的损失函数计算相对应的模型得分,选择得分最高的模型为最优模型。实验得到最优模型参数:树的个数为 500,树的深度为 5 层,叶子节点最小权重为 2,惩罚项系数为 0,L1 正则化系数为 10,L2 正则化系数为 3,学习率为 0.05。由于数据集正负样本不平衡,正常异常比例在 4:1 左右,因此设置模型参数中的异常权重为 4。最后将得到的 XGBoost 最优模型应用于测试集上,预测分类结果。
2.3 MFCC-LSTM 模型设计
对训练集的心音记录进行移位,保证从 S1 状态开始,然后进行 3 s 等时间段切割(因为心动周期一般为 1 s 左右,保证切割后的每一段心音都能保留一个完整的心动周期),确保得到的 MFCC 特征时间长度相等。使用 Python 对切割后的心音进行 MFCC 分析,设置参数:窗口为汉明窗,帧长(窗口长度)为 25 ms,帧移(窗口之间步长)为 10 ms,返回的倒谱数量为 12,滤波器组中过滤器数量为 26 个,快速傅里叶变换的采样点数为 512,倒谱的正弦升降参数为 22。
训练集中的 2 268 个心音样本经过切割和 MFCC 分析后,转变为 15 733 个 MFCC 样本,作为 LSTM 训练的输入,标签也随之扩展。每个样本的输入特征维度为,表示心音记录在 299 帧时间段内,在 12 个梅尔刻度等级上的倒谱特征,明显包含时序特征,因此 LSTM 架构如图 5 所示,时间步 t 的总长为 299,每一时间步的输入 xt 维度为 12,隐藏层为 l 层,每一层含 s 个隐藏元,即每一层的隐藏状态信息 ih(t)(i = 0,1,
,l)为 s 维向量,皆随着时间步 t 而传递,同时传递的还有细胞状态信息 C(t),输出 y(t)为 2 维向量,表示异常和正常两种标签的概率,因此,最后一个时间步 t = 299 时的输出 y(299)为最终的模型输出 out。

训练 LSTM 模型时采用批处理,训练轮数(epoch)为 20,每轮的批次(batch)为 50,学习率为 0.001,每个批次中设置随机失活(dropout)为 0.5,通过忽略一半的隐层节点减少过拟合。优化参数的权重更新采用自适应矩估计(adaptive moment,Adam)优化器,损失函数使用的是交叉熵损失函数,由于正负样本不平衡,在损失函数中设置正常、异常标签的权重比例为 0.2 和 0.8。调整网络的超参数(隐藏层数 l,隐藏元个数 s)的范围分别为{20,50,100,150,200}和{1,2,3},比较其结果。
对于测试集中的心音记录也进行切割和 MFCC 分析,每一条记录由多个心音片段的 MFCC 特征组成,每一个特征通过训练的 LSTM 进行预测,最后对这一条记录得到的多个分类结果进行硬投票:取输出最多的那一类标签(如果心音被切割为偶数段,且两类标签数量相等,则结果为不确定)。
3 实验结果和讨论
3.1 实验结果
将得到的 XGBoost 模型在测试集上进行预测,根据式(19)~式(23)计算模型得分:Acc = 92.3%、Se = 76.9%、Sp = 96.2%、MAcc = 86.6%、F1.1 = 84.6%。
LSTM 采用不同结构(隐藏层数,每层隐藏元数)进行实验。如表 2 所示列出了所有结构的实验预测结果,发现 LSTM 的预测结果对异常的灵敏度普遍都很高,由于异常在样本中的比例较低,造成准确率略低,但修正后的准确率是令人满意的;隐藏元较少时,准确率较低,但当隐藏元个数增加到一定程度时,对结果影响不大;隐藏层数的增加对结果有一定帮助,2 层效果最佳。因此取 2 层 100 隐藏元。

最后采用 1.7 小节中决策方法对 XGBoost 和 LSTM 共同决策,最终模型预测结果为:Acc = 90.1%、Se = 93.0%、Sp = 89.4%、MAcc = 91.2%、F1.1 = 91.3%。
3.2 预处理方法的对比实验
为了验证预处理步骤对心音分类方法的影响,本文还增加了一组对比实验,用于分析预处理步骤对 LSTM 模型分类性能的影响。在对比实验中,取消预处理步骤,直接进行心音分割,提取特征,最后通过 LSTM 模型分类的实验结果为:Se = 88.4%、Sp = 86.1%、MAcc = 87.3%、F1.1 = 87.4%,发现各项评估得分都低于 3.1 小节中有预处理步骤的 LSTM 预测结果(Se = 91.7%、Sp = 88.3%、MAcc = 90.0%、F1.1 = 90.2%)。对比实验结果表明,预处理步骤能提升该心音分类模型的性能。
3.3 比较与讨论
本实验研究了不同深度神经网络对心音分类的影响,对心音信号划分相同训练集,提取 MFCC 特征,然后使用了以下分类方法:① CNN 分类;② LSTM 分类;③ 分别通过单独的 CNN 和单独的 LSTM,最后通过融合层合并在一起分类;④ 采用 Sainath 等[28]提出的卷积-长短时记忆-全连接深度神经网络(convolutional,long short-term memory,fully connected deep neural networks,CLDNN),即先通过 CNN 再通过 LSTM,最后通过全连接层分类。为了使本文研究方法的高效性更具有说服力,本实验结果也与最新的基于同一数据集的心音分类方法,即文献[9, 12, 16, 19-22]中的方法进行比较。所有心音分类方法的性能比较如表 3 所示。

结果表明:① 深度神经网络与传统机器学习方法比较,对心音分类的效果(MAcc 和 F1.1)更好,主要体现在对异常记录识别的灵敏度更高,虽然整个数据集异常比例较少,造成误诊的成本增加,但是大大降低了漏诊的风险。② 在深度神经网络的研究中,纯粹的 LSTM 比其他网络的分类效果要更好,主要因为提取的 MFCC 特征具有明显的时序性,适用于 LSTM 网络,而 CNN 对于时域和频域特征维度的提取可能引起一些信息的遗失,因此本文采用的是 LSTM 网络。③ 本文提出的基于 XGBoost 和 LSTM 的共同决策方法,XGBoost 保证分类的特异性较高,进一步引入 LSTM 共同决策,在略微降低特异性的前提下大幅提升了整个分类模型的灵敏度,最终分类的准确率比目前最新的方法有所提升。
4 结论
本文提出了一种基于 XGBoost 和 LSTM 共同决策的心音分类方法。首先,在心音分割确定 S1、收缩期、S2、舒张期四个状态的基础上,提取了四个类别的 136 个特征,通过递归特征消除法筛选出 20 个特征作为 XGBoost 分类器的输入特征。其次,提取了具有时序性的 MFCC 特征,作为深度神经网络 LSTM 的输入。最终对这两种模型的分类结果进行决策,得到最后的分类结果。实验中,本文分别对 XGBoost 和 LSTM 分类器的调优采用了网格搜索法和结构调参法,选取了各自的最优模型,并针对数据集不平衡问题,在各自模型中分别加入加权改进。结果表明,该方法在测试集上对心音异常/正常的分类结果为:Acc = 90.1%、Se = 93.0%、Sp = 89.4%、MAcc = 91.2%、F1.1 = 91.3%,与最新的其他分类方法相比,该方法在准确性和灵敏度上有所提升,达到了更好的分类效果,为部分心血管疾病的临床辅助诊断提供一种较好的选择。
利益冲突声明:本文全体作者均声明不存在利益冲突。