4、特征工程:时域特征提取、频域特征提取与特征选择方法

大家好,我是你们的老朋友。今天我们来聊聊特征工程——这个在SOH评估中真正决定模型上限的环节。

说实话,我见过太多团队把精力全花在调模型上,结果效果就是上不去。为什么?因为原始数据里藏着大量噪声和冗余信息。你喂进去的是垃圾,模型吐出来的自然也是垃圾。特征工程,说白了就是帮数据“提纯”的过程。

4.1 时域特征提取:电压、电流、温度的统计量

时域特征,就是直接从时间序列里算出来的统计量。我个人习惯,先把电压、电流、温度这三条曲线画出来,肉眼扫一遍,心里就有数了。

常用的统计量包括:

  • 均值:反映整体水平。比如充电过程中的平均电压,能间接看出电池的内阻变化。
  • 标准差:衡量波动程度。我在项目中遇到过,老化严重的电池,电压波动会明显增大。
  • 最大值/最小值:捕捉极端工况。比如放电末端电压跌得特别快,往往是SOH下降的信号。
  • 峰度与偏度:描述分布形态。偏度能告诉你数据是左偏还是右偏,对异常检测很有用。
  • 斜率:计算某段时间内的变化趋势。比如恒流充电阶段的电压上升速率,跟电池的极化内阻直接相关。

核心经验:不要一股脑把所有统计量都算出来。我建议先做相关性分析,把那些跟SOH相关系数低于0.3的特征直接扔掉。否则特征维度太高,模型容易过拟合。

举个例子,假设我们有一段恒流充电的电压数据:

import numpy as np
import pandas as pd

# 模拟一段充电电压数据(单位:V)
voltage = np.array([3.50, 3.52, 3.55, 3.58, 3.62, 3.65, 3.68, 3.72, 3.75, 3.78])

# 计算时域特征
features = {
    'mean': np.mean(voltage),
    'std': np.std(voltage),
    'max': np.max(voltage),
    'min': np.min(voltage),
    'range': np.ptp(voltage),
    'slope': (voltage[-1] - voltage[0]) / len(voltage)
}

print(pd.Series(features))

你看,就这么几行代码,就能把一段原始电压信号浓缩成几个关键数字。这些数字背后,其实就藏着电池健康状态的密码。

4.2 频域特征提取:FFT与小波变换

时域特征虽然直观,但有些信息它抓不住。比如电池内部的电化学反应,往往会在特定频率上表现出特征。这时候就需要频域分析登场了。

FFT(快速傅里叶变换)

FFT能把时域信号转换到频域,告诉你信号里包含哪些频率成分。我记得有一次做电池内阻分析,时域上看不出什么异常,但一跑FFT,发现某个频率段的幅值明显偏高——后来排查发现是接触不良导致的。

from scipy.fft import fft

# 对电压信号做FFT
N = len(voltage)
freq_domain = fft(voltage)
amplitudes = np.abs(freq_domain[:N//2])  # 取幅值

# 提取频域特征:主频、幅值均值等
main_freq = np.argmax(amplitudes)  # 主频位置
mean_amplitude = np.mean(amplitudes)

小波变换

FFT有个缺点——它只能告诉你信号里有哪些频率,但不知道这些频率出现在什么时间。小波变换就解决了这个问题。它既能看频率,又能看时间,特别适合处理电池这种非平稳信号。

我曾经用db4小波对电池放电电压做分解,提取了高频细节系数。你猜怎么着?这些细节系数的能量值,跟电池的SOH居然有0.85以上的相关性。比直接用原始电压强太多了。

我的建议:如果数据量不大(比如只有几百个样本),优先用FFT,简单高效。如果数据量大且信号非平稳(比如实际跑车数据),小波变换是更好的选择。别问我怎么知道的——都是踩坑踩出来的。

4.3 特征选择方法:过滤式、包裹式、嵌入式

特征造了一大堆,接下来就是做减法。特征选择的目的,是去掉冗余和无关的特征,让模型更轻、更快、更准。

过滤式(Filter)

这种方法不依赖任何模型,纯粹靠统计指标来筛选特征。常用的有皮尔逊相关系数、卡方检验、互信息等。

  • 优点:速度快,适合高维数据。
  • 缺点:不考虑特征之间的交互作用。

我个人习惯先用过滤式做一轮粗筛,把明显没用的特征干掉。比如相关系数低于0.1的,直接扔掉,不心疼。

包裹式(Wrapper)

这种方法把特征选择当成一个搜索问题,用模型的性能来评价特征子集的好坏。典型的算法有递归特征消除(RFE)、前向选择、后向消除。

  • 优点:考虑了特征之间的组合效果,效果通常更好。
  • 缺点:计算量大,容易过拟合。

我在一个项目中用过RFE,每次迭代都训练一次模型,跑了整整一个晚上。但效果确实好,最终只保留了8个特征,模型精度反而提升了3%。

嵌入式(Embedded)

这种方法把特征选择嵌入到模型训练过程中。最典型的就是Lasso回归(L1正则化)和树模型的特征重要性。

  • 优点:效率高,效果好。
  • 缺点:依赖模型本身。

我现在做SOH评估,最常用的就是嵌入式方法。LightGBM训练完,直接看feature_importance,把重要性低于某个阈值的特征砍掉。简单粗暴,但真的管用。

避坑指南:我曾经犯过一个错误——用过滤式选完特征后,直接拿去训练模型,结果效果很差。后来才发现,过滤式选出来的特征虽然各自跟SOH相关,但它们之间高度共线。所以我现在都是过滤式+嵌入式结合使用,先粗筛再精筛。

4.4 本章知识体系总览

下面这张图,是我自己总结的特征工程全流程。你可以把它当成一个检查清单,做项目时对着走一遍,基本不会漏掉关键步骤。

特征工程全流程框架 原始数据 电压 / 电流 / 温度 时域特征 均值 / 标准差 / 斜率 峰度 / 偏度 / 极值 频域特征 FFT / 小波变换 幅值 / 能量 / 主频 时频域特征 小波包分解 Hilbert-Huang变换 特征选择 过滤式 包裹式 嵌入式 最优特征子集 → 模型训练

嗯,这张图基本把特征工程的脉络理清了。从原始数据出发,先做时域和频域的特征提取,然后通过三种特征选择方法筛选出最优子集,最后喂给模型。每一步都有讲究,每一步也都有坑。

好了,这一章的内容就到这里。特征工程是个细活,急不得。你多花点时间在特征上,模型会回报你的。


专注资料整理