特征工程:从原始数据到高价值特征

各位同学,欢迎来到第四讲。前面我们聊了数据怎么来、怎么清洗,但说实话,原始数据就像一堆没加工的矿石——你得提炼才有价值。特征工程,就是干这个的。

我个人习惯把特征分成四大类:时域的、频域的、统计的,还有基于物理模型的。这四类特征组合起来,基本能覆盖风机载荷预测的绝大部分场景。咱们一个一个来看。

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 本章知识体系

下面这张图总结了本章的核心逻辑。你可以看到,四类特征从不同角度描述了载荷信号,最终汇聚到载荷预测模型中。

特征工程知识体系 原始载荷信号 时域特征 均值、方差 峰值因子 频域特征 FFT频谱 功率谱密度 统计特征 偏度、峭度 物理特征 叶尖速比 推力系数 特征组合与选择 载荷预测模型

嗯,以上就是特征工程的核心内容。四类特征各有各的用处,关键是根据你的具体问题来选。别贪多,也别太少——找到那个"甜点"区域,模型效果自然就上去了。


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