东南大学严如强团队机械故障数据集实测:从下载到预处理全流程指南
东南大学机械故障数据集实战指南:从数据获取到模型训练全解析
在工业设备健康管理领域,高质量的数据集是算法研发和工程验证的基石。东南大学严如强教授团队开源的机械故障数据集(Mechanical-datasets)因其丰富的故障类型标注和标准化的采集条件,已成为国内外故障诊断研究的热门选择。本文将手把手带您完成从数据集获取到预处理再到模型训练的全流程操作,特别针对初次接触该数据集的研究人员和工程师提供实用指导。
1. 数据集获取与环境准备
1.1 官方渠道获取数据集
该数据集托管于GitHub平台,由团队博士生邵思羽维护。获取数据最可靠的方式是通过官方仓库:
git clone https://github.com/cathysiyu/Mechanical-datasets.git数据集包含以下核心文件:
bearing_data/:轴承振动信号(包含内圈、外圈、滚动体故障)gear_data/:齿轮箱多工况振动数据documentation/:采集参数说明与标注规范example_scripts/:MATLAB和Python的数据加载示例
常见问题解决方案:
- 若克隆速度慢,可尝试在URL后添加
.git或使用SSH协议 - 大文件下载失败时,建议开启
git config --global http.postBuffer 524288000
1.2 本地环境配置
推荐使用Python 3.8+环境,主要依赖库包括:
| 库名称 | 版本要求 | 功能说明 |
|---|---|---|
| numpy | ≥1.19 | 数值计算基础库 |
| pandas | ≥1.2 | 数据框操作 |
| scipy | ≥1.6 | 信号处理工具 |
| scikit-learn | ≥0.24 | 机器学习工具链 |
| PyTorch | ≥1.8 | 深度学习框架(可选) |
安装命令示例:
pip install numpy==1.21.3 pandas==1.3.4 scipy==1.7.1 scikit-learn==0.24.22. 数据结构解析与初步探索
2.1 数据集目录架构
Mechanical-datasets/ ├── bearing_data/ │ ├── normal/ # 正常状态样本 │ ├── inner_race_fault/ # 内圈故障 │ ├── outer_race_fault/ # 外圈故障 │ └── ball_fault/ # 滚动体故障 ├── gear_data/ │ ├── healthy/ # 健康状态 │ ├── missing_tooth/ # 缺齿故障 │ ├── root_crack/ # 齿根裂纹 │ └── surface_pitting/ # 表面点蚀 └── documentation/ ├── acquisition_params.csv # 采集参数 └── fault_types.xlsx # 故障类型编码2.2 数据加载与可视化
使用Python加载轴承振动数据的示例代码:
import numpy as np import matplotlib.pyplot as plt # 加载单通道振动信号 bearing_normal = np.load('bearing_data/normal/channel1.npy') bearing_fault = np.load('bearing_data/inner_race_fault/channel1.npy') # 绘制时域波形对比 plt.figure(figsize=(12,4)) plt.subplot(121) plt.plot(bearing_normal[:1000]) plt.title('Normal Bearing') plt.subplot(122) plt.plot(bearing_fault[:1000], 'r') plt.title('Faulty Bearing') plt.show()注意:实际采样率为12.8kHz,建议分析时标注正确的时间轴刻度
3. 专业级数据预处理流程
3.1 时频域特征工程
针对振动信号的典型特征提取方法:
时域特征(14个经典指标):
- 均值、方差、峰值、峰峰值
- 峭度(Kurtosis)、偏度(Skewness)
- 波形指标、脉冲指标、裕度指标
频域特征:
- FFT频谱幅值(0-6.4kHz)
- 包络谱分析(针对轴承故障)
- 小波包能量熵(适合齿轮故障)
特征提取代码片段:
from scipy.stats import kurtosis, skew from scipy.fft import fft def extract_features(signal): features = { 'rms': np.sqrt(np.mean(signal**2)), 'kurtosis': kurtosis(signal), 'skewness': skew(signal), 'peak_to_peak': np.ptp(signal), 'spectral_centroid': np.sum(fft(signal)*np.arange(len(signal)))/np.sum(fft(signal)) } return features3.2 数据增强策略
针对小样本场景的有效增强方法:
| 方法 | 参数设置 | 适用场景 |
|---|---|---|
| 时域抖动 | 幅度±5% | 所有振动信号 |
| 频带随机滤波 | 截止频率±200Hz | 轴承故障 |
| 时间扭曲 | 拉伸/压缩率±10% | 低速工况 |
| 噪声注入 | SNR≥30dB | 抗干扰训练 |
4. 故障诊断模型实战
4.1 传统机器学习方案
构建随机森林分类器的完整流程:
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, max_depth=10) model.fit(X_train, y_train) # 评估 print(f"Test accuracy: {model.score(X_test, y_test):.2%}")4.2 深度学习方法示例
使用1D CNN处理原始振动信号:
import torch import torch.nn as nn class FaultDiagnosisCNN(nn.Module): def __init__(self, num_classes): super().__init__() self.conv_layers = nn.Sequential( nn.Conv1d(1, 32, kernel_size=64, stride=8), nn.ReLU(), nn.MaxPool1d(4), nn.Conv1d(32, 64, kernel_size=3), nn.ReLU(), nn.MaxPool1d(2) ) self.classifier = nn.Linear(64*15, num_classes) # 需根据实际输入调整 def forward(self, x): x = self.conv_layers(x) x = x.view(x.size(0), -1) return self.classifier(x)提示:输入数据需预处理为(batch_size, 1, signal_length)格式
5. 工程实践中的关键技巧
在实际项目中使用该数据集时,有几个经验值得分享:
- 采样率统一:虽然数据集标注了12.8kHz采样率,但不同批次数据建议重新验证
- 故障严重度分级:原始数据包含多种故障尺寸,可进一步细分为轻微/中等/严重三级
- 跨设备泛化测试:建议将数据按采集设备划分验证集,测试模型泛化能力
齿轮故障诊断的特殊处理:
# 齿轮信号特有的阶次分析 def order_analysis(signal, rpm, sampling_rate): rotation_freq = rpm / 60 order = np.fft.fftfreq(len(signal), d=1/sampling_rate) / rotation_freq spectrum = np.abs(np.fft.fft(signal)) return order, spectrum遇到信号截断问题时,可以尝试重叠分帧处理:
- 帧长:2048点(约0.16秒)
- 帧移:512点(75%重叠率)
- 加窗:汉宁窗减少频谱泄漏
