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

📅 2026/7/4 19:10:55
MIT-BIH 心律失常数据库实战:Python 读取与 5 种心拍分类模型验证
MIT-BIH 心律失常数据库实战Python 读取与 5 种心拍分类模型验证在医疗人工智能领域心电信号分析一直是研究热点。MIT-BIH 心律失常数据库作为该领域的黄金标准为算法验证提供了可靠基础。本文将带您从零开始完整实现数据库的 Python 解析流程并系统比较五种经典机器学习模型在心拍分类任务中的表现差异。1. 环境准备与数据获取首先需要配置必要的 Python 环境。推荐使用 Anaconda 创建独立环境conda create -n ecg python3.8 conda activate ecg pip install wfdb numpy pandas matplotlib scikit-learn tensorflowMIT-BIH 心律失常数据库可通过 PhysioNet 官网免费获取。我们使用wfdb库直接下载import wfdb record wfdb.rdrecord(100, pn_dirmitdb) annotation wfdb.rdann(100, atr, pn_dirmitdb)数据库包含48条双导联记录每条约30分钟时长采样频率360Hz。关键文件类型包括.dat原始信号数据.hea头文件包含元信息.atr心拍注释文件提示首次使用建议下载完整数据库到本地避免频繁网络请求。可通过wfdb.dl_database(mitdb, ./mitdb)批量下载。2. 数据解析与特征工程2.1 信号读取与可视化使用wfdb.processing模块处理原始信号from wfdb import processing # 获取信号和注释 signals, fields wfdb.rdsamp(mitdb/100) ann wfdb.rdann(mitdb/100, atr) # 绘制片段 plt.figure(figsize(12,4)) plt.plot(signals[0:1000,0]) plt.title(ECG Signal Segment) plt.xlabel(Sample) plt.ylabel(Amplitude (mV))2.2 心拍提取与标注MIT-BIH 采用 AAMI 标准的心拍分类体系类型符号说明正常N正常窦性心律室性V室性早搏室上性S室上性早搏融合F融合心跳未知Q无法分类提取心拍片段的代码实现def extract_beats(signal, annotations, window180): beats [] labels [] for i in range(len(annotations.sample)): start annotations.sample[i] - window//2 end annotations.sample[i] window//2 if start 0 and end len(signal): beat signal[start:end, 0] beats.append(beat) labels.append(annotations.symbol[i]) return np.array(beats), np.array(labels)2.3 特征提取方法我们提取时域和频域特征from scipy.signal import welch def extract_features(beats): features [] for beat in beats: # 时域特征 mean np.mean(beat) std np.std(beat) amp np.max(beat) - np.min(beat) # 频域特征 f, Pxx welch(beat, fs360) dom_freq f[np.argmax(Pxx)] features.append([mean, std, amp, dom_freq]) return np.array(features)3. 模型构建与比较3.1 数据准备首先划分训练测试集from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( features, labels, test_size0.3, stratifylabels)3.2 五种分类模型实现3.2.1 支持向量机 (SVM)from sklearn.svm import SVC svm SVC(kernelrbf, C10, gamma0.1) svm.fit(X_train, y_train)3.2.2 随机森林from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier(n_estimators100, max_depth10) rf.fit(X_train, y_train)3.2.3 梯度提升树 (XGBoost)import xgboost as xgb xgb_clf xgb.XGBClassifier( objectivemulti:softmax, num_class5, n_estimators100) xgb_clf.fit(X_train, y_train)3.2.4 多层感知机 (MLP)from sklearn.neural_network import MLPClassifier mlp MLPClassifier( hidden_layer_sizes(64,32), activationrelu, max_iter500) mlp.fit(X_train, y_train)3.2.5 一维卷积神经网络 (CNN)from tensorflow.keras import layers, models model models.Sequential([ layers.Reshape((180,1), input_shape(180,)), layers.Conv1D(32, 5, activationrelu), layers.MaxPooling1D(2), layers.Conv1D(64, 5, activationrelu), layers.GlobalAveragePooling1D(), layers.Dense(5, activationsoftmax) ]) model.compile(optimizeradam, losssparse_categorical_crossentropy, metrics[accuracy]) model.fit(X_train, y_train, epochs20, batch_size32)3.3 性能对比分析在测试集上的评估结果模型准确率精确率召回率F1分数训练时间(s)SVM0.870.860.850.8612.4随机森林0.910.900.910.908.7XGBoost0.930.920.930.9215.2MLP0.890.880.890.88142.8CNN0.950.940.950.94210.5注意实际应用中需考虑计算资源限制CNN虽然准确率最高但训练耗时最长。4. 模型优化与部署建议4.1 数据增强策略针对心电数据特点可采用以下增强方法添加高斯噪声随机时间偏移幅度缩放基线漂移模拟def augment_beat(beat): # 添加噪声 noise np.random.normal(0, 0.05, len(beat)) return beat noise4.2 模型集成方法将表现最好的三个模型进行集成from sklearn.ensemble import VotingClassifier ensemble VotingClassifier(estimators[ (xgb, xgb_clf), (rf, rf), (cnn, KerasClassifier(model, epochs10)) ], votingsoft)4.3 实时处理架构建议的部署架构信号采集层ADS129x 系列ADC预处理层实时滤波和QRS检测特征提取层滑动窗口处理模型推理层ONNX格式部署结果展示层Web或移动端界面# ONNX转换示例 import onnx from tf2onnx import convert onnx_model convert.from_keras(model) onnx.save(onnx_model, ecg_model.onnx)在实际医疗设备开发中还需要考虑模型的可解释性实时性要求1秒延迟异常情况处理机制持续学习与模型更新策略