news 2026/4/26 3:52:43

时间序列特征工程:从基础到实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
时间序列特征工程:从基础到实战

1. 时间序列数据特征工程基础

时间序列分析是数据科学领域的重要分支,广泛应用于金融、气象、工业监测等多个领域。与传统的监督学习不同,时间序列数据具有明显的时序依赖性,这使得我们需要采用特殊的方法来构建特征。

关键认知:时间序列预测本质上是通过历史数据预测未来值,这要求我们将时间序列重构为监督学习问题。

1.1 时间序列的特殊性

时间序列数据与普通表格数据的根本区别在于:

  • 数据点之间存在时间上的先后顺序
  • 相邻观测值通常具有相关性(自相关)
  • 可能包含趋势、季节性和周期性等模式
  • 没有天然的输入/输出特征划分

1.2 监督学习的重构方法

要将时间序列转化为监督学习问题,我们需要:

  1. 确定预测目标(如t+1时刻的值)
  2. 设计能够反映时序关系的特征
  3. 构建包含特征和目标的数据集

基本转换形式如下:

时间序列形式: 时间1, 值1 时间2, 值2 时间3, 值3 监督学习形式: 特征1, 目标值 特征2, 目标值 特征3, 目标值

2. 日期时间特征构建

2.1 基础日期特征

日期时间信息是最直接可用的特征。对于每日温度数据,我们可以提取:

  • 月份(1-12)
  • 日期(1-31)
  • 星期几(0-6)
  • 是否为周末
  • 季度(1-4)
import pandas as pd # 加载数据 series = pd.read_csv('daily-min-temperatures.csv', header=0, index_col=0, parse_dates=True) # 创建特征DataFrame features = pd.DataFrame() features['month'] = series.index.month features['day'] = series.index.day features['day_of_week'] = series.index.dayofweek features['is_weekend'] = features['day_of_week'].isin([5,6]).astype(int)

2.2 高级时间特征

根据领域知识,可以构建更有意义的特征:

  • 季节特征(春夏秋冬)
  • 是否节假日
  • 距特定日期的天数
  • 日照时长(结合地理位置)
  • 温度的季节性基准值
# 添加季节特征 def get_season(month): if month in [12,1,2]: return 0 # 冬季 elif month in [3,4,5]: return 1 # 春季 elif month in [6,7,8]: return 2 # 夏季 else: return 3 # 秋季 features['season'] = series.index.month.map(get_season)

3. 滞后特征构建

3.1 基础滞后特征

滞后特征是最常用的时间序列特征,直接使用历史观测值作为预测依据:

# 创建滞后特征 lags = pd.concat([ series.shift(1).rename('lag_1'), series.shift(2).rename('lag_2'), series.shift(3).rename('lag_3'), series.shift(7).rename('lag_7'), # 一周前 series.shift(30).rename('lag_30') # 一月前 ], axis=1) # 合并所有特征 all_features = pd.concat([features, lags, series.rename('target')], axis=1)

3.2 滞后特征选择策略

选择滞后特征时需要考虑:

  1. 近期滞后(t-1, t-2):捕捉短期依赖
  2. 季节性滞后(t-7, t-30):捕捉周期性模式
  3. 长期滞后(t-365):捕捉年度趋势
  4. 基于自相关分析选择最优滞后

实践经验:开始时可以包含多个滞后,然后使用特征重要性分析筛选最有价值的滞后项。

4. 窗口统计特征

4.1 滚动窗口统计

滚动窗口计算固定大小窗口内的统计量:

# 滚动窗口特征 window_size = 7 rolling_stats = series.rolling(window=window_size) window_features = pd.concat([ rolling_stats.mean().rename('rolling_mean'), rolling_stats.std().rename('rolling_std'), rolling_stats.min().rename('rolling_min'), rolling_stats.max().rename('rolling_max'), rolling_stats.median().rename('rolling_median') ], axis=1) # 需要调整窗口起始点 window_features = window_features.shift(1)

4.2 扩展窗口统计

扩展窗口包含所有历史数据:

expanding_stats = series.expanding() expanding_features = pd.concat([ expanding_stats.mean().rename('expanding_mean'), expanding_stats.std().rename('expanding_std'), expanding_stats.min().rename('expanding_min'), expanding_stats.max().rename('expanding_max') ], axis=1) expanding_features = expanding_features.shift(1)

5. 特征工程实战技巧

5.1 特征组合与变换

除了原始特征,还可以创建:

  • 滞后特征的变化率
  • 窗口统计的比值
  • 温度的季节性差分
  • 标准化/归一化值
# 温度变化率 all_features['temp_change_1'] = all_features['lag_1'] - all_features['lag_2'] all_features['temp_change_7'] = all_features['lag_1'] - all_features['lag_7'] # 季节性差分 all_features['seasonal_diff'] = all_features['lag_1'] - all_features['lag_365']

5.2 特征选择与评估

特征工程后需要评估特征重要性:

  1. 计算特征与目标的相关性
  2. 使用模型的特征重要性评分
  3. 递归特征消除
  4. 基于性能的特征选择
from sklearn.ensemble import RandomForestRegressor # 删除缺失值 clean_data = all_features.dropna() # 分离特征和目标 X = clean_data.drop('target', axis=1) y = clean_data['target'] # 训练模型获取特征重要性 model = RandomForestRegressor() model.fit(X, y) # 特征重要性 importance = pd.Series(model.feature_importances_, index=X.columns) print(importance.sort_values(ascending=False))

6. 常见问题与解决方案

6.1 数据缺失处理

时间序列常见缺失问题:

  • 节假日数据缺失
  • 传感器故障
  • 记录错误

