1. 项目背景与问题定位
去年实验室新来的师弟找我帮忙复现西储大学轴承故障诊断的迁移学习代码,本以为是个简单的活——毕竟网上公开的案例不少。但真正动手才发现,从数据预处理到模型迁移的每个环节都藏着"暗坑"。这次经历让我意识到,很多看似成熟的技术方案在实际落地时,依然需要根据具体场景做大量适配工作。
西储大学轴承数据集(CWRU)作为故障诊断领域的基准数据,包含驱动端轴承、风扇端轴承在不同负载条件下的振动信号。原始数据采样频率12kHz,包含正常状态和内圈、外圈、滚动体三种故障类型,每种故障又有不同损伤直径(0.007英寸到0.021英寸)。这种多维度的故障特征本应让分类任务变得简单,但实际处理时会遇到几个典型问题:
- 原始振动信号长度不一致(从48000到120000个采样点不等)
- 不同故障类型的样本数量严重不均衡
- 迁移学习时源域(实验室数据)与目标域(现场数据)的分布差异
- 时频域特征提取方法对最终分类效果的影响
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 数据预处理的关键陷阱
2.1 信号标准化与分段处理
原始振动信号需要先进行标准化(z-score归一化),这个步骤看似基础却容易出错。常见错误是直接对整个数据集计算均值和标准差,这会导致数据泄露(data leakage)。正确做法应该按以下顺序:
python复制def segment_signal(data, window_size=1024, step_size=512):
segments = []
for start in range(0, len(data)-window_size, step_size):
segment = data[start:start+window_size]
segments.append(segment)
return np.array(segments)
# 对每个样本独立标准化后再分段
raw_signals = [...] # 原始振动信号列表
processed = []
for signal in raw_signals:
normalized = (signal - np.mean(signal)) / np.std(signal)
segments = segme
