
1. 初识CWRU轴承数据集第一次接触故障诊断领域时我被各种专业术语和复杂算法搞得晕头转向。直到发现了CWRU轴承数据集这个宝藏才真正找到了入门突破口。这个由凯斯西储大学维护的公开数据集包含了多种轴承故障状态的振动信号数据堪称机械故障诊断领域的MNIST。数据集主要采集自实验台架上不同健康状态的轴承包含正常状态(NOR)、内圈故障(IR)、外圈故障(OR)以及滚动体故障(B)四种基本类型。每种故障又细分为不同损伤直径0.007英寸到0.021英寸不等采样频率高达12kHz能捕捉到丰富的故障特征。我刚开始用这个数据集时最惊喜的是它已经按不同负载条件0HP、1HP、2HP、3HP分类存储省去了大量数据整理时间。2. 环境搭建与数据获取2.1 Python环境配置建议使用Anaconda创建专属环境避免包冲突。我习惯用以下命令创建环境conda create -n bearing python3.8 conda activate bearing核心依赖库包括NumPy/Pandas数据处理黄金搭档Matplotlib/Seaborn可视化神器Scikit-learn机器学习基础库PyTorch/TensorFlow深度学习框架根据个人偏好选择安装命令示例pip install numpy pandas matplotlib seaborn scikit-learn torch2.2 数据集下载与解压CWRU数据集的官方下载地址经常变动我整理了几个稳定镜像源。下载后解压会发现包含.mat格式的振动信号文件和说明文档。这里有个小技巧用Python的scipy.io加载.mat文件比用MATLAB更方便from scipy.io import loadmat data loadmat(97.mat) # 以97号文件为例3. 数据预处理实战3.1 信号可视化探索先看看原始信号长什么样import matplotlib.pyplot as plt plt.figure(figsize(12,4)) plt.plot(data[X097_DE_time][:1000]) # 取前1000个采样点 plt.title(原始振动信号示例) plt.xlabel(采样点) plt.ylabel(幅值) plt.show()这个简单的可视化能立即发现故障信号的周期性冲击特征。我第一次做这个图时明显看到故障信号比正常信号多了很多毛刺这就是故障冲击的直观表现。3.2 数据标准化处理不同工况下的信号幅值差异很大必须做标准化from sklearn.preprocessing import StandardScaler scaler StandardScaler() X_normalized scaler.fit_transform(data[X097_DE_time].reshape(-1,1))3.3 特征工程构建时域特征我常用这些指标def extract_features(signal): features { 峰值: np.max(signal), 均方根: np.sqrt(np.mean(signal**2)), 峭度: np.mean((signal - np.mean(signal))**4) / np.std(signal)**4, 脉冲因子: np.max(np.abs(signal)) / np.mean(np.abs(signal)) } return features4. 构建基础分类模型4.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)4.2 随机森林模型实现新手首推随机森林既简单又强大from sklearn.ensemble import RandomForestClassifier rf RandomForestClassifier(n_estimators100, max_depth10) rf.fit(X_train, y_train) print(测试集准确率:, rf.score(X_test, y_test))4.3 模型评估技巧混淆矩阵比单纯看准确率更有价值from sklearn.metrics import confusion_matrix, ConfusionMatrixDisplay cm confusion_matrix(y_test, rf.predict(X_test)) disp ConfusionMatrixDisplay(cm) disp.plot() plt.show()5. 进阶深度学习模型尝试5.1 1D-CNN网络搭建用PyTorch实现一个简单的一维CNNimport torch.nn as nn class CNN1D(nn.Module): def __init__(self): super().__init__() self.conv1 nn.Conv1d(1, 32, kernel_size3) self.pool nn.MaxPool1d(2) self.fc nn.Linear(32*499, 4) # 4分类 def forward(self, x): x self.pool(nn.functional.relu(self.conv1(x))) x x.view(-1, 32*499) return self.fc(x)5.2 数据加载器准备PyTorch需要自定义Dataset类from torch.utils.data import Dataset, DataLoader class BearingDataset(Dataset): def __init__(self, signals, labels): self.signals signals self.labels labels def __len__(self): return len(self.labels) def __getitem__(self, idx): return self.signals[idx], self.labels[idx]6. 结果可视化与分析6.1 特征空间可视化用t-SNE降维观察特征分布from sklearn.manifold import TSNE tsne TSNE(n_components2) X_tsne tsne.fit_transform(features) plt.scatter(X_tsne[:,0], X_tsne[:,1], clabels) plt.colorbar() plt.show()6.2 故障诊断决策解释SHAP值分析模型决策依据import shap explainer shap.TreeExplainer(rf) shap_values explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test)第一次完整跑通这个流程时我遇到了数据维度不匹配、特征提取效果差、模型过拟合等各种问题。后来发现关键在于信号分段长度要合适通常1024或2048个采样点并且要在不同负载条件下都测试模型性能。现在回头看这些踩坑经历反而让我对振动信号特征有了更深理解。建议新手可以先用小样本快速验证流程再逐步扩展到大样本和复杂模型。