西储大学轴承数据集解析与故障诊断实战
1. 西储大学轴承数据概述
西储大学轴承数据集(Case Western Reserve University Bearing Data)是机械故障诊断领域最经典的公开数据集之一。这个数据集采集自实验台架上不同健康状态的滚动轴承振动信号,包含了从正常状态到多种故障类型(内圈、外圈、滚动体故障)的完整数据记录。
我第一次接触这个数据集是在研究生阶段做旋转机械故障预测课题时。当时为了验证算法效果,需要标准化的轴承振动数据作为基准,而CWRU数据集因其完整的故障类型覆盖和精确的工况标注,成为不二之选。十多年过去,这个数据集依然是故障诊断领域的"黄金标准"。
2. 数据获取与MAT格式解析
2.1 数据集下载渠道
官方数据可以通过西储大学轴承数据中心网站获取。虽然界面看起来有些年头,但数据分类非常系统:
- 按驱动端/风扇端轴承位置分类
- 按负载工况(0-3马力)分级
- 按故障直径(0.007-0.028英寸)细分
- 包含正常状态和多种故障类型的.mat文件
提示:下载时建议建立规范的文件夹结构,例如按"负载_故障位置_尺寸"三级目录存放,后期处理时会节省大量时间。
2.2 MAT文件结构解析
MAT文件是MATLAB的专用数据格式,但通过Python的scipy.io库可以轻松读取。一个典型的CWRU数据文件包含以下关键字段:
import scipy.io as sio data = sio.loadmat('97.mat') print(data.keys()) # 查看文件包含的变量常见数据结构包括:
DE:驱动端轴承振动信号(最常用)FE:风扇端轴承振动信号BA:基座振动信号RPM:转速信息(通常为1797rpm)
2.3 数据预处理要点
原始振动信号通常需要以下预处理步骤:
去直流分量:
signal = data['DE'][:,0] # 获取驱动端振动信号 signal = signal - np.mean(signal) # 去除直流偏移重采样处理: 原始采样率为12kHz,对于某些应用可能过高:
from scipy import signal resampled = signal.resample(signal, len(signal)//2) # 降采样到6kHz数据标准化:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() normalized = scaler.fit_transform(signal.reshape(-1,1))
3. 典型应用场景实现
3.1 时频特征提取实战
轴承故障诊断的核心是特征工程。以下是提取经典时域特征的Python实现:
def extract_features(signal): features = {} features['RMS'] = np.sqrt(np.mean(signal**2)) features['Kurtosis'] = np.mean((signal - np.mean(signal))**4) / np.std(signal)**4 features['CrestFactor'] = np.max(np.abs(signal)) / features['RMS'] return features频域特征可通过FFT变换获得:
n = len(signal) freq = np.fft.fftfreq(n, d=1/12000)[:n//2] fft_vals = np.abs(np.fft.fft(signal))[:n//2]3.2 故障诊断模型构建
使用随机森林进行故障分类的完整流程:
from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split # 假设已提取特征矩阵X和标签y X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) model = RandomForestClassifier(n_estimators=100) model.fit(X_train, y_train) print(f"测试集准确率:{model.score(X_test, y_test):.2%}")3.3 深度学习端到端方案
对于原始振动信号,可以使用1D-CNN直接处理:
from tensorflow.keras import layers, models model = models.Sequential([ layers.Conv1D(32, 3, activation='relu', input_shape=(12000,1)), layers.MaxPooling1D(2), layers.Flatten(), layers.Dense(64, activation='relu'), layers.Dense(4, activation='softmax') # 假设4类故障 ]) model.compile(optimizer='adam', loss='sparse_categorical_crossentropy')4. 工程实践中的关键问题
4.1 数据不平衡处理
CWRU数据集中不同故障类型的样本数差异较大。常用解决方法:
过采样技术:
from imblearn.over_sampling import SMOTE X_res, y_res = SMOTE().fit_resample(X, y)类别权重调整:
class_weights = compute_class_weight('balanced', classes=np.unique(y), y=y) model.fit(X_train, y_train, class_weight=dict(enumerate(class_weights)))
4.2 跨工况泛化挑战
不同负载条件下的数据分布差异会导致模型性能下降。解决方案:
特征标准化:
from sklearn.preprocessing import RobustScaler scaler = RobustScaler(quantile_range=(25,75)) # 对异常值鲁棒域适应技术: 使用MMD(最大均值差异)等度量学习方法来减小分布差异
4.3 实时处理优化
工业现场往往需要实时处理,可以考虑:
滑动窗口处理:
def sliding_window(signal, window_size, step): for i in range(0, len(signal)-window_size, step): yield signal[i:i+window_size]特征计算优化: 使用Numba加速特征计算:
from numba import jit @jit(nopython=True) def rms(x): return np.sqrt(np.mean(x**2))
5. 扩展应用与前沿方向
5.1 与其他数据集的联合使用
可以将CWRU数据与以下数据集结合使用:
- 帕德博恩大学轴承数据集(更丰富的故障类型)
- NASA轴承数据集(更长寿命周期数据)
- MFPT数据集(多种工况组合)
5.2 迁移学习应用
使用预训练模型进行特征提取:
base_model = load_pretrained_cnn() features = base_model.predict(X_new)5.3 边缘计算部署
将模型部署到树莓派等边缘设备:
import tflite_runtime.interpreter as tflite interpreter = tflite.Interpreter(model_path="model.tflite") interpreter.allocate_tensors()在实际工程应用中,我发现将CWRU数据与现场采集数据结合使用时,需要特别注意采样率匹配问题。曾经有个项目因为忽略了实验室数据(12kHz)与现场采集系统(10kHz)的采样率差异,导致特征提取出现严重偏差。后来我们统一采用重采样到8kHz作为折中方案,既保留了关键频段信息,又实现了数据兼容。