共计 1483 个字符,预计需要花费 4 分钟才能阅读完成。
1. 为什么我们需要数据增强?
当用 1D-CNN 处理 ECG 心电信号或工业传感器数据时,最头疼的问题就是样本太少。医院的标注心电图可能只有几千条,而生产线上的故障数据更是稀少。这时候直接训练模型会出现:
- 模型记住训练集所有细节(过拟合)
- 对噪声和个体差异极度敏感
- 验证集指标波动大
数据增强通过人工扩展数据集,让模型看到更多 ” 可能性 ”。比如同一条 ECG 信号,我们可以:
- 加入微小的时间偏移(模拟不同人的心跳节奏)
- 添加设备噪声(模拟传感器误差)
- 随机缩放幅度(模拟电极接触差异)
2. 五大增强方法对比
2.1 时间扭曲 (Time Warping)
- 原理 :局部拉伸 / 压缩时间轴
- 适用场景 :ECG、语音信号
- 风险点 :过度扭曲会破坏 P -QRS- T 波形的临床意义
# 使用 Dynamic Time Warping 轻度变形
def time_warp(signal, warp_factor=0.1):
""" 信号时间轴非线性变形
Args:
signal: (N,) 输入信号
warp_factor: 扭曲强度
Returns:
warped: (N,) 变形后信号
"""
...
2.2 加噪 (Noise Injection)
- 推荐噪声类型 :
- 高斯噪声(模拟传感器误差)
- 工频干扰(50/60Hz)
- 运动伪影(EMG 噪声)
2.3 窗口切片 (Window Slicing)
- 技巧 :切片时保持关键特征完整
- 例 :ECG 切片必须包含完整 QRS 波
3. Python 实现核心增强
3.1 基础增强组合
import numpy as np
def augment_1d(signal: np.ndarray,
jitter_strength: float = 0.05,
scale_range: tuple = (0.9, 1.1)) -> np.ndarray:
""" 执行 jittering+scaling 增强
Args:
signal: 输入信号,形状 (N,)
jitter_strength: 抖动幅度系数
scale_range: 缩放倍数范围
"""
# 幅度抖动
jitter = np.random.normal(0, jitter_strength, size=signal.shape)
# 随机缩放
scale = np.random.uniform(*scale_range)
return scale * (signal + jitter)
3.2 Keras 集成方案
import tensorflow as tf
class TimeSeriesAugment(tf.keras.layers.Layer):
def __init__(self, noise_stddev=0.1):
super().__init__()
self.noise_stddev = noise_stddev
def call(self, inputs, training=None):
if not training:
return inputs
# 训练时添加随机噪声
noise = tf.random.normal(tf.shape(inputs), stddev=self.noise_stddev)
return inputs + noise
4. 关键生产经验
4.1 增强幅度调参
- 诊断方法 :观察增强后数据与真实分布的 KL 散度
- 经验值 :ECG 信号建议抖动 <5% 标准差
4.2 医疗数据合规
- 增强后的数据不可用于临床诊断
- 保留原始数据副本
- 文档记录所有增强参数
5. 避坑清单
- 数据泄露检测 :
- 检查验证集指标是否远高于测试集
-
对比增强样本与原始样本的特征分布
-
解决方案 :
- 先拆分训练 / 测试集再增强
- 对测试集禁用任何增强
6. 完整案例
延伸阅读 :
–《BioMedical Signal Processing》中的噪声模型章节
– IEEE 关于 ECG 数据增强的合规指南
正文完
发表至: 未分类
四天前

