ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

高速列车轴承智能故障诊断:特征工程与CNN-LSTM建模复盘

高速列车轴承智能故障诊断:特征工程与CNN-LSTM建模复盘 去年华为杯研赛E题一出高速列车轴承智能故障诊断这几个字让不少人盯了很久。高速列车、轴承、故障诊断——单拆开都好理解合在一起就是一道需要把信号处理、特征工程、机器学习模型、论文写作全部串起来的综合题。我们队花了三天两夜最后交出一篇50多页的原创论文成绩不算顶尖但足够用。这篇文章就是那次完整过程的复盘从原始振动波形到最后论文里的诊断闭环每一步怎么想、怎么做、踩了哪些坑都写出来。准备打华为杯或者想入门工业故障诊断类赛题的朋友可以拿这份复盘当路线图应该能帮你少绕不少弯。1. 拿到E题后我先做了什么从信号分类到故障指纹的认知转变1.1 先别急着调模型把赛题拆成四块我见过太多队伍拿到题就打开Jupyter Notebook开始跑模型这种开局基本决定了论文的上限不会太高。E题这类工程诊断题第一件事不是建模而是把题目吃透。当时题目给的原始数据通常是按工况和状态分好的一组振动时序文件一类是正常状态其余是若干故障状态按轴承常见失效形式来分比如内圈故障、外圈故障、滚动体故障。任务说白了就是给一段振动信号判断轴承属于哪种状态。但判断状态这四个字背后其实压着好几层问题。振动信号是时间序列原始波形不能直接进分类器故障信息藏在频率成分、冲击特征、能量分布里不同转速和载荷下同一个故障的波形形态还可能不一样。所以我在队内第一件事就是把问题拆成四块数据理解与预处理搞清楚每个文件是什么、采样率多少、时长多少、类别分布是否均衡。特征工程从时域、频域、时频域把原始波形变成能刻画故障的数值特征。分类建模与对比至少跑出传统机器学习和深度学习两类方案用同一套评估口径做对比。结果解释与论文呈现混淆矩阵里哪两类最容易混、参数变了精度怎么变都要能说清楚。四人队我们当时是四人分工也按这四块走避免三个人同时调一个模型、另一个人摸鱼的情况。这步看起来虚实际上直接决定了后面两天半的效率。1.2 数据核查是最容易偷懒但其实最关键的环节很多队伍拿到数据直接 pd.read_csv 然后就开始画图画完发现信号有直流漂移、有异常尖峰、甚至有个文件是空的回头再补就非常被动。我们当时花了两个多小时做数据核查列了一张表把每一个文件的文件名、样本长度、采样率、通道数、对应的状态类别全部登记清楚。具体操作上我用Python读取每个文件后会做这几项检查看均值是否明显偏离零。如果均值很大说明存在直流分量后续提取特征的时候峭度、峰值因子都会被带偏需要先做去均值处理。看信号是否有明显尖峰或缺失段。振动信号偶尔会出现传感器误报的离群点这类毛刺如果不做中值滤波或者幅值截断会在频域里制造虚假的高频能量。看每个类别的样本数量。工业故障数据天然存在不均衡如果正常样本有1200个、某个故障只有150个后面做训练集测试集划分就要用分层采样而不是随机抽样。这些东西写进论文里就是数据预处理那一节但在实际操作中它们决定了后面所有特征和模型是否可靠。去年不少队伍因为没做这步跑出来的高精度其实是对异常数据的过拟合评委一眼就能看出来。1.3 把任务看成找故障指纹而不是训练分类器我还想强调一个认知层面的转变。一开始我们队里有人提议直接用端到端深度学习把原始波形丢进1D-CNN里让它自己学特征。这个思路不能说错但放在数学建模赛题里它有两个问题一是数据量往往不够大纯深度模型容易过拟合二是论文写出来会很单薄——评委想知道你从信号里看到了什么而不是你调了个黑盒。所以我们最终把问题定位成找故障指纹。所谓指纹就是不同故障状态下振动信号里相对稳定、可区分的模式。有的故障会在特定频带激发冲击能量有的会在时域波形里表现出周期性脉冲有的会让信号的概率分布偏离正态。特征工程的目标就是把这种指纹量化成数值交给分类器去分。这个视角帮助我们后续选特征和模型时保持一致每一类特征都要对应一个物理上的解释而不是单纯堆数字。2. 波形落地的三条特征路径时域指标、频域指标与时频指标2.1 时域特征峭度为什么是轴承诊断的老牌指标时域特征是最直观的一层。我们当时用Python的numpy写了一个提取函数每个信号窗口算一组统计量包括均值、标准差、均方根值RMS、峰值、峭度、偏度、峰值因子、波形因子、脉冲因子和裕度因子。代码核心部分大概长这样import numpy as np def time_domain_features(signal): feats {} feats[mean] np.mean(signal) feats[std] np.std(signal) feats[rms] np.sqrt(np.mean(signal ** 2)) feats[peak] np.max(np.abs(signal)) feats[kurtosis] np.mean((signal - feats[mean]) ** 4) / (feats[std] ** 4) feats[skewness] np.mean((signal - feats[mean]) ** 3) / (feats[std] ** 3) feats[crest_factor] feats[peak] / feats[rms] feats[shape_factor] feats[rms] / (np.mean(np.abs(signal))) feats[impulse_factor] feats[peak] / (np.mean(np.abs(signal))) feats[margin_factor] feats[peak] / (np.mean(np.sqrt(np.abs(signal))) ** 2) return feats这些指标不是随便选的。轴承早期故障会产生冲击脉冲信号概率密度分布会偏离正态表现在指标上就是峭度明显上升。所以峭度是轴承故障诊断里最经典的单指标之一。峰值因子和脉冲因子对局部冲击也敏感而RMS反映的是信号整体能量水平正常状态和故障状态往往有差异。不过这层特征的问题也很明显它把时间信息压扁成几个统计量丢掉了冲击什么时候发生以及冲击以什么频率出现的信息所以单独用时域指标做分类能区分但精度有上限。我们实际测试里只用时域特征做随机森林分类准确率大概在88%左右作为基线可以作为最终方案不够。2.2 频域特征FFT之后看能量重心怎么移频域特征是第二层也是故障诊断里信息量最大的来源之一。对振动信号做快速傅里叶变换FFT后不同故障会在特定频率位置激发出不同强度的谱峰。我们提取的频域特征包括频谱重心、均方频率、频率方差还有几个主要频带的能量占比。这里要补充一个物理背景滚动轴承的故障特征频率由转速、轴承几何尺寸和故障位置共同决定内圈故障、外圈故障、滚动体故障的特征频率公式不一样。虽然题目通常不直接给轴承几何参数但FFT谱图上频峰位置的差异是真实存在的。我们在论文里就放了正常状态和一个故障状态的频谱对比图评委看到这种图和对应的解释比单纯堆数字有说服力得多。频域特征的提取也有一个容易忽略的细节先做去均值和窗函数处理再做FFT否则频谱里会出现明显的泄漏和直流分量。我们用的是Hanning窗窗口长度取1024点重叠率50%这样可以减少频谱泄漏。2.3 时频域特征小波包分解和熵特征补上非平稳短板FFT有一个天生局限——它只告诉你信号里有哪些频率成分不告诉你这些频率在什么时间出现。而轴承的早期故障信号恰恰是非平稳的冲击是瞬时的、间歇的单纯看全局频谱会把这些瞬态信息平均掉。所以我们还提取了第三层特征时频域特征。我们用了两种手段。第一种是小波包分解把信号按频带细分到三层或四层然后计算每个频带节点的能量占比。小波包相比普通小波的优势在于它同时对低频和高频部分做细分对振动信号里的瞬态冲击捕捉更准。第二种是样本熵或多尺度排列熵。熵这个指标在轴承诊断里很实用因为故障状态下的振动信号会比正常状态更乱或者更规则熵值能把这种复杂度差异量化出来。一个窗口提取完三层特征以后维度大约在80到120之间。特征不是越多越好——维度接近样本数时就离过拟合不远了。我们后续用PCA消冗余保留累计解释方差比超过90%的主成分实际大约降到30维左右。降维之后再做分类速度和稳定性都明显提高。2.4 标准化问题SVM和神经网络对量纲零容忍特征提取完之后还有一步容易被新手跳过标准化。随机森林、XGBoost这类树模型对量纲不敏感特征大小不影响分裂点选择但SVM、神经网络、K近邻这类基于距离或梯度的模型对量纲非常敏感。比如RMS的量级可能到几百峭度只有个位数如果不做标准化模型会把绝大部分权重放在RMS上。我们当时的做法是z-score标准化也就是对每个特征减去均值再除以标准差。特别注意标准化参数必须在训练集上计算然后应用到验证集和测试集而不是在全部数据上一起标准化。否则就相当于把测试集的信息泄漏进了训练过程精度虚高答辩一问就穿帮。3. 从ABC-SVM到CNN-LSTM一次模型对比实验的完整记录3.1 为什么先跑ABC-SVM而不是直接上深度学习建模阶段第一版我们用了ABC-SVM作为核心模型。ABC是人工蜂群算法Artificial Bee Colony的缩写它用来优化SVM的两个关键参数惩罚系数C和径向基核函数的参数gamma。为什么用这个组合原因有两条。第一SVM非常适合小样本分类结构风险最小化让它在高维特征空间里找最大间隔超平面不太容易过拟合。我们当时特征降到30维、每类样本几百个SVM属于标准答案级别的基线模型。第二ABC比网格搜索更有效率。SVM调参如果靠GridSearchC和gamma各设几十个候选值组合数量很大跑一遍很费时间。ABC模拟蜜蜂采蜜的群体智能过程用少量个体迭代搜索就能逼近较优参数。而且这类智能优化算法传统分类器的组合写进论文里算法设计层次会显得更完整评委也看得懂。ABC-SVM的思路可以简化成这几步初始化一群蜜源每个蜜源对应一组(C, gamma)。雇佣蜂阶段在邻域内扰动参数计算SVM交叉验证精度作为适应度。跟随蜂阶段按适应度概率选择优秀蜜源重点开采。侦察蜂阶段如果某个蜜源连续多轮没有改进就随机生成新蜜源替代。迭代大概30到50轮每轮交叉验证一次的耗时取决于特征维度和样本数整体可控。我们用它跑出的精度比手动GridSearch的SVM高了大约1.5个百分点。3.2 传统模型对比表固定训练集、验证集谈精度才有意义为了保证论文里模型对比可信我们做了一个严格设定把原始数据按类别分层划分成训练集、验证集和测试集比例是70%、15%、15%所有的特征提取和标准化都只在训练集上拟合验证集用来调超参数测试集只用来最终评估。这个规矩从第一个模型坚持到最后一个模型。当时跑了四个传统模型原始SVM、随机森林、XGBoost、ABC-SVM。以我们这份数据为例结果大致如下模型测试集准确率Macro-F1训练耗时原始SVM91.8%0.909约2分钟随机森林94.2%0.936约1分钟XGBoost95.1%0.943约4分钟ABC-SVM96.3%0.958约18分钟几组数字只是我们当时那版数据的实测结果不同赛题的数据分布不一样数值不可迁移。但结论可以参考调好参数的SVM在小样本平特征场景下往往比树模型略强ABC优化带来的增益是真实存在的。3.3 深度模型1D-CNN和CNN-LSTM到底比传统模型强在哪传统模型再好上限也卡在特征工程上——我们觉得那版特征已经比较全面了但总怕漏掉特征里没提取到的模式。于是第二路方案直接吃原始信号段用1D-CNN做端到端分类。1D-CNN的卷积核只沿时间方向滑动适合提取局部的冲击形态。我们用的结构很常规两层Conv1DBatchNormReLU每个卷积层的卷积核大小是16和8滤波器数分别是32和64中间接一个最大池化后面展平接全连接层和Softmax输出。训练细节滑窗长度为1024点滑窗步长512点batch size设64Adam优化器初始学习率1e-3配合早停策略验证集连续10个epoch不涨就停。这样的网络结构对故障冲击的局部特征捕捉很有效测试集准确率跑到96.8%和ABC-SVM打平略高。但纯CNN的问题是它用池化不断丢掉时间位置信息对冲击的周期节律这种跨较长时段的依赖关系建模能力有限。而轴承故障信号里滚动体经过损伤点产生的冲击往往是周期性的这个周期信息正是能区分某些故障的关键。所以我们又上了CNN-LSTM组合先用CNN提取局部冲击特征再把CNN输出的特征序列送入LSTM层让LSTM去建模时序上的依赖关系。这个组合在测试集上做到98.1%比纯CNN提升1.3个百分点。这个提升在工程赛题里相当可观也成了整篇论文最终的核心模型。3.4 消融实验才是深度模型部分的说服力所在论文里如果只写我们用了CNN-LSTM精度98.1%评委会觉得你是在黑盒里碰运气。所以我们在论文里加了一张消融实验表分别去掉LSTM层、去掉BatchNorm、把CNN换成全连接层看精度分别掉多少。实测结果是这样的模型变体测试集准确率CNN-LSTM完整98.1%去掉LSTM层96.8%去掉BatchNorm95.2%CNN换成FC全连接93.5%这张表至少说明了三件事加LSTM建模时序依赖确实有效BatchNorm对训练稳定性帮助很大CNN局部特征提取比全连接直接压平信号强很多。有了这张表核心模型就不再是拍脑袋选出来的而是每个组件都有实验证据支撑。4. 论文成形时最容易被忽略的三个拿分细节摘要、图表和灵敏度分析4.1 摘要不是写做了什么而是写得到了什么作为过来人我可以负责任地说评委看论文最先看摘要而摘要写得像目录扩展版的队伍特别多。很多摘要长这样本文研究了高速列车轴承故障诊断问题提出了一种基于特征提取和CNN的方法取得了较好效果。——这类摘要最大的问题是通篇没有信息量。我们当时把摘要当压缩饼干来写。结构是第一句交代问题是高速列车轴承智能故障诊断安全性和可靠性要求高。第二到第四句分别说明数据预处理和特征提取的思路、ABC-SVM基线模型的结论、CNN-LSTM核心模型的精度。最后给出关键数字和结论。摘要里出现了96.3%的SVM基线精度98.1%的核心模型精度混淆矩阵显示滚动体故障与内圈故障存在轻微混淆这类细节评委看完摘要基本就能判断这篇论文的研究思路和结果是否扎实。一句话总结摘要心法把论文里最硬核的结果数字和结论前置不要留给读者你做了研究的模糊印象要让他们直接看到你的研究做到了什么程度。4.2 图表要让评委一眼看懂而不是贴满代码输出图表是论文的脸面。我们审阅过一些往届论文常见问题是把matplotlib生成的原始折线图直接截图贴上去坐标轴没标中文图例做成了默认样式更可怕的是图里看不出结论。评委看这种图表要自己边猜边找印象分自然上不去。我们论文里主要放了这几类图正常状态和典型故障状态的时域波形对比图横轴时间、纵轴振幅一眼能看出冲击脉冲的差异。对应信号的FFT频谱对比图标注出不同故障特征频率附近能量差异明显的位置。特征提完之后放一张t-SNE降维图用不同颜色标注不同类别展示特征可分性。如果图里几类信号明显聚成几团等于直接用图证明了特征工程有效。混淆矩阵热力图加ROC曲线放在模型评估小节。每张图下面都用一两句话写从图中可以看出什么结论而不是孤零零一张图。评委不需要自己解读阅读体验完全不一样。4.3 灵敏度分析回答你的参数是玄学还是科学比赛论文里还有一类常见质疑你的模型精度这么高是不是在特定超参数下凑出来的灵敏度分析就是用来回应这种质疑的。我们当时对滑窗长度、训练集比例、学习率这几个关键参数分别做了扰动实验。以滑窗长度为例我们分别用512、1024、2048点训练了三套模型精度变化约为512点时97.5%1024点时98.1%2048点时97.0%。这组数据说明模型对滑窗长度有一定敏感性但整体稳定最优窗口在1024附近过大或过小都会损失部分时频分辨率或样本数量。对训练集比例做灵敏度分析时从20%逐渐增加到80%精度从94%左右平滑上升到98%左右这说明模型在小样本下也有较强的适应能力不是完全依赖大数据量堆出来。灵敏度分析在论文里占的篇幅可以不大但它是模型可靠性的证据链里非常重要的一环。没有这节核心模型的精度会被认为是孤证有了这节精度就变成了在合理范围内均可复现的结论。4.4 误差分析承认混淆比假装完美更得分最后一个拿分细节是误差分析。我们当时模型的最终混淆矩阵里整体的对角线几乎是干净的但滚动体故障类别有少量样本被误判为外圈故障。我们没有回避这一点而是在论文里专门解释滚动体故障和外圈故障都属于冲击型故障频谱成分在部分频带重叠特征在高维空间里存在边缘交叠。我们在后续扩展里提到可以通过引入更高阶的时频特征或增加多传感器通道来进一步区分这两类。这种处理方式比硬说所有类别准确率都是99%要可信得多。评委都清楚真实工业数据里没有完美分类一个能分析误差来源并给出改进方向的队伍比假装完美的队伍更像真正在做工程。5. 踩坑复盘与后续扩展方向5.1 坑一特征堆得太多测试集精度反而崩了第一版特征工程我们为了追求全面把时域、频域、时频域全部指标堆到一起一个窗口提了200多维特征。结果随机森林在训练集上接近99%测试集掉到92%典型的过拟合。后来用PCA降到30维并做交叉验证测试集反而回升到94%以上。教训很直接特征不是越多越好维度接近样本数时模型会把噪声也当规律学进去。后续论文里我们把特征筛选的过程也写进了附录包括候选特征池、PCA累计解释方差曲线、降维后特征数选择依据。这比直接甩出一份最终特征表显得更像严谨的研究过程。5.2 坑二滑窗长度设置不当深度模型差点翻车做CNN-LSTM时我们一开始用2048点滑窗按理说信息量比1024多但样本数量直接减半模型训练不稳定精度反而低。后来发现这是典型的窗口长度和样本量互相制约问题窗口越长每段信号独立样本数越少。我们最后定1024点为平衡点同时用重叠滑窗步长512扩充样本才让训练效果稳定下来。这条经验在论文的灵敏度分析里做了呈现既解决了实际建模中的问题又给论文增加了一个可复现的技术细节算是踩坑踩出了价值。5.3 坑三验证集和测试集边界模糊导致精度虚高有段时间为了调参方便我们直接用测试集观察模型表现反复调参到测试集精度满意为止。结果换到另一批测试数据上准确率掉了好几个点。后来彻底把测试集锁死只允许用它做最终一次评估调参全部在训练集和验证集范围内进行。这也是论文方法部分必须写清楚的数据划分协议否则论文结果会被质疑泄漏。5.4 后续还能往哪走如果这道题继续做下去我觉得有几个方向是有实际价值的。一是域适应不同车速、不同载荷下振动信号分布不同模型能否跨工况泛化是工程落地的关键。二是小样本异常检测真实场景里故障样本远少于正常样本用正常样本训练重构误差、用异常检测来发现未见过的故障类型比固定分类更贴近现实。三是可解释性对CNN-LSTM用注意力权重或类激活映射看模型到底关注信号的哪一段这对工业现场诊断的可信度非常重要。写到这里我最大的体会是这类工程诊断赛题最后拼的不是谁的模型参数更花哨而是谁能把一个问题从头到尾讲清楚、做闭环。数据核查、特征工程、模型对比、灵敏度分析、误差解释每一块都不能缺。只要这个闭环是完整的哪怕精度不是全场最高论文的含金量也会被评委看见。
返回列表