共计 1892 个字符,预计需要花费 5 分钟才能阅读完成。
为什么 1D 数据增强与众不同
刚入门机器学习时,我发现大家总在讨论图像数据增强——旋转、裁剪、调色。但当处理传感器信号、心电图或股票走势这类 1D 数据 时,直接套用图像那套方法会出大问题。比如对时间序列做随机裁剪,可能破坏信号的 时序不变性;而粗暴添加噪声会导致频谱泄漏,让模型学到错误特征。

传统方法 vs 深度学习方案
先看几种常见方法的对比:
| 方法 | 计算开销 | 保真度 | 适用场景 |
|---|---|---|---|
| 滑动窗口 | 低 | 中 | 长序列分段训练 |
| Jittering | 极低 | 低 | 抗噪声需求强的场景 |
| Scaling | 低 | 高 | 振幅敏感的振动信号 |
| GAN 生成 | 极高 | 可变 | 数据极度稀缺时 |
经验之谈:工业传感器数据我首选滑动窗口 + 轻微 jittering 组合,在计算成本和效果间取得平衡。
手把手代码实战
基础增强:tsaug 库的妙用
from tsaug import TimeWarp, AddNoise, Drift
# 定义增强流水线
aug_pipeline = (TimeWarp(n_speed_change=3, max_speed_ratio=1.5) # 时间扭曲
+ AddNoise(scale=0.01) # 添加高斯噪声
+ Drift(max_drift=0.1) # 模拟信号漂移
)
# 应用增强
augmented_data = aug_pipeline.augment(original_signal)
参数调优 tip:
– max_speed_ratio建议从 1.2 开始逐步增加
– 噪声标准差初始值设为数据标准差的 1 /100
高级操作:PyTorch 频域增强
import torch
import torch.fft
class FreqFilter(torch.nn.Module):
def __init__(self, mask_ratio=0.2):
super().__init__()
self.mask_ratio = mask_ratio
def forward(self, x):
# FFT 变换
fft = torch.fft.rfft(x, dim=-1)
# 随机滤除高频成分
cutoff = int(fft.shape[-1] * self.mask_ratio)
mask = torch.ones_like(fft)
mask[..., -cutoff:] = 0
# 逆变换
return torch.fft.irfft(fft * mask, n=x.shape[-1])
生产环境的三大天坑
- 数据分布偏移:增强后的数据范围(如振幅)超出训练集统计值。解决方法:
- 记录训练集的 min/max/mean/std
-
增强后执行
np.clip(enhanced, min_val, max_val) -
实时增强延迟:流水线处理速度跟不上采样频率。优化策略:
- 预处理阶段生成增强副本
-
使用 C ++ 扩展加速计算敏感部分
-
验证集泄露:增强时误操作验证数据。必须遵守:
# 错误做法 ❌ all_data = augment(train_data + val_data) # 正确做法 ✅ train_aug = augment(train_data) val_raw = val_data # 保持原始状态
效果验证方法论
可视化检查
from sklearn.manifold import TSNE
import matplotlib.pyplot as plt
# 提取原始和增强特征
features = np.vstack([raw_features, aug_features])
labels = ['原始']*len(raw_features) + ['增强']*len(aug_features)
# t-SNE 降维
tsne = TSNE(n_components=2)
embedding = tsne.fit_transform(features)
# 绘制散点图
plt.scatter(embedding[:,0], embedding[:,1], c=labels)
plt.show()
理想情况:两个分布应部分重叠但略有差异
定量指标计算
# 动态时间规整距离
from dtaidistance import dtw
distance = dtw.distance(original, augmented)
# 峰值信噪比
def psnr(orig, aug):
mse = np.mean((orig - aug) ** 2)
return 10 * np.log10(np.max(orig)**2 / mse)
经验值参考:
– DTW 距离应小于序列长度的 10%
– PSNR 建议保持在 30dB 以上
写在最后
在实际项目中,我发现 1D 数据增强像做菜调味——少量多次比一次性猛加更安全。建议初期采用保守策略,通过验证指标反推增强强度。当遇到模型表现不稳定时,不妨回到原始数据,用 plt.plot() 肉眼观察增强效果,这招在调试阶段特别管用。
正文完
发表至: 未分类
近一天内
