☰
Feature-level SMOTE在重大装备PHM故障诊断中的实战应用与调参经验
2026/10/14 14:38:03 网站建设 项目流程

重大装备的健康管理,说白了就是给价值几千万甚至上亿的设备装一个"体检+预警"系统。风电齿轮箱、航空发动机、高铁牵引系统、盾构机主轴承,这些设备一旦非计划停机,损失动辄以百万计。PHM(Prognostics and Health Management,故障预测与健康管理)这套方法论在工业界已经喊了十几年,但真正落地时,做算法的人最头疼的往往不是模型选得不够花哨,而是——故障样本太少,正常样本太多,数据极度不平衡。我做过好几个旋转机械的故障诊断项目,每次拿到数据第一反应都是:故障工况可能就几百条,正常工况几万条,比例悬殊到让分类器直接"躺平"——全预测成正常,准确率还能有95%以上,但这样的模型毫无工程价值。

Feature-level SMOTE 就是在这个背景下被我反复使用的一把利器。它和直接在原始信号上做SMOTE有本质区别:原始信号维度高、噪声大、时序相关性强,直接插值生成的"假故障样本"物理意义存疑;而在特征层面做过采样,维度已经降下来了,每个维度都有明确的物理含义(比如峭度、裕度因子、小波包能量熵),插值出来的合成样本至少在特征空间里是"像那么回事"的。这篇文章我会把我在重大装备PHM项目中使用Feature-level SMOTE的完整思路拆开讲——从为什么选它、特征工程怎么做、SMOTE的变体怎么挑、和DSMHSA这类注意力机制怎么配合,到实际踩过的坑和调参经验,尽量把每个决策背后的逻辑说清楚。

1. 为什么原始信号上的SMOTE在PHM场景里经常翻车

1.1 故障样本稀缺是PHM的先天困境

重大装备的故障数据稀缺不是偶然,而是由几个硬约束决定的。第一,设备本身可靠性设计就很高,MTBF(平均故障间隔时间)动辄上万小时,你不可能为了采故障数据故意把设备搞坏。第二,即使发生故障,从异常萌生到功能失效的退化过程可能只有几个小时甚至几十分钟,传感器采样窗口稍纵即逝。第三,工业现场的安全规程不允许设备在明显异常状态下继续运行,往往一报警就停机检修了,拿不到完整的退化轨迹数据。

这就导致一个典型的数据分布:正常样本占比95%甚至99%以上,不同故障模式(内圈故障、外圈故障、滚动体故障、保持架故障)各自只有几十到几百条。用这种数据直接训练分类器,模型会严重偏向多数类。我见过太多项目,论文里报告准确率98%,一上现场测试就废了,因为那98%全是靠预测正常类刷出来的。

1.2 原始信号插值生成的样本为什么不可信

SMOTE的核心操作是在少数类样本之间做线性插值。如果你在原始振动信号上做这件事,问题就来了。振动信号是典型的时间序列,相邻采样点之间有强相关性,两个不同故障样本在时域上往往没有对齐——相位不同、转速波动导致的周期不对齐、甚至采样触发时刻的微小差异,都会让两个"同类"样本的波形看起来差异巨大。在这种情况下做线性插值,生成的信号在物理上可能对应一个根本不存在的状态。

更麻烦的是,原始信号维度极高。一个采样频率20kHz、采样时长1秒的样本就是20000维。SMOTE在高维空间里做近邻搜索本身就不可靠——维度灾难会让距离度量失去区分度,你以为找到了最近邻,实际上那个"最近邻"可能离得很远。而且高维空间里插值生成的样本会迅速"弥散"到数据分布的低密度区域,生成一堆既不属A类也不属B类的"四不像"。

1.3 特征级过采样的逻辑优势

把过采样搬到特征层面,情况就完全不同了。特征提取的过程本身就是一次强降维和去噪——你从20000维的原始信号里提取出可能20到50维的特征向量,每一维都对应一个明确的物理或统计量。在这个空间里做SMOTE,有几个天然优势:

  • 维度可控:20到50维的特征空间,近邻搜索的可靠性远高于20000维。
  • 物理可解释:插值生成的合成样本,每个特征值都能追溯含义,方便工程师判断是否合理。
  • 噪声鲁棒:特征提取阶段已经滤掉了大部分高频噪声,特征空间里的样本分布更紧凑。
  • 计算高效:在特征空间做近邻搜索和插值的计算量,比原始信号空间低几个数量级。

