3、多维特征工程:时域特征提取与频域特征提取
各位工程师朋友,咱们接着聊。上一章我们把数据清洗干净了,但原始数据就像一堆散落的零件,你得把它组装成有用的工具。这一章,我就讲讲怎么从储能设备的时序数据里,挖出真正有价值的特征。
说白了,特征工程就是「把原始数据变成模型能听懂的语言」。我个人习惯把特征分成三大类:时域的、频域的、统计的。咱们一个一个来。
3.1 时域特征提取:最直观的「肉眼可见」
时域特征,就是直接看信号随时间怎么变。我最早做储能项目时,就靠这几个特征判断电池状态,简单但有效。
3.1.1 均值(Mean)
均值反映信号的「直流分量」。比如电池电压的均值,能告诉你整体电压水平。计算公式很简单:
mean = (1/N) * Σ x_i
我在项目中遇到过一个问题:某储能柜的电压均值总是偏低,排查后发现是某个模组内阻异常增大。你看,一个均值就能暴露问题。
3.1.2 方差(Variance)
方差衡量数据的波动程度。电池电压方差突然变大,往往意味着内部短路或接触不良。公式:
var = (1/N) * Σ (x_i - mean)²
3.1.3 峰峰值(Peak-to-Peak)
峰峰值 = 最大值 - 最小值。这个特征在分析充放电切换瞬间特别有用。比如电池从充电切到放电时,电压峰峰值如果超过50mV,说明内阻可能偏大。
我习惯把这三个特征组合使用:均值看趋势,方差看稳定性,峰峰值看极端情况。三者结合,基本能覆盖90%的时域分析需求。
3.2 频域特征提取:藏在「频率」里的秘密
时域看不出来的东西,频域往往一目了然。你想想看,电池的某些故障特征,比如电化学阻抗谱中的特定频率响应,在时域里根本看不出来。
3.2.1 快速傅里叶变换(FFT)
FFT能把时域信号转换到频域。我常用的Python代码:
import numpy as np
def extract_fft_features(signal, fs):
n = len(signal)
fft_vals = np.fft.fft(signal)
fft_freq = np.fft.fftfreq(n, 1/fs)
# 只取正频率部分
pos_mask = fft_freq >= 0
fft_vals = fft_vals[pos_mask]
fft_freq = fft_freq[pos_mask]
# 提取幅值
amplitude = np.abs(fft_vals) / n
return fft_freq, amplitude
嗯,这里要注意:FFT结果是对称的,我们只取正频率部分就够了。我刚开始做时没注意这个,结果特征维度翻了一倍,模型训练慢得要命。
3.2.2 功率谱密度(PSD)
PSD比FFT更进一步,它告诉你不同频率成分的「能量」分布。对于储能设备,PSD能有效识别出特定频率的噪声源。
举个例子:某储能站频繁报出电压异常,时域波形看不出问题。我用PSD一分析,发现50Hz工频分量异常高——原来是接地不良导致的工频干扰。
from scipy import signal
def compute_psd(signal, fs):
freqs, psd = signal.welch(signal, fs, nperseg=1024)
return freqs, psd
3.3 统计特征构建:用数学语言描述数据
统计特征,说白了就是用数学指标描述数据的「形状」。我常用的统计特征有这些:
| 特征名称 | 计算公式 | 物理意义 | 应用场景 |
|---|---|---|---|
| 偏度(Skewness) | E[(x-μ)³]/σ³ | 数据分布的不对称性 | 判断电池是否过充/过放 |
| 峰度(Kurtosis) | E[(x-μ)⁴]/σ⁴ - 3 | 数据分布的尖峭程度 | 检测异常脉冲信号 |
| 均方根(RMS) | √(mean(x²)) | 信号的有效值 | 评估电流/电压的发热效应 |
| 波形因子 | RMS / |mean| | 信号波形的形状特征 | 区分不同类型负载 |
我曾经用偏度特征成功预测过一次电池热失控。当时电池电压的偏度值从-0.2突然跳到0.8,我立刻判断出电池内部发生了不可逆的化学变化。嗯,这个经验让我后来在所有项目中都把偏度作为必选特征。
3.4 知识体系总览
为了让你更直观地理解这三类特征的关系,我画了一张图:
这张图把三类特征的关系说清楚了。时域特征最直观,频域特征能发现隐藏问题,统计特征则提供数学层面的描述。三者缺一不可。
好了,这一章的内容就到这里。特征提取是数据分析的「手艺活」,多练、多总结,你也能成为高手。
公众号:蓝海资料掘金营,微信deep3321