处理方法:

  1. 前向填充(ffill)
  2. 后向填充(bfill)
  3. 插值法(线性、样条)
  4. 基于模型的填充
# 多种填充方法比较 filled_data = { 'ffill': series.fillna(method='ffill'), 'bfill': series.fillna(method='bfill'), 'linear': series.interpolate(method='linear'), 'spline': series.interpolate(method='spline', order=3) }

6.2 特征缩放策略

不同特征的缩放方法:

  1. 标准化(Z-score):适用于大多数数值特征
  2. 归一化(MinMax):适用于有界特征
  3. Robust Scaling:适用于有异常值的数据
  4. 分位数变换:适用于非正态分布
from sklearn.preprocessing import StandardScaler, MinMaxScaler # 对数值特征进行标准化 numeric_features = ['lag_1', 'lag_7', 'rolling_mean'] scaler = StandardScaler() all_features[numeric_features] = scaler.fit_transform(all_features[numeric_features]) # 对月份等循环特征使用正弦/余弦变换 all_features['month_sin'] = np.sin(2*np.pi*all_features['month']/12) all_features['month_cos'] = np.cos(2*np.pi*all_features['month']/12)

7. 高级特征工程技术

7.1 傅里叶变换特征

对于周期性明显的时间序列,傅里叶变换可以提取频率特征:

from scipy.fft import fft # 计算傅里叶变换 n = len(series) yf = fft(series.values) xf = np.linspace(0.0, 1.0/(2.0*1.0), n//2) # 提取主要频率成分 dominant_freq = xf[np.argmax(np.abs(yf[:n//2]))] all_features['dominant_frequency'] = dominant_freq

7.2 小波变换特征

小波变换可以同时捕捉时域和频域信息:

import pywt # 进行小波分解 coeffs = pywt.wavedec(series.values, 'db1', level=3) # 提取小波系数作为特征 for i, coeff in enumerate(coeffs): all_features[f'wavelet_coeff_{i}_mean'] = np.mean(coeff) all_features[f'wavelet_coeff_{i}_std'] = np.std(coeff)

7.3 基于模型的特征

使用简单模型提取特征:

  1. 线性回归残差
  2. 移动平均残差
  3. 季节性分解成分
from statsmodels.tsa.seasonal import seasonal_decompose # 季节性分解 result = seasonal_decompose(series, model='additive', period=365) # 提取分解成分 all_features['trend'] = result.trend all_features['seasonal'] = result.seasonal all_features['residual'] = result.resid

8. 特征工程实战建议

  1. 领域知识优先:温度预测中,考虑地理位置、季节、天气系统等专业因素
  2. 可视化分析:绘制特征与目标的关系图,发现非线性关系
  3. 迭代优化:从简单特征开始,逐步添加复杂特征
  4. 验证策略:使用时间序列交叉验证评估特征效果
  5. 避免泄漏:确保特征构建不会使用未来信息
# 时间序列交叉验证示例 from sklearn.model_selection import TimeSeriesSplit tscv = TimeSeriesSplit(n_splits=5) for train_index, test_index in tscv.split(X): X_train, X_test = X.iloc[train_index], X.iloc[test_index] y_train, y_test = y.iloc[train_index], y.iloc[test_index] # 训练和评估模型 model.fit(X_train, y_train) score = model.score(X_test, y_test) print(f'Fold score: {score:.3f}')

在实际项目中,我发现温度预测的特征工程有几个关键点:

  1. 季节性特征比想象中更重要,特别是年度和季度周期
  2. 近期的温度变化率(导数)是非常有预测力的特征
  3. 天气系统的移动速度决定了最优的滞后窗口大小
  4. 节假日效应在温度预测中表现明显

最后一个小技巧:当处理长时间序列时,可以先将数据按季节分组,分别计算统计特征,这样能更好地捕捉季节性模式。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/26 3:52:31

如何快速下载喜马拉雅VIP音频?完整免费音频下载工具指南

如何快速下载喜马拉雅VIP音频?完整免费音频下载工具指南 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 你是否曾遇到过…

作者头像 李华
网站建设 2026/4/26 3:51:25

记一次由“HTTP重定向”导致的POST请求变GET请求

记一次由“HTTP重定向”导致的POST请求变GET请求 在Web开发中,HTTP重定向是常见的跳转机制,但稍不注意就可能引发意料之外的问题。最近,我在调试一个表单提交功能时,遇到了一个令人困惑的现象:明明前端发送的是POST请…

作者头像 李华
网站建设 2026/4/26 3:41:08

2026,iPaaS集成平台怎么选?看完这篇就懂了

处在企业数字化转型的滚滚浪潮里,系统众多、数据形成孤岛,这已然变成限制发展的关键阻塞点。怎样以高效、安全、敏捷的方式,去连通企业内部繁杂多样的应用和数据,这成了CIO以及IT团队面前必须要回答的问题。iPaaS也就是集成平台即…

作者头像 李华
网站建设 2026/4/26 3:21:22

线性回归原理与实战:从基础到金融风控应用

1. 线性回归的本质与核心价值线性回归是机器学习领域最基础也最重要的算法之一,它通过建立自变量(X)与因变量(y)之间的线性关系模型,帮助我们理解数据背后的规律。这个看似简单的y wx b公式,实际上蕴含着机器学习最核心的思想——用数学模型…

作者头像 李华
网站建设 2026/4/26 3:19:39

假如LLM无限上下文了,RAG还有意义吗?

最近一年,LLM的上下文长度有了非常长的扩展,从早期的4096个token到最近kimi chat的200万token,因此很多人就认为LLM不需要RAG了。实际上这个想法其实是错误的。 RAG的本质是包含两个步骤,一是召回(检索)&a…

作者头像 李华