注意:特征级SMOTE不是万能的。如果特征提取本身就把故障信息丢了,那后面怎么过采样都救不回来。特征工程的质量是前提。

2. 特征工程:Feature-level SMOTE的地基怎么打

2.1 时域、频域、时频域特征的取舍

做旋转机械故障诊断,特征一般从三个域提取。时域特征包括均值、方差、均方根值、峰值、峭度、偏度、裕度因子、波形因子等;频域特征包括各阶次幅值、频谱重心、频率方差等;时频域特征主要是小波包能量、经验模态分解(EMD)各分量的能量占比等。

我的经验是:不要贪多。时域特征里,峭度和裕度因子对冲击性故障(比如轴承局部剥落)特别敏感,这两个必留。频域特征里,转频各阶次及其边带幅值对齿轮箱故障诊断至关重要。时频域特征里,小波包分解后各频带的能量熵对早期微弱故障的捕捉能力强于单纯的时域或频域指标。

一个实用的组合是:时域选5到8个,频域选8到12个,时频域选6到10个,总共控制在20到30维。维度太高,SMOTE的近邻搜索会退化;维度太低,故障模式的区分度不够。

2.2 特征归一化的时机很关键

这里有一个很多人踩过的坑:归一化到底应该在SMOTE之前还是之后做?

正确做法是先归一化,再做SMOTE。原因很简单:SMOTE依赖欧氏距离找近邻,如果各特征量纲差异巨大(比如峭度可能在个位数,而某个频域幅值可能是几千),距离计算会被大量纲特征主导,近邻搜索完全失真。先做归一化(推荐Z-score标准化,即减均值除标准差),让每个特征都在同一尺度上,SMOTE才能公平地对待每一维。

但要注意,归一化的参数(均值和标准差)必须只用训练集计算,然后应用到验证集和测试集。如果用了全体数据的统计量,就造成了数据泄露,测试结果会虚高。

2.3 特征筛选:不是越多越好

提取了30维特征之后,我通常会做一轮筛选。方法有三类:

  • 过滤法:计算每个特征与标签的互信息或Fisher判别比,去掉区分度低的特征。
  • 包裹法:用递归特征消除(RFE),但计算量大,适合特征数不多的情况。
  • 嵌入法:用随机森林或梯度提升树的特征重要性排序,取Top-K。

在PHM场景里我偏好嵌入法,因为树模型能自动捕捉特征间的非线性交互,而且特征重要性排序直观。一般我会把30维压到15到20维,既保留了关键信息,又降低了SMOTE的搜索空间维度。

特征类型推荐数量代表特征对何种故障敏感
时域5-8峭度、裕度因子、RMS冲击性故障
频域8-12转频阶次幅值、边带齿轮箱故障
时频域6-10小波包能量熵早期微弱故障

3. SMOTE家族在特征空间里的选型实战

3.1 标准SMOTE的局限与适用边界

标准SMOTE的做法是:对每个少数类样本,找到它的K个最近邻(K通常取5),然后随机选一个近邻,在两者连线上随机取一点作为合成样本。这个算法简单有效,但在特征空间里也有明显短板。

如果少数类样本在特征空间里分布成多个簇(比如同一种故障在不同工况下特征差异很大),标准SMOTE可能在两个相距较远的簇之间插值,生成毫无意义的中间样本。另外,如果少数类样本恰好落在多数类区域的边缘,SMOTE生成的样本会进一步侵入多数类空间,加剧类别重叠。

我的经验是:标准SMOTE适合少数类样本分布相对紧凑、且与多数类有清晰边界的情况。如果数据分布复杂,就得换更聪明的变体。

3.2 Borderline-SMOTE与ADASYN的取舍

Borderline-SMOTE的思路是:只对那些"危险"的少数类样本做过采样——所谓危险,是指它们的近邻里多数类样本占多数,也就是处在分类边界附近的样本。这样生成的合成样本集中在边界区域,有助于分类器学好决策边界。

