4. 特征工程与指标构建:时域特征提取、频域特征提取、健康指标构建
各位好,我是老张。今天咱们聊聊特征工程。说实话,很多刚入行的同事觉得这步就是算几个数,没什么技术含量。但我得说,这恰恰是区分“会看数据”和“会诊断故障”的分水岭。
你想想看,SCADA系统里存了几百个参数,温度、振动、转速、功率……全是原始数据。但原始数据不会告诉你“这台机组要坏了”。我们需要从这些数据里“提炼”出能反映健康状态的特征。这就是特征工程要干的事。
核心观点:特征工程不是简单的数学计算,而是将物理机理与数据规律相结合的过程。好的特征,能让故障在早期就“现出原形”。
4.1 时域特征提取:最直观的“体检指标”
时域特征,说白了就是直接对时间序列信号做统计。我习惯把这比作给人做体检——量体温、测血压、数心跳,都是最基础的指标,但能反映很多问题。
4.1.1 均值与方差:稳定性的“晴雨表”
均值反映信号的直流分量或稳态水平。比如发电机轴承温度,正常工况下均值应该在某个范围内波动。如果均值持续漂移,说明可能有异常。
方差反映信号的波动程度。我在项目中遇到过一台机组,振动幅值均值正常,但方差明显偏大。拆开一看,轴承保持架已经出现裂纹了。嗯,这就是方差的价值——它能捕捉到“看似正常但实际不稳定”的状态。
import numpy as np
# 假设 vibration 是某测点10秒内的振动加速度信号 (采样率 2560 Hz)
vibration = np.random.randn(25600) * 0.5 + 2.0 # 模拟数据
mean_val = np.mean(vibration)
var_val = np.var(vibration)
print(f"均值: {mean_val:.3f} m/s²")
print(f"方差: {var_val:.3f} (m/s²)²")
4.1.2 峰值与峰峰值:冲击信号的“探测器”
峰值是信号的最大绝对值。对于齿轮箱这种设备,齿面点蚀或断齿会产生周期性冲击,峰值会明显增大。
峰峰值(最大值-最小值)常用于评估振动烈度。ISO 10816标准里,就是用振动速度的均方根值和峰峰值来划分设备状态的。
我的经验:单独看峰值容易误判。有一次台风天,峰值很大,但其实是风速波动导致的正常现象。我后来习惯把峰值和均值结合起来看——如果峰值/均值比值超过3,才重点关注。
4.2 频域特征提取:从“看波形”到“看频谱”
时域信号就像心电图,能看出心跳快慢,但看不出心脏内部结构。频域分析就像给设备做“B超”——把信号分解到不同频率上,看看哪个频率成分出了问题。
4.2.1 FFT:最基础的“频率分解器”
快速傅里叶变换(FFT)能把时域信号转换到频域。每个频率分量对应一个机械部件——比如齿轮啮合频率、轴承特征频率、叶片通过频率。
我记得刚入行时,师傅跟我说:“FFT谱就像设备的指纹,每个部件都有自己独特的频率印记。” 后来做故障诊断,我确实靠FFT找到了不少问题——比如某风场齿轮箱高速轴齿轮磨损,就是在啮合频率的边频带上发现的。
from scipy.fft import fft, fftfreq
fs = 2560 # 采样率
n = len(vibration)
freqs = fftfreq(n, 1/fs)[:n//2]
spectrum = np.abs(fft(vibration))[:n//2]
# 找到前5个最大幅值的频率
top_idx = np.argsort(spectrum)[-5:][::-1]
print("主要频率成分 (Hz):", freqs[top_idx])
4.2.2 包络谱:捕捉“微弱冲击”的利器
FFT对平稳信号效果好,但对早期故障产生的微弱冲击信号,往往淹没在噪声里。这时候就需要包络谱了。
包络谱的原理很简单:先对信号做希尔伯特变换,提取信号的包络(即瞬时幅值),再对包络做FFT。这样就能把冲击信号从高频载波中“解调”出来。
避坑指南:我曾经在分析某台机组时,FFT谱上什么都看不出来,但包络谱上明显出现了轴承外圈故障频率。拆开一看,外圈已经有一条细裂纹了。所以,对于滚动轴承这类部件,我建议优先看包络谱。
4.3 健康指标构建:从“特征”到“指标”
提取了时域和频域特征后,下一步是构建能直接反映设备健康状态的指标。我个人认为,好的健康指标应该满足三个条件:物理意义明确、对故障敏感、对工况变化不敏感。
4.3.1 温度残差:排除工况干扰的“温度偏差”
温度受功率、转速、环境温度影响很大。直接看温度绝对值,夏天和冬天差别很大,容易误判。
我的做法是:先建立温度与功率、转速、环境温度的回归模型(比如多元线性回归或神经网络),然后用实际温度减去模型预测值,得到温度残差。
残差如果持续为正且超过阈值,说明存在异常发热——可能是轴承磨损、润滑不良或冷却系统故障。
# 假设已训练好回归模型 model
pred_temp = model.predict([[power, rpm, ambient_temp]])
residual = actual_temp - pred_temp
if residual > 5.0: # 残差超过5°C
print("警告:温度残差异常,建议检查轴承或润滑系统")
4.3.2 振动烈度:国际通用的“振动评级”
振动烈度通常指振动速度的均方根值(RMS),单位mm/s。ISO 10816-21标准给出了不同功率等级机组的振动限值。
| 机组功率 | 良好 (mm/s) | 合格 (mm/s) | 需关注 (mm/s) | 不允许 (mm/s) |
|---|---|---|---|---|
| ≤ 300 kW | ≤ 1.8 | ≤ 4.5 | ≤ 11.2 | > 11.2 |
| 300 kW ~ 3 MW | ≤ 2.8 | ≤ 7.1 | ≤ 18.0 | > 18.0 |
| > 3 MW | ≤ 3.5 | ≤ 9.0 | ≤ 22.0 | > 22.0 |
注意:振动烈度是“宽频”指标,对大多数故障都有响应,但特异性不强。我通常把它作为第一道“筛子”——如果振动烈度超标,再结合频谱分析定位具体故障。
4.4 本章知识体系:一张图看懂
下面这张图总结了本章的核心逻辑。从原始数据出发,经过时域和频域特征提取,最终构建出温度残差和振动烈度两个健康指标。你想想看,是不是每一步都有明确的物理意义和工程价值?
小结:特征工程不是一蹴而就的。我建议你从最简单的时域特征开始,逐步加入频域分析,最后构建出有物理意义的健康指标。记住一句话:好的特征,能让故障在早期就“现出原形”;坏的特征,只会让你在数据海洋里迷失方向。
公众号:蓝海资料掘金营,微信deep3321