
简介这份PDF文献面向机械工程、智能制造方向的研究生与工程技术人员聚焦滚动轴承故障诊断中特征提取困难、数据处理缓慢等痛点系统梳理了机器学习算法的应用路径。全文围绕决策树、随机森林、支持向量机、K近邻与神经网络五种算法展开对比实验并创新性地仅提取均方根、峰值、crest factor和形状因子四种简单时域特征输入分类模型最终验证支持向量机诊断效果最优。文中还包含不同故障类型振动信号的时域分析、算法原理说明及与传统方法的性能对照可为后续轴承故障诊断研究提供方法参考与实验思路。资源为单个PDF文件压缩包约1.42MB篇幅紧凑便于快速通读。目前已有430人学习下载适合需要了解机器学习在故障诊断中落地方式的读者作为参考文献使用。1. 从一页 PDF 标题说起滚动轴承故障诊断到底难在哪设备维护圈子里有句话旋转机械的命门在轴承。电机、风机、齿轮箱、泵只要转起来滚动轴承就是最先喊疼的那个零件。可问题是它喊疼的方式极其隐蔽——早期故障的特征频率往往淹没在噪声里等振动幅值明显抬头往往已经磨出坑了。这也是为什么「基于机器学习算法的滚动轴承故障诊断研究」这类课题在高校课程设计和工业现场同时被反复提起它既有明确的物理对象又有足够的数据可做还能直接对应到预测性维护的落地价值。这篇文章面向两类人一类是正在做机器学习课程设计、需要跑通一套完整流程的学生另一类是现场做设备状态监测、想把手里的振动数据用起来的工程师。我会按「数据从哪来 → 特征怎么提 → 模型怎么选 → 怎么验证 → 坑在哪」的顺序把这条链路拆开讲清楚。不堆公式重点放在能复现的步骤和参数上。2. 滚动轴承故障诊断的数据从哪来公开数据集与自采信号的选择2.1 公开数据集是入门首选但要认清它的边界做滚动轴承故障诊断第一步永远是数据。自己采数据成本高传感器、采集卡、工况控制都要到位所以绝大多数研究起步阶段都用公开数据集。常见的有凯斯西储大学CWRU轴承数据、帕德博恩大学PU数据、MFPT 数据等。其中 CWRU 用得最广因为它把故障类型、故障直径、负载工况都标注得很清楚文件命名规则也统一。CWRU 的典型结构是驱动端和风扇端各布置加速度传感器采样频率分 12kHz 和 48kHz 两档故障类型包括内圈、外圈、滚动体故障直径有 0.007、0.014、0.021 英寸几档负载用 0 到 3 马力区分。这些信息直接决定了你后面做分类时的标签体系。提示CWRU 数据虽然经典但它的工况相对理想故障是人为加工出来的。如果你的目标是发论文用它没问题如果目标是直接上现场必须补一段真实工况数据做验证否则模型迁移过去大概率翻车。2.2 自采振动信号的最小采集配置如果条件允许自己采核心参数就三个采样频率、采样时长、安装位置。采样频率按经验至少取轴承故障特征频率的 10 倍以上工程上常用 10kHz 到 25.6kHz。采样时长要保证每个样本段里至少包含几个完整的冲击周期一般单样本取 1024 或 2048 点再通过重叠分段扩充样本量。安装位置优先选轴承座径向磁吸或螺栓固定都行但要注意磁吸座在高频段会衰减测早期微弱冲击时尽量用螺栓。下面是一段用 Python 读取并分段振动信号的骨架代码import numpy as np from scipy.io import loadmat # 读取 CWRU 的 .mat 文件key 通常为 X105_DE_time 这类 data loadmat(105.mat) signal data[X105_DE_time].flatten() # 分段参数每段 2048 点重叠 50% seg_len 2048 step seg_len // 2 segments [] for start in range(0, len(signal) - seg_len, step): segments.append(signal[start:start seg_len]) segments np.array(segments) print(样本数:, segments.shape[0], 每段长度:, segments.shape[1])这段代码做了三件事加载 mat 文件、把长信号切成等长样本、用 50% 重叠增加样本量。seg_len取 2048 是常见做法对应 12kHz 采样下约 0.17 秒足够覆盖低频故障特征。重叠率 50% 是折中值太高会导致训练集和测试集泄漏太低则样本不够。2.3 标签体系怎么定直接决定后面模型能不能用标签不是随便贴的。常见做法是按「故障位置 故障程度」组合比如内圈 0.007 英寸、内圈 0.014 英寸、外圈 0.007 英寸……这样类别数会比较多。如果样本量不够可以先按故障位置粗分把程度作为后续回归目标。关键是训练集和测试集的划分要按「工况」或「故障程度」留出不能随机打乱否则同一段信号切出来的样本会同时出现在两边准确率虚高到 99% 以上看着好看实际没有意义。3. 特征工程从时域、频域到时频域哪些特征真正有用3.1 时域和频域特征快但容易撞天花板时域特征包括均值、方差、均方根、峰值、峭度、裕度等。其中峭度对冲击成分特别敏感早期轴承故障刚出现时峭度会先于均方根上升所以常被当作早期指标。频域特征则是对信号做 FFT 后提取各频段能量、重心频率、频率方差等。这些特征计算快、解释性强适合做基线模型。但问题也很明显当故障程度加深或转速波动时单一统计量容易饱和或漂移。我一般会先用时域加频域特征跑一版随机森林或 SVM看看大概能到多少再决定要不要上时频域。from scipy.stats import kurtosis, skew from scipy.fft import fft def time_features(x): return { rms: np.sqrt(np.mean(x**2)), kurt: kurtosis(x), skew: skew(x), peak: np.max(np.abs(x)) } def freq_features(x, fs12000): y np.abs(fft(x))[:len(x)//2] freqs np.linspace(0, fs/2, len(y)) energy np.sum(y**2) centroid np.sum(freqs * y) / (np.sum(y) 1e-12) return {energy: energy, centroid: centroid}kurtosis和skew分别反映冲击性和对称性centroid是频谱重心故障加剧时重心常往高频移。注意fft后只取前半段因为实信号频谱对称。这些特征拼成一个向量就是传统机器学习模型的输入。3.2 时频域特征小波包和短时傅里叶怎么选轴承故障信号是非平稳的冲击成分持续时间短纯频域会把它平均掉。这时需要时频分析。短时傅里叶STFT实现简单但窗长固定低频分辨率和高频分辨率不能兼顾。小波包分解WPT能把频带自适应细分更适合提取故障冲击所在的频段。常见做法是对信号做 3 到 4 层小波包分解然后计算各节点的能量占比作为特征向量。层数不是越多越好层数太深会导致每个节点数据点太少能量估计不稳。我一般用 db4 小波分解 3 层得到 8 个频带能量。import pywt def wpt_energy(x, waveletdb4, level3): wp pywt.WaveletPacket(datax, waveletwavelet, modesymmetric, maxlevellevel) energies [] for node in wp.get_level(level, ordernatural): energies.append(np.sum(node.data**2)) energies np.array(energies) return energies / (energies.sum() 1e-12)modesymmetric是边界延拓方式避免端点效应。返回的是归一化能量占比这样不同样本之间可比。如果某个频带能量占比在故障样本里明显偏高说明该频带对应故障特征频率的谐波区域。3.3 特征筛选别把几百维特征直接塞给模型时域、频域、时频域全上特征维度轻松过百。维度太高小样本下模型容易过拟合。我一般用两种方式降维一是基于树模型的特征重要性排序取前 20 到 30 个二是用主成分分析PCA压到 10 维左右再做可视化。注意 PCA 是无监督的可能把判别信息压掉所以更稳妥的是先用随机森林看重要性。from sklearn.ensemble import RandomForestClassifier import pandas as pd # X 为特征矩阵y 为标签 rf RandomForestClassifier(n_estimators200, random_state42) rf.fit(X, y) importance pd.Series(rf.feature_importances_, indexfeature_names) top_features importance.sort_values(ascendingFalse).head(25).index.tolist()n_estimators200是经验值再多收益递减。random_state固定住保证结果可复现。选出来的特征名要记下来后面换模型时保持一致否则对比实验没有意义。4. 模型选型传统机器学习还是深度学习怎么定4.1 传统机器学习小样本下的稳妥选择如果样本量在几百到几千特征工程又做得比较扎实SVM、随机森林、XGBoost 往往就能到 95% 以上的准确率。SVM 适合高维小样本核函数选 RBFC和gamma用网格搜索调。随机森林对参数不敏感适合快速出基线。XGBoost 在表格特征上通常最强但要注意早停防止过拟合。from sklearn.svm import SVC from sklearn.model_selection import GridSearchCV param_grid {C: [1, 10, 100], gamma: [scale, 0.01, 0.001]} svm SVC(kernelrbf, probabilityTrue) grid GridSearchCV(svm, param_grid, cv5, scoringaccuracy) grid.fit(X_train, y_train) print(grid.best_params_, grid.best_score_)cv5是五折交叉验证样本少时可以调到 10。probabilityTrue会慢一些但后面画 ROC 曲线需要。注意交叉验证要在训练集内部做测试集始终留到最后。4.2 深度学习样本够、算力够再上一维卷积神经网络1D-CNN是轴承故障诊断里最常用的深度模型直接吃原始振动信号省去手工特征。典型结构是几层卷积加池化最后全连接分类。如果样本量上万1D-CNN 通常能比传统方法高几个点。但样本少的时候深度模型很容易过拟合需要加 Dropout、BatchNorm 和数据增强。import torch import torch.nn as nn class BearingCNN(nn.Module): def __init__(self, num_classes): super().__init__() self.net nn.Sequential( nn.Conv1d(1, 16, kernel_size15, stride2, padding7), nn.BatchNorm1d(16), nn.ReLU(), nn.MaxPool1d(2), nn.Conv1d(16, 32, kernel_size7, stride2, padding3), nn.BatchNorm1d(32), nn.ReLU(), nn.MaxPool1d(2), nn.Flatten(), nn.Linear(32 * 32, 64), nn.ReLU(), nn.Dropout(0.3), nn.Linear(64, num_classes) ) def forward(self, x): return self.net(x)第一层卷积核取 15是为了覆盖中频冲击成分stride2 降采样减少计算量。Dropout 0.3 是常用值样本越少可以适当加大。训练时学习率用 1e-3优化器 Adambatch size 取 64 或 128。4.3 迁移学习和数据增强小样本场景的补救手段现场数据往往很少这时可以用迁移学习先在 CWRU 上预训练再用少量现场数据微调。或者用数据增强比如加高斯噪声、时间平移、幅值缩放扩充训练集。注意增强只对训练集做验证和测试集保持原始分布。def add_noise(x, snr_db20): noise np.random.randn(*x.shape) signal_power np.mean(x**2) noise_power signal_power / (10**(snr_db/10)) return x np.sqrt(noise_power) * noisesnr_db20表示信噪比 20 分贝属于轻度噪声。增强后的样本要重新检查标签是否还成立别把故障特征淹没了。5. 避坑与排查滚动轴承故障诊断里最容易翻车的五件事5.1 准确率 99% 但现场一塌糊涂现象测试集准确率极高换一组工况数据就崩。原因随机划分样本导致同一段信号的重叠片段同时进入训练和测试数据泄漏。解决按工况、按故障程度或按时间段划分确保训练集和测试集来自不同条件。如果做交叉验证用 GroupKFold 按组划分。5.2 峭度指标不升反降现象明明有故障峭度却比正常轴承还低。原因故障后期冲击密集信号趋于宽带噪声峭度反而下降或者传感器安装位置不对冲击被衰减。解决结合均方根和包络谱一起看不要单看峭度。安装位置尽量靠近轴承座避免经过多层结合面。5.3 特征频率算出来对不上现象包络谱里找不到理论故障特征频率。原因转速估计不准或者滚动体打滑导致实际特征频率偏移。解决用转速计实测转速或者从振动信号里估计转频。包络分析时允许特征频率有 1% 到 2% 的容差别死盯理论值。5.4 深度学习模型训练 loss 不降现象loss 震荡或一直很高。原因学习率太大、数据没归一化、标签编码错误。解决先检查输入是否做了标准化标签是否从 0 开始连续编码。学习率从 1e-4 试起加学习率预热。如果还不行先用一个小批量数据过拟合确认模型本身没问题。5.5 换数据集后模型完全失效现象在 CWRU 上训练好的模型换到 PU 数据上准确率掉到随机水平。原因两个数据集的采样频率、传感器位置、工况分布不同特征尺度不一致。解决做域适应或者至少对每个数据集单独做标准化。更稳妥的做法是重新提取特征而不是直接套用。6. 把模型跑成可复现的实验验证方法与一个实用技巧6.1 验证不是只看准确率分类任务里准确率在类别不平衡时会骗人。轴承故障诊断中正常样本往往远多于故障样本这时候要看混淆矩阵、召回率和 F1。尤其是早期故障那一类召回率比整体准确率重要得多。我一般会画混淆矩阵看哪两类容易混再回头检查特征是不是没区分开。from sklearn.metrics import classification_report, confusion_matrix import seaborn as sns y_pred model.predict(X_test) print(classification_report(y_test, y_pred, digits4)) cm confusion_matrix(y_test, y_pred) sns.heatmap(cm, annotTrue, fmtd, cmapBlues)digits4保留四位小数方便对比不同模型的细微差异。混淆矩阵里如果内圈和外圈互相混说明频域特征没抓住位置差异可以补包络谱特征。6.2 一个实用技巧用包络谱做二次确认不管模型输出什么我都会对判为故障的样本做一次包络谱分析看故障特征频率及其谐波是否真的存在。包络谱的做法是先对信号做希尔伯特变换取包络再对包络做 FFT。这一步相当于给模型加了一道物理可解释的校验能过滤掉一部分误报。from scipy.signal import hilbert def envelope_spectrum(x, fs12000): analytic hilbert(x) envelope np.abs(analytic) spectrum np.abs(fft(envelope - np.mean(envelope)))[:len(x)//2] freqs np.linspace(0, fs/2, len(spectrum)) return freqs, spectrumhilbert返回解析信号取模得到包络。减去均值是为了去掉直流分量否则零频会淹没一切。得到的包络谱里如果在外圈故障特征频率比如 BPFO及其二倍频、三倍频处有峰基本可以确认。6.3 我踩过的坑和现在的习惯早期我做实验喜欢把特征堆到几百维模型换了一个又一个结果换数据集就翻车。后来强迫自己每加一个特征都要能说出它在物理上对应什么。现在我的习惯是先用少量物理意义明确的特征跑基线再逐步加每加一次都记录验证集指标变化。模型文件、特征列表、划分方式全部固定随机种子保证三个月后还能复现。这套流程不炫技但稳。希望帮到你。本文还有配套的精品资源点击获取