ADASYN则更进一步,它根据每个少数类样本的近邻中多数类样本的比例,自适应地决定每个样本生成多少合成样本。比例越高(越难学),生成越多。

在PHM场景里,我的实测结论是:如果故障模式之间的特征差异明显,用标准SMOTE就够了;如果不同故障模式在特征空间里重叠严重(比如早期内圈故障和早期外圈故障的特征很接近),Borderline-SMOTE或ADASYN会更有优势。但ADASYN有个副作用——它可能对噪声样本过度关注,如果少数类里有几个离群点,ADASYN会在那附近生成大量样本,反而引入噪声。所以用ADASYN之前,最好先做一轮离群点清洗。

3.3 SMOTE与Tomek Links、ENN的联用

过采样和欠采样不是对立的,联用往往效果更好。SMOTE + Tomek Links 是我常用的组合:先用SMOTE生成合成样本,然后用Tomek Links清除那些与多数类样本互为最近邻的少数类样本(这些通常是边界噪声)。这样既增加了少数类样本量,又清理了边界噪声。

另一个组合是SMOTE + ENN(Edited Nearest Neighbours):用SMOTE过采样后,对每个样本检查其K个近邻,如果多数近邻的类别与它不同,就删掉它。这个组合更激进,清理力度更大,适合噪声较多的数据集。

from imblearn.combine import SMOTETomek from imblearn.over_sampling import BorderlineSMOTE # 方案一:Borderline-SMOTE smote = BorderlineSMOTE(kind='borderline-1', k_neighbors=5, random_state=42) X_res, y_res = smote.fit_resample(X_train, y_train) # 方案二:SMOTE + Tomek Links smotetomek = SMOTETomek(random_state=42) X_res, y_res = smotetomek.fit_resample(X_train, y_train)

提示:过采样只能在训练集上做,绝对不能对验证集和测试集做过采样。测试集必须保持原始分布,否则评估结果没有意义。

4. DSMHSA注意力机制与Feature-level SMOTE的配合逻辑

4.1 DSMHSA解决的是什么问题

DSMHSA(Dual-Stream Multi-Head Self-Attention,双流多头自注意力)这类结构在PHM里的价值,在于它能同时捕捉特征内部的依赖关系和特征之间的交互关系。传统的全连接网络把特征向量当成一个扁平输入,忽略了特征之间的结构化关系;而自注意力机制可以学习到"峭度和裕度因子在某种故障模式下会同时升高"这类高阶关联。

双流的设计通常是一路处理时域特征序列,一路处理频域特征序列,然后通过交叉注意力融合。这种结构对多传感器、多特征来源的场景特别友好。

4.2 过采样与注意力的顺序问题

这里有一个架构设计上的关键决策:SMOTE应该在注意力网络之前还是之后?

我的做法是在注意力网络之前。原因有两点。第一,SMOTE是在特征空间做数据增强,它不涉及模型参数,放在数据预处理阶段最自然。第二,如果在网络中间做插值,梯度回传会变得复杂,而且注意力权重的可解释性会被破坏。

但有一个例外:如果你的注意力网络本身有很强的特征提取能力(比如输入的是原始信号而不是手工特征),那可以考虑在网络的特征提取层之后、分类头之前做特征级过采样。不过这属于端到端学习的范畴,实现复杂度高,我一般不建议在工程项目里这么做。

4.3 类别权重与过采样的协同

即使做了SMOTE,我通常还会在损失函数里加类别权重。为什么?因为SMOTE生成的合成样本毕竟不是真实样本,它们的分布和真实少数类样本有偏差。类别权重可以让模型在训练时对少数类保持更高的敏感度,和SMOTE形成互补。

具体做法是:用sklearn的compute_class_weight计算权重,然后传给损失函数。权重一般设为与类别频率成反比。如果SMOTE之后各类别已经比较均衡了,权重可以设得温和一些(比如开方后再取倒数),避免过拟合少数类。

5. 完整实战流程与踩坑记录

5.1 从原始信号到特征矩阵的完整链路

我把整个流程串一遍。假设你拿到的是多通道振动信号,采样频率20kHz,每个样本1秒。

