MIT-BIH 心律失常数据库实战:Python 读取与 5 种心拍分类模型对比

📅 2026/7/6 10:30:20
MIT-BIH 心律失常数据库实战:Python 读取与 5 种心拍分类模型对比
MIT-BIH 心律失常数据库实战Python 读取与 5 种心拍分类模型对比在医疗人工智能领域心电信号处理一直是研究热点。MIT-BIH 心律失常数据库作为该领域的黄金标准为算法验证提供了可靠的数据基础。本文将带您从数据读取到模型评估完成一次完整的心电算法实战。1. MIT-BIH 数据库解析与 Python 读取MIT-BIH 心律失常数据库包含48条双导联心电图记录每条记录时长为30分钟采样率为360Hz。数据库提供了详细的注释文件标注了每个心拍的类型和特征点位置。使用Python读取WFDB格式的数据非常简便import wfdb # 读取100号记录 record wfdb.rdrecord(mitdb/100, sampto3600) annotation wfdb.rdann(mitdb/100, atr, sampto3600) # 获取信号和注释 ecg_signal record.p_signal[:,0] # 获取MLII导联 sample_numbers annotation.sample symbols annotation.symbol数据库包含的心拍类型非常丰富主要分为五大类类型符号描述示例正常N正常窦性心律大部分心拍室性V室性早搏PVC房性A房性早搏PAC交界性J交界性早搏JPC融合F融合波室性融合波提示MIT-BIH 使用独特的符号系统标注心拍类型完整的符号说明可在PhysioNet官网查阅。数据预处理是模型训练前的关键步骤典型流程包括信号滤波去除基线漂移和工频干扰心拍分割以R峰为中心截取固定长度片段数据平衡对少数类样本进行过采样归一化将信号幅度标准化到[-1,1]范围from scipy import signal # 带通滤波 (0.5-40Hz) b, a signal.butter(4, [0.5, 40], btypebandpass, fs360) filtered_ecg signal.filtfilt(b, a, ecg_signal) # 心拍分割 (以R峰为中心±180个采样点) segments [] for r_peak in annotation.sample: if 180 r_peak len(ecg_signal)-180: segments.append(ecg_signal[r_peak-180:r_peak180])2. 特征工程与数据增强传统机器学习方法依赖手工特征提取以下是一些经典特征时域特征RR间期、QRS宽度、ST段斜率频域特征小波系数、功率谱密度形态特征P/QRS/T波的幅度和面积# 计算RR间期特征 rr_intervals np.diff(annotation.sample) mean_rr np.mean(rr_intervals) std_rr np.std(rr_intervals)深度学习时代数据增强技术能有效提升模型泛化能力时间扭曲轻微拉伸或压缩信号时序幅度缩放随机调整信号幅度添加噪声模拟真实采集环境通道混洗对多导联数据进行排列组合def time_warp(signal, factor0.1): length len(signal) warp_points int(length * factor) random_points sorted(np.random.randint(0, length, warp_points)) return np.interp(np.arange(length), random_points, signal[random_points])3. 五种深度学习模型架构对比我们选取了五种主流深度学习架构进行对比实验3.1 1D CNN 基准模型from tensorflow.keras import layers model Sequential([ layers.Conv1D(32, 5, activationrelu, input_shape(360,1)), layers.MaxPooling1D(2), layers.Conv1D(64, 5, activationrelu), layers.MaxPooling1D(2), layers.Flatten(), layers.Dense(64, activationrelu), layers.Dense(5, activationsoftmax) ])3.2 LSTM 时序模型model Sequential([ layers.LSTM(64, return_sequencesTrue, input_shape(360,1)), layers.LSTM(64), layers.Dense(64, activationrelu), layers.Dense(5, activationsoftmax) ])3.3 CNN-LSTM 混合模型model Sequential([ layers.Conv1D(32, 5, activationrelu, input_shape(360,1)), layers.MaxPooling1D(2), layers.Conv1D(64, 5, activationrelu), layers.MaxPooling1D(2), layers.LSTM(64), layers.Dense(5, activationsoftmax) ])3.4 Transformer 模型def transformer_encoder(inputs, head_size, num_heads, ff_dim, dropout0): # 多头注意力 x layers.MultiHeadAttention( key_dimhead_size, num_headsnum_heads, dropoutdropout )(inputs, inputs) x layers.Dropout(dropout)(x) x layers.LayerNormalization(epsilon1e-6)(x) # 前馈网络 x layers.Conv1D(filtersff_dim, kernel_size1, activationrelu)(x) x layers.Dropout(dropout)(x) x layers.Conv1D(filtersinputs.shape[-1], kernel_size1)(x) return layers.LayerNormalization(epsilon1e-6)(x) inputs layers.Input(shape(360,1)) x transformer_encoder(inputs, head_size64, num_heads4, ff_dim128) x layers.GlobalAveragePooling1D()(x) outputs layers.Dense(5, activationsoftmax)(x) model tf.keras.Model(inputs, outputs)3.5 ResNet 模型def residual_block(x, filters, kernel_size3): # 残差连接 shortcut x x layers.Conv1D(filters, kernel_size, paddingsame)(x) x layers.BatchNormalization()(x) x layers.Activation(relu)(x) x layers.Conv1D(filters, kernel_size, paddingsame)(x) x layers.BatchNormalization()(x) x layers.Add()([shortcut, x]) return layers.Activation(relu)(x) inputs layers.Input(shape(360,1)) x layers.Conv1D(64, 7, paddingsame)(inputs) x residual_block(x, 64) x layers.MaxPooling1D(2)(x) x residual_block(x, 128) x layers.GlobalAveragePooling1D()(x) outputs layers.Dense(5, activationsoftmax)(x) model tf.keras.Model(inputs, outputs)4. 模型训练与性能评估我们采用五折交叉验证评估模型性能评价指标包括准确率整体分类正确率F1分数考虑类别不平衡的综合指标混淆矩阵分析各类别的错分情况训练参数设置优化器Adam (lr0.001)损失函数分类交叉熵批次大小32训练轮次50早停策略验证损失3轮不下降五种模型在测试集上的性能对比模型准确率宏F1训练时间(秒/epoch)参数量1D CNN0.9430.891121.2MLSTM0.9270.872451.8MCNN-LSTM0.9510.903322.1MTransformer0.9580.915282.4MResNet0.9620.923181.5M注意实际应用中模型选择不仅要考虑准确率还需权衡计算资源和实时性要求。混淆矩阵分析显示模型最容易混淆房性早搏(A)和交界性早搏(J)这与临床医生的观察一致。为提高这些易混淆类别的识别率可以增加难例样本的权重设计专门的二分类器区分易混淆类别引入注意力机制聚焦P波形态差异# 类别权重计算 from sklearn.utils.class_weight import compute_class_weight class_weights compute_class_weight(balanced, classesnp.unique(y_train), yy_train) class_weight_dict dict(enumerate(class_weights))5. 模型部署与优化技巧将训练好的模型部署到生产环境时需要考虑以下优化模型压缩技术量化将浮点参数转换为低精度表示剪枝移除对输出影响小的神经元知识蒸馏用小模型模仿大模型行为# 模型量化示例 converter tf.lite.TFLiteConverter.from_keras_model(model) converter.optimizations [tf.lite.Optimize.DEFAULT] quantized_model converter.convert()实时性优化滑动窗口处理连续信号增量式推理减少重复计算模型并行化加速在实际医疗设备中还需要考虑信号质量检测模块结果不确定性估计医生反馈闭环系统心电算法的评估不应仅停留在数据库指标上真实场景还需考虑不同年龄段人群的泛化能力各种运动状态下的鲁棒性与其他生理信号的协同分析