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 本章知识体系:一张图看懂

下面这张图总结了本章的核心逻辑。从原始数据出发,经过时域和频域特征提取,最终构建出温度残差和振动烈度两个健康指标。你想想看,是不是每一步都有明确的物理意义和工程价值?

特征工程与健康指标构建流程 原始SCADA数据 时域特征提取 • 均值:稳态水平 • 方差:波动程度 • 峰值:冲击强度 频域特征提取 • FFT:频率分解 • 包络谱:冲击解调 • 边频带分析 健康指标构建 • 温度残差:排除工况干扰 • 振动烈度:国际标准评级

小结:特征工程不是一蹴而就的。我建议你从最简单的时域特征开始,逐步加入频域分析,最后构建出有物理意义的健康指标。记住一句话:好的特征,能让故障在早期就“现出原形”;坏的特征,只会让你在数据海洋里迷失方向。


公众号:蓝海资料掘金营,微信deep3321