第一步,数据清洗。去掉明显的异常段(比如传感器脱落导致的零值段),做去趋势处理。

第二步,分段。用滑动窗口把长信号切成固定长度的样本,窗口长度一般取旋转周期的整数倍。重叠率50%是常用值。

第三步,特征提取。对每个窗口计算时域、频域、时频域特征。频域用FFT,时频域用小波包分解(推荐db4小波,分解3到4层)。

第四步,特征归一化。用训练集的均值和标准差做Z-score。

第五步,特征筛选。用随机森林特征重要性取Top-20。

第六步,SMOTE过采样。只在训练集上做。

第七步,训练分类器。可以是XGBoost、1D-CNN、或者DSMHSA这类注意力网络。

第八步,评估。用原始分布的测试集,看混淆矩阵、召回率、F1-score,不要只看准确率。

5.2 踩坑一:过采样比例设多少合适

很多人一上来就把少数类过采样到和多数类1:1。这在某些场景下有效,但在PHM里不一定最优。我的经验是:过采样比例控制在1:2到1:5之间(少数类:多数类)往往比1:1更好。原因是,过度过采样会让合成样本在少数类区域过度密集,模型可能过拟合这些合成样本,反而降低了对真实少数类样本的泛化能力。

具体设多少,建议用验证集做网格搜索。我一般会试1:1、1:2、1:3、1:5几档,看验证集上的F1-score。

5.3 踩坑二:合成样本的物理合理性校验

SMOTE生成的合成样本,虽然是在特征空间里插值,但插值结果不一定物理合理。比如峭度这个特征,正常范围可能是2到5,故障时可能到8到15。如果两个故障样本的峭度分别是8和12,插值出10是合理的;但如果插值出20,就超出了物理可能范围。

我的做法是:对每个特征设定一个合理的物理范围(基于领域知识),生成合成样本后检查是否有特征值越界。越界的样本直接丢弃。这一步能显著提升合成样本的质量。

5.4 踩坑三:不同工况下的特征分布漂移

重大装备的运行工况经常变化(变转速、变负载),不同工况下的特征分布可能差异很大。如果直接把所有工况的数据混在一起做SMOTE,合成样本可能跨越工况边界,物理意义存疑。

我的处理方式是:按工况分层做SMOTE。每个工况下单独做特征归一化和过采样,然后再合并。这样合成样本在工况内部是合理的。如果某些工况下故障样本极少(比如只有几条),可以考虑用迁移学习的方法,从数据充足的工况迁移特征表示,而不是硬做SMOTE。

5.5 踩坑四:评估指标的陷阱

用不平衡数据训练模型,评估时最容易踩的坑就是只看准确率。我坚持看的指标是:

  • 召回率(Recall):对每个故障类别单独看,确保没有漏报。
  • F1-score:精确率和召回率的调和平均,综合反映分类质量。
  • 混淆矩阵:直观看到哪些类别之间容易混淆。
  • G-mean:各类召回率的几何平均,对不平衡数据敏感。

如果项目允许,我还会画ROC曲线和PR曲线。PR曲线在不平衡数据下比ROC曲线更能反映真实性能。

评估指标适用场景注意事项
准确率类别均衡不平衡数据下会虚高
召回率故障诊断关注漏报,每个类别单独看
F1-score综合评估精确率与召回率的平衡
G-mean不平衡数据各类召回率的几何平均
PR曲线不平衡数据比ROC曲线更敏感

6. 几个提升效果的经验性技巧

6.1 特征聚类后再做SMOTE

如果少数类样本在特征空间里分布成多个簇,直接做SMOTE可能在簇间插值。我的做法是先用K-means或DBSCAN对少数类样本聚类,然后在每个簇内部单独做SMOTE。这样生成的合成样本不会跨越簇边界,物理合理性更好。

聚类的数量可以用轮廓系数或肘部法确定。如果某个簇的样本数太少(比如少于5个),可以考虑把这个簇的样本合并到最近的簇,或者直接对这个簇做更保守的过采样。

6.2 用生成模型替代SMOTE的时机

