4、特征工程:时域特征、频域特征与降维

各位同学,咱们今天聊聊特征工程。说实话,在噪声预测这个领域,模型选得再好,特征没整明白,那基本就是白搭。我见过太多人一上来就堆深度学习,结果效果还不如一个简单的线性回归——为什么?因为特征没抓到点子上。

我个人习惯把特征工程分成三步走:时域特征频域特征,最后是特征选择与降维。咱们一个一个来。

4.1 时域特征:最直观的信号描述

时域特征,说白了就是直接看波形本身。你想想看,噪声信号随时间怎么跳动的?振幅大不大?波动剧烈不剧烈?这些都能用数学指标量化。

4.1.1 均值与方差

均值反映的是信号的直流分量,也就是背景噪声的基准水平。比如一个安静的图书馆,均值可能只有30dB;而一个繁忙的十字路口,均值可能到70dB。

方差则描述信号的波动程度。我在项目中遇到过一个问题:两个工厂的噪声均值差不多,但一个方差很大,另一个很小。后来发现,方差大的那个是间歇性冲击噪声(比如冲压机),方差小的则是持续性的风机噪声。你看,方差这个特征直接帮我们区分了噪声类型。

计算公式:

均值: μ = (1/N) * Σ x_i
方差: σ² = (1/N) * Σ (x_i - μ)²

4.1.2 峰值与峰值因子

峰值就是信号的最大绝对值。在噪声监测中,峰值往往对应着突发性事件——比如一声鸣笛、一次撞击。我建议把峰值和均值结合起来看,能判断噪声的冲击性。

峰值因子(Crest Factor)= 峰值 / 有效值。这个指标很有意思。如果峰值因子很大,说明信号里有明显的尖峰脉冲。我曾经用这个特征成功识别出了建筑工地的打桩噪声——它的峰值因子比交通噪声高出一大截。

我的经验:时域特征计算简单、速度快,适合做实时监测的初筛。但光靠时域特征是不够的,因为很多噪声在时域上看起来差不多,到了频域才显出差别。

4.2 频域特征:看穿噪声的“频谱指纹”

为什么要做频域分析?你想想看,一个50Hz的工频噪声和一个1000Hz的机械噪声,在时域上可能都是正弦波,但它们的频率成分完全不同。频域分析就是帮我们把信号“拆开”来看。

4.2.1 FFT与频谱

快速傅里叶变换(FFT)是频域分析的核心工具。它的作用是把时域信号转换到频域,让我们看到每个频率成分的幅值。

import numpy as np

def compute_fft(signal, sample_rate):
    n = len(signal)
    freqs = np.fft.fftfreq(n, 1/sample_rate)
    spectrum = np.fft.fft(signal)
    magnitude = np.abs(spectrum) / n  # 归一化幅值
    return freqs[:n//2], magnitude[:n//2]  # 只取正频率部分

嗯,这里要注意:FFT的结果是对称的,我们通常只取前一半(正频率部分)。另外,采样率的选择很关键——根据奈奎斯特定理,采样率至少要是最高频率的两倍。

4.2.2 频谱能量与频带划分

有了频谱之后,我们可以计算频谱能量。说白了就是把某个频段内的幅值平方求和。这个特征在环境噪声中特别有用,因为不同噪声源的能量分布在不同频段:

噪声类型 主要频段 频谱能量特征
交通噪声 低频(20-200Hz) 低频能量占比高
空调外机 中低频(50-500Hz) 有固定频率峰值
施工噪声 宽频(20-8000Hz) 各频段能量较分散
人声/广播 中频(300-3000Hz) 中频能量突出

我在做城市噪声地图项目时,就把频谱分成了8个频带,每个频带提取能量值作为特征。结果模型准确率从72%直接跳到了89%。你看,频域特征就是这么管用。

避坑指南:我曾经犯过一个错误——把所有频段的能量直接堆在一起当特征。结果模型过拟合得一塌糊涂。后来才意识到,相邻频段的能量是高度相关的,需要做特征选择或降维。

4.3 特征选择与降维:给特征“瘦身”

特征不是越多越好。你想想看,如果提取了50个特征,其中30个都是冗余的,模型不仅训练慢,还容易过拟合。我个人的原则是:能用10个特征解决的问题,绝不用20个

4.3.1 特征选择方法

特征选择,就是挑出最有用的特征。常用的方法有三种:

  • 过滤法:计算每个特征与目标变量的相关性,保留相关性高的。比如用皮尔逊相关系数,阈值一般取0.3以上。
  • 包裹法:用模型来评估特征组合的效果。比如递归特征消除(RFE),每次去掉最不重要的特征。
  • 嵌入法:在模型训练过程中自动选择特征。比如Lasso回归,它会自动把不重要特征的系数压到0。

我建议初学者先用过滤法快速筛选,再用包裹法精调。这样效率最高。

4.3.2 PCA降维

主成分分析(PCA)是降维的经典方法。它的核心思想是:把原始特征投影到新的坐标轴上,新坐标轴的方向是数据方差最大的方向。

说白了,PCA就是在找数据“最分散”的方向。第一个主成分捕获最大的方差,第二个主成分捕获次大的方差,以此类推。我们通常保留累积方差贡献率达到85%-95%的前几个主成分。

from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler

# 标准化(PCA前必须做)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

# PCA降维
pca = PCA(n_components=0.95)  # 保留95%的方差
X_pca = pca.fit_transform(X_scaled)

print(f"原始特征数: {X.shape[1]}")
print(f"降维后特征数: {X_pca.shape[1]}")
print(f"各主成分方差占比: {pca.explained_variance_ratio_}")

我的经验:PCA降维后,特征的可解释性会下降——你很难说清楚第3个主成分到底代表什么物理意义。所以如果项目要求可解释性(比如环保部门需要知道是哪个频段的噪声超标),我建议优先用特征选择,而不是PCA。

4.4 本章知识体系

下面这张图总结了特征工程的完整流程。你可以看到,从原始信号出发,经过时域和频域特征提取,再到特征选择与降维,最终得到高质量的特征集。

特征工程知识体系 原始噪声信号 时域特征提取 频域特征提取 • 均值(背景噪声水平) • 方差(波动程度) • 峰值/峰值因子(冲击性) • FFT频谱分析 • 频谱能量(频带划分) • 频率峰值定位 特征选择与降维 过滤法 | 包裹法 | 嵌入法 | PCA降维

最后说一句:特征工程没有标准答案。不同的噪声场景、不同的预测目标,需要的特征组合都不一样。我的建议是——先做加法(尽可能多地提取候选特征),再做减法(用特征选择和降维去掉冗余)。这个思路我在十几个项目里验证过,效果都还不错。

本章小结:时域特征抓宏观趋势,频域特征看微观结构,特征选择与降维保模型健壮。三者缺一不可。

专注资料整理