4. 特征工程入门:时域特征提取、频域特征提取、特征选择方法
各位同学,欢迎来到特征工程这一章。
说实话,在风电故障预测这个领域,我踩过最大的坑就是——模型选得再好,数据喂得不对,全白搭。你想想看,原始振动信号里藏着大量噪声和冗余信息,直接扔给模型,它根本学不到东西。特征工程,说白了就是把原始信号里的“金子”筛出来。
4.1 时域特征提取:从波形里找规律
时域特征,就是直接从时间序列信号里算出来的统计量。我习惯把它们分成两类:有量纲的和无量纲的。
有量纲特征,比如均值、峰值、均方根值。这些值跟信号的幅值大小直接相关,能反映设备的负载变化。举个例子,风机叶片转速变了,振动幅值肯定跟着变。
无量纲特征,比如峭度、波形因子、脉冲因子。这些值对工况变化不敏感,但对故障特别敏感。我记得有一次,一个齿轮箱的早期裂纹,均方根值几乎没变化,但峭度值直接翻了一倍。嗯,这就是无量纲特征的厉害之处。
下面是我常用的时域特征列表,你可以直接拿去用:
| 特征名称 | 计算公式 | 物理意义 |
|---|---|---|
| 均值 | μ = (1/N) Σx_i | 信号直流分量 |
| 均方根值 | RMS = sqrt((1/N) Σx_i²) | 信号能量大小 |
| 峭度 | K = (1/N) Σ((x_i-μ)/σ)⁴ | 信号冲击特性 |
| 峰值因子 | C = X_peak / RMS | 信号尖峰程度 |
| 波形因子 | S = RMS / |μ| | 波形形状特征 |
4.2 频域特征提取:听出故障的“声音”
时域特征只能告诉你“振动有多大”,但频域特征能告诉你“振动来自哪里”。为什么会这样?因为每个机械部件都有自己固有的旋转频率和啮合频率。
我最常用的频域分析工具就是FFT(快速傅里叶变换)。把时域信号变换到频域后,你会看到一个个频率峰值。这些峰值对应的频率,就是故障的“身份证”。
举个例子,风机主轴承的保持架故障,会在某个特定频率上出现边频带。我曾经在项目里遇到过,一个轴承的保持架断裂前两周,频谱图上就出现了微弱的边频。当时我盯着那个边频看了半天,最后还是决定停机检修,结果拆下来一看,保持架已经裂了三分之一。
频域特征提取的常用步骤:
- 对原始信号加窗(汉宁窗、海明窗),减少频谱泄露
- 做FFT变换,得到频谱
- 提取关键频段的幅值、能量、重心频率等
- 计算边频带能量比、谐波能量比等高级特征
下面是一段Python代码,展示如何提取频域特征:
import numpy as np
from scipy.fft import fft
def extract_freq_features(signal, fs):
n = len(signal)
freqs = np.fft.fftfreq(n, 1/fs)
spectrum = np.abs(fft(signal))[:n//2]
freqs = freqs[:n//2]
# 提取特征
features = {}
features['重心频率'] = np.sum(freqs * spectrum) / np.sum(spectrum)
features['均方频率'] = np.sum(freqs**2 * spectrum) / np.sum(spectrum)
features['频率方差'] = np.sum((freqs - features['重心频率'])**2 * spectrum) / np.sum(spectrum)
# 提取特定频段能量
idx_1x = np.where((freqs >= 48) & (freqs <= 52))[0]
features['1倍频能量'] = np.sum(spectrum[idx_1x])
return features
4.3 特征选择方法:去粗取精
特征提取完了,你可能得到几十甚至上百个特征。但别急着全扔进模型。你想想看,特征太多,模型容易过拟合,训练时间也长。特征选择,就是帮你挑出最有用的那部分。
我常用的特征选择方法有三种:
- 过滤法:先算每个特征和目标变量的相关性,挑出相关性高的。速度快,但忽略了特征之间的交互作用。
- 包裹法:用模型来评估特征子集的好坏。比如递归特征消除(RFE),每次去掉最不重要的特征。效果好,但计算量大。
- 嵌入法:在模型训练过程中自动选择特征。比如Lasso回归、决策树特征重要性。兼顾速度和效果,我个人最常用。
下面这张图,是我自己总结的特征工程整体流程:
核心原则: 特征选择不是越多越好,而是越精越好。我一般会先做过滤法快速筛选,再用嵌入法精挑细选,最后用包裹法验证一下。三步走,基本不会漏掉重要特征。
最后说一句,特征工程没有标准答案。不同风机、不同故障类型,需要的特征都不一样。我的建议是:多试、多对比、多总结。慢慢你就会形成自己的“特征直觉”。