SMOTE本质上是线性插值,它生成的样本落在少数类样本的凸包内。如果少数类的真实分布是非凸的、多模态的,SMOTE的表达能力就不够了。这时候可以考虑用VAE(变分自编码器)或GAN(生成对抗网络)来生成合成样本。

但我要泼一盆冷水:生成模型在PHM里的落地难度远高于SMOTE。训练不稳定、模式坍塌、生成样本质量难以评估,这些都是实际问题。我的建议是,先把SMOTE及其变体用透,确实遇到瓶颈了再考虑生成模型。而且即使用生成模型,也建议在特征空间做,而不是原始信号空间。

6.3 在线学习与增量过采样

实际部署时,设备的运行数据是持续产生的。如果模型需要定期更新,过采样策略也要跟着调整。我的做法是维护一个特征样本池,新数据进来后先做特征提取和归一化,然后定期(比如每周)重新做一次SMOTE和模型训练。注意归一化的参数要随着数据分布的变化做平滑更新,不能直接用新数据的统计量覆盖,否则会造成分布突变。

6.4 可解释性不能丢

工业场景里,工程师不会信任一个黑箱模型。即使用了SMOTE和注意力机制,也要想办法输出可解释的结果。我的做法是:用SHAP值分析每个特征对分类结果的贡献,结合注意力权重可视化,告诉工程师"模型认为这个样本是内圈故障,主要是因为峭度和某阶次边带幅值异常"。这种解释能极大提升工程师对模型的信任度。

7. 工程落地中的现实约束

7.1 计算资源与实时性

Feature-level SMOTE的计算开销主要在近邻搜索。如果特征维度是20,少数类样本是500,K取5,那计算量完全可以接受。但如果少数类样本上万,或者特征维度上百,就需要用KD-Tree或Ball-Tree加速近邻搜索。sklearn的KNeighborsClassifier默认会自动选择合适的数据结构。

实时诊断场景下,SMOTE只在训练阶段用,推理阶段不涉及,所以不影响实时性。但如果是在线增量学习,每次更新都要重新做SMOTE,就要考虑计算预算了。

7.2 数据隐私与跨设备迁移

不同设备、不同现场的数据往往不能共享(涉及商业机密或隐私)。这就导致一个问题:在A设备上训练的SMOTE+分类器,直接迁移到B设备上效果可能很差。我的做法是:把特征提取和归一化做成标准化模块,SMOTE和分类器在目标设备的小样本上做微调。如果目标设备连故障样本都没有,那就只能做异常检测(无监督),而不是故障分类(有监督)。

7.3 与现有PHM系统的集成

实际项目中,算法很少是孤立运行的。Feature-level SMOTE模块通常作为数据预处理的一环,嵌入到现有的PHM流水线里。我的建议是把它封装成一个独立的服务或函数库,输入是特征矩阵和标签,输出是过采样后的特征矩阵和标签,接口清晰,方便和上下游模块对接。

8. 一些数字和参数的经验值

最后分享一些我在项目中积累的经验参数,供参考。这些不是金科玉律,但可以作为起点。

  • SMOTE的K值:一般取5。如果少数类样本很少(少于20个),K取3甚至1。
  • 过采样比例:少数类:多数类控制在1:2到1:5。
  • 特征维度:筛选后控制在15到25维。
  • 小波包分解层数:3到4层,小波基选db4或sym8。
  • 滑动窗口重叠率:50%。
  • 归一化方式:Z-score,参数只用训练集计算。
  • 评估重点:召回率和F1-score,不看准确率。

我在一个风电齿轮箱项目里,原始数据正常样本12000条,故障样本总共不到400条(四种故障模式)。用标准SMOTE在原始信号上做,测试集F1只有0.62;换成Feature-level SMOTE + Borderline-SMOTE,F1提升到0.84;再加上DSMHSA注意力网络和类别权重,F1到了0.89。这个提升幅度在工程上是有实际意义的——意味着漏报率从接近40%降到了10%出头。

当然,每个项目的数据特性不同,这些数字不能照搬。但Feature-level SMOTE这个思路,在重大装备PHM的故障诊断里,确实是一个投入产出比很高的方案。特征工程做扎实,SMOTE变体选对,再配合合适的分类器和评估体系,小样本故障诊断这个老大难问题,是能啃下来的。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询