时序特征提取是从时间序列数据中挖掘关键信息的过程,旨在捕捉数据中的趋势、周期性、异常等模式,为后续建模(如分类、预测、异常检测)提供有效输入。

1. 时序特征类型与适用场景

根据数据特性和任务需求,特征可分为以下类别:

特征类型 典型方法 适用场景
时域特征 统计量、自相关函数、差分 趋势分析、平稳性检验
频域特征 傅里叶变换、功率谱密度(PSD) 周期性检测(如振动信号分析)
时频域特征 小波变换、短时傅里叶变换(STFT) 非平稳信号(如突发故障冲击)
非线性特征 熵(近似熵、样本熵)、分形维数 复杂系统混沌特性分析
模型驱动特征 ARIMA系数、状态空间模型参数 序列预测、参数化建模
深度学习特征 CNN/LSTM自动提取的隐层特征 高维时序模式挖掘(如语音识别)

2. 核心方法详解

(1) 时域特征提取
  • 基础统计量

    • 均值、方差、偏度、峰度:描述数据分布形态。

    • 极值:最大值、最小值及其出现位置。

    • 过零率(Zero-Crossing Rate):信号穿过零点的频率,反映波动性。

  • 时序依赖性

    • 自相关函数(ACF):衡量序列自身在不同滞后阶数的相关性。

    • 偏自相关函数(PACF):排除中间滞后影响后的相关性。

  • 差分与平滑

    • 一阶/二阶差分:消除趋势,使序列平稳。

    • 滑动平均(MA):窗口内均值平滑噪声。

代码示例(Python)

import numpy as np
from scipy import stats

# 生成示例时序数据
data = np.random.randn(100)

# 计算时域特征
mean = np.mean(data)
std = np.std(data)
skewness = stats.skew(data)
kurtosis = stats.kurtosis(data)
zero_crossings = np.sum(np.diff(np.sign(data)) != 0)

print(f"均值: {mean:.2f}, 标准差: {std:.2f}, 偏度: {skewness:.2f}, 峰度: {kurtosis:.2f}, 过零率: {zero_crossings}")
(2) 频域特征提取
  • 傅里叶变换(FFT)

    • 将时域信号转换为频域,提取主要频率成分。

    • 特征:峰值频率、频谱能量、频带功率比。

  • 功率谱密度(PSD)

    • 分析信号功率随频率的分布,用于噪声与周期性分离。

  • 应用场景

    • 电机轴承故障检测(特定频率的异常谐波)。

代码示例(FFT)

import matplotlib.pyplot as plt
from scipy.fft import fft

# 生成含周期性的信号
t = np.linspace(0, 1, 1000)
data = 0.5 * np.sin(2 * np.pi * 10 * t) + 0.2 * np.sin(2 * np.pi * 25 * t)

# 计算FFT
fft_values = fft(data)
freqs = np.fft.fftfreq(len(data), d=1/1000)  # 采样频率1000Hz

# 提取主要频率成分
magnitude = np.abs(fft_values)
peak_freq = freqs[np.argmax(magnitude)]

plt.plot(freqs[:len(freqs)//2], magnitude[:len(freqs)//2])
plt.xlabel("Frequency (Hz)")
plt.ylabel("Magnitude")
plt.title("FFT Spectrum")
plt.show()
(3) 时频域特征提取
  • 短时傅里叶变换(STFT)

    • 对信号分段进行FFT,生成时频图(Spectrogram)。

    • 特征:时频能量分布矩阵。

  • 小波变换(Wavelet Transform)

    • 多分辨率分析,适合非平稳信号。

    • 常用小波基:Daubechies(dbN)、Morlet。

    • 特征:小波系数能量、尺度熵。

代码示例(STFT)

from scipy.signal import stft

frequencies, times, Zxx = stft(data, fs=1000, nperseg=100)
plt.pcolormesh(times, frequencies, np.abs(Zxx), shading='gouraud')
plt.title('STFT Magnitude')
plt.ylabel('Frequency [Hz]')
plt.xlabel('Time [sec]')
plt.colorbar(label='Magnitude')
plt.show()
(4) 非线性特征提取
  • 熵特征

    • 近似熵(Approximate Entropy):衡量序列复杂性。

    • 样本熵(Sample Entropy):改进的近似熵,降低偏差。

    • 排列熵(Permutation Entropy):基于序数模式的熵计算。

  • 分形维数

    • Hurst指数:判断序列长期记忆性(趋势或均值回归)。

代码示例(样本熵)

import antropy as ant

sample_entropy = ant.sample_entropy(data, order=2, metric='chebyshev')
print(f"样本熵: {sample_entropy:.2f}")

3. 自动化特征提取工具

(1) tsfresh(Python)
  • 功能:自动提取数百种时域/频域特征,并筛选显著特征。

  • 代码示例

from tsfresh import extract_features, select_features
from tsfresh.utilities.dataframe_functions import roll_time_series

# 创建示例DataFrame(ID列和时间列)
df = pd.DataFrame({
    'id': [1] * 100,
    'time': range(100),
    'value': np.random.randn(100)
})

# 滚动窗口生成子序列
df_rolled = roll_time_series(df, column_id='id', column_sort='time', max_timeshift=5)

# 提取特征
features = extract_features(df_rolled, column_id='id', column_sort='time', column_value='value')

# 特征筛选(基于假设检验)
features_filtered = select_features(features, target)
(2) Kats(Meta开源库)
  • 功能:专为时间序列分析设计,支持趋势、季节性、突变点检测。

  • 代码示例

from kats.tsfeatures.tsfeatures import TsFeatures

ts = pd.Series(data, index=pd.date_range('2023-01-01', periods=100, freq='D'))
model = TsFeatures()
features = model.transform(ts)

4. 特征选择与优化

  • 过滤法:基于统计指标(如方差、互信息)筛选高区分度特征。

  • 包裹法:使用模型(如随机森林)评估特征重要性。

  • 嵌入法:在模型训练中自动选择特征(如Lasso回归、注意力机制)。

代码示例(随机森林特征重要性)

from sklearn.ensemble import RandomForestClassifier

model = RandomForestClassifier()
model.fit(X_train, y_train)
importances = model.feature_importances_

# 可视化
plt.bar(range(X_train.shape[1]), importances)
plt.xlabel("Feature Index")
plt.ylabel("Importance")
plt.show()

5. 挑战与解决方案

(1) 高维特征冗余
  • 问题:提取数百个特征导致维度灾难。

  • 解决方案

    • 使用PCA、t-SNE降维。

    • 基于领域知识手工筛选(如仅保留物理意义明确的特征)。

(2) 非平稳时序处理
  • 问题:数据分布随时间漂移(如设备老化)。

  • 解决方案

    • 滑动窗口提取局部特征。

    • 在线学习更新特征提取模型。

(3) 计算效率
  • 问题:大规模数据特征提取耗时。

  • 解决方案

    • 并行计算(如Dask分布式框架)。

    • 增量式特征更新(仅处理新数据窗口)。


总结

时序特征提取是数据预处理与模型性能提升的核心环节,需结合领域知识选择合适方法:

  • 基础分析:时域/频域统计量快速实现。

  • 复杂模式:时频分析(小波变换)或深度学习自动提取。

  • 工程落地:优先考虑可解释性强的特征(如物理含义明确的频带能量)。

工具链推荐:

  • 快速原型:tsfresh + 可视化(Matplotlib/Plotly)。

  • 工业部署:Kats + 分布式计算(Spark/Dask)。

  • 深度学习整合:TensorFlow/PyTorch自定义特征提取层。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