特征工程:从原始数据到高价值特征
各位同学,欢迎来到第四讲。前面我们聊了数据怎么来、怎么清洗,但说实话,原始数据就像一堆没加工的矿石——你得提炼才有价值。特征工程,就是干这个的。
我个人习惯把特征分成四大类:时域的、频域的、统计的,还有基于物理模型的。这四类特征组合起来,基本能覆盖风机载荷预测的绝大部分场景。咱们一个一个来看。
4.1 时域特征:最直观的信号描述
时域特征,说白了就是看信号随时间怎么变。你想想看,风机叶片上的载荷信号,本质上就是个时间序列。我们最常用的三个指标:均值、方差、峰值因子。
均值(Mean)
均值反映的是信号的直流分量。在风机载荷里,均值通常对应着稳态风载。比如叶片挥舞弯矩的均值,基本就代表了当前风速下的平均受力。
计算公式:
μ = (1/N) * Σ x_i
其中 x_i 是采样点,N 是窗口长度。
我在项目中遇到过一个问题:有个风场的载荷报警老是误报。查了半天,发现是均值窗口设得太短了,把阵风波动也算进去了。后来把窗口从1秒拉到10秒,误报率直接降了80%。
方差(Variance)
方差衡量的是信号围绕均值的波动程度。载荷波动越大,方差越大。这对疲劳载荷评估特别重要——波动大的信号,更容易让材料产生疲劳裂纹。
小技巧: 我建议用标准差(方差的平方根)代替方差做特征,因为量纲和原始信号一致,更容易解释。
峰值因子(Crest Factor)
峰值因子 = 峰值 / 有效值。这个指标专门用来捕捉冲击性载荷。比如叶片遇到极端阵风时,峰值因子会突然飙升。
# Python 计算峰值因子
import numpy as np
def crest_factor(signal):
peak = np.max(np.abs(signal))
rms = np.sqrt(np.mean(signal**2))
return peak / rms
注意: 峰值因子对异常值非常敏感。如果传感器有毛刺噪声,记得先做滤波。我曾经吃过这个亏,一个坏掉的传感器让整个模型的预测偏差大了30%。
4.2 频域特征:藏在频率里的秘密
时域特征只能看到信号的整体统计量,但有些信息是藏在频率里的。比如叶片通过频率(1P、3P)、塔筒共振频率,这些在时域里根本看不出来。
FFT频谱
快速傅里叶变换(FFT)能把时域信号转换到频域。每个频率点上的幅值,就代表了该频率成分的能量大小。
# FFT 频谱计算
from scipy.fft import fft, fftfreq
def get_spectrum(signal, fs):
n = len(signal)
fft_vals = fft(signal)
freqs = fftfreq(n, 1/fs)
# 只取正频率部分
positive_freqs = freqs[:n//2]
magnitude = np.abs(fft_vals[:n//2]) * 2 / n
return positive_freqs, magnitude
我记得有个项目,风机在8m/s风速时塔筒振动异常。时域信号看着就是正常的正弦波,但一做FFT,发现0.5Hz附近有个明显的尖峰——那是塔筒的固有频率被激发了。后来调整了控制策略,问题就解决了。
功率谱密度(PSD)
PSD 比 FFT 更进一步,它描述的是信号功率在频率上的分布。对于随机载荷(比如湍流风引起的载荷),PSD 比 FFT 更稳定、更有物理意义。
常用方法: Welch 法。把信号分段、加窗、做FFT、再平均。这样得到的PSD估计方差小,更可靠。
from scipy import signal
freqs, psd = signal.welch(
signal_data,
fs=50, # 采样频率50Hz
nperseg=1024, # 每段1024个点
window='hann' # 汉宁窗
)
4.3 统计特征:高阶矩的魅力
均值和方差只能描述信号的一阶和二阶特性。但载荷信号往往是非高斯的——它有厚尾、有偏斜。这时候就需要高阶统计量了。
偏度(Skewness)
偏度衡量的是信号分布的不对称性。正偏度意味着右尾更长,负偏度则相反。在风机载荷里,偏度能反映极端载荷的方向性。
举个例子:叶片挥舞弯矩的偏度如果是正的,说明向塔筒方向的极端载荷更多。这对塔筒安全评估很有价值。
峭度(Kurtosis)
峭度衡量的是信号分布的"尖峭"程度。正态分布的峭度是3。峭度大于3,说明信号有更多的极端值——也就是"厚尾"分布。
我的经验: 峭度是故障检测的好帮手。轴承早期故障时,振动信号的峭度会明显升高。我在一个齿轮箱故障诊断项目里,就是用峭度作为早期预警指标,提前两周发现了问题。
from scipy.stats import skew, kurtosis
skewness = skew(load_signal)
kurt = kurtosis(load_signal, fisher=True) # Fisher定义,正态分布为0
4.4 基于物理模型的特征:让数据说话,也让物理说话
纯数据驱动的特征有个问题:它不知道物理规律。而风机载荷是受物理定律约束的。把物理模型引入特征工程,往往能事半功倍。
叶尖速比(Tip Speed Ratio, TSR)
叶尖速比 = 叶尖线速度 / 风速。这是风力机最核心的无量纲参数之一。它直接决定了风轮的运行状态——是失速、最优、还是过速。
计算公式:
λ = ω * R / V
其中 ω 是风轮转速(rad/s),R 是风轮半径(m),V 是风速(m/s)。
最优叶尖速比通常在7-9之间。低于这个范围,叶片容易失速;高于这个范围,推力会急剧增加。我建议把TSR作为一个关键特征输入到载荷预测模型里——它比单独用风速或转速要稳定得多。
推力系数(Thrust Coefficient, Ct)
推力系数描述的是风轮从风中提取能量的效率。它和叶尖速比、桨距角都有关系。
# 推力系数近似计算(基于BEM理论简化版)
def thrust_coefficient(tsr, pitch_angle):
# 这是一个经验公式,实际项目中需要查表或BEM计算
ct = 0.5 * (1 + np.cos(2 * (tsr - 8) / 10))
return np.clip(ct, 0, 1)
注意: 推力系数不是常数。不同风速、不同桨距角下,Ct 变化很大。我见过有人直接用固定Ct值做载荷预测,结果模型在低风速段完全失效。一定要把Ct作为动态特征来处理。
4.5 特征组合与选择
好了,现在我们有了一大堆特征。但特征不是越多越好。我个人的经验是:
- 时域特征:适合做稳态工况的载荷评估
- 频域特征:适合做共振分析和疲劳载荷评估
- 统计特征:适合做异常检测和早期故障预警
- 物理特征:适合做跨工况泛化,让模型更鲁棒
实际项目中,我通常先用物理特征(TSR、Ct)做基础,再补充时域和频域特征。统计特征作为辅助,只在需要检测异常时才加入。
一个实用的特征组合:
| 特征类别 | 推荐特征 | 适用场景 |
|---|---|---|
| 时域 | 均值、标准差、峰值因子 | 稳态载荷评估 |
| 频域 | 1P/3P幅值、PSD低频段能量 | 共振分析、疲劳 |
| 统计 | 偏度、峭度 | 异常检测 |
| 物理 | 叶尖速比、推力系数 | 跨工况泛化 |
4.6 本章知识体系
下面这张图总结了本章的核心逻辑。你可以看到,四类特征从不同角度描述了载荷信号,最终汇聚到载荷预测模型中。
嗯,以上就是特征工程的核心内容。四类特征各有各的用处,关键是根据你的具体问题来选。别贪多,也别太少——找到那个"甜点"区域,模型效果自然就上去了。
公众号:蓝海资料掘金营,微信deep3321