ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

滞后特征与滑动窗口统计实战:用 Pandas 构造高质量时序回归样本

滞后特征与滑动窗口统计实战:用 Pandas 构造高质量时序回归样本 滞后特征与滑动窗口统计实战用 Pandas 构造高质量时序回归样本在用机器学习如 LightGBM、XGBoost、CatBoost解决时序预测销量预测、服务器流量预测、电网负荷预测时决定模型上限的往往不是算法的超参数调优而是历史时序特征工程Time-Series Feature Engineering的质量与深度。与传统的表格数据不同时间序列数据存在严格的时间单向性Time Arrow与自相关性Autocorrelation。如果直接把原始日期和当前值丢进 GBDT 模型树模型只能学习到静态的离散切分点完全无法理解“过去 7 天的平均增长斜率”或者“上个月同期的波动幅度”。构造强大的时序特征体系核心依赖两大基本功滞后特征Lag Features与滚动滑动窗口统计Rolling Window Statistics。今天我们系统拆解如何用 Pandas 优雅、高效且绝不发生数据泄露地构造全套时序特征矩阵。时序特征的核心拓扑大纲[ 目标预测点 T (待预测的目标值 Y) ] │ ┌────────────────┴────────────────┐ ▼ ▼ 【滞后特征 (Lag Features)】 【滑动窗口特征 (Rolling Window Features)】 - Lag_1d: 昨天的真实值 - Rolling_Mean_7d: 过去 7 天平均值 (消除噪声) - Lag_7d: 上周同天的真实值 - Rolling_Std_7d: 过去 7 天标准差 (衡量波动剧烈度) - Lag_14d: 2周前的真实值 - Rolling_Max_28d: 过去 28 天历史最高峰值 - Lag_364d: 去年同期的真实值 - Rolling_Quantile_75: 过去窗口的 75 分位数绝对红线防止未来信息泄露Shift 先行原则在构造滑动窗口特征时初学者最常犯的一个致命错误是直接写df[sales].rolling(7).mean()。这是严重的数据泄露df[sales].rolling(7).mean()默认计算的窗口包含当前行自身即包含当天 $T$ 时刻的真实值 $y_t$。如果把这个特征作为预测当天 $y_t$ 的输入模型在训练时会直接通过均值公式“反向偷看”真实标签导致验证集得分极其完美而一旦上线做真正未来的预测时特征全部为空或彻底失效。铁律计算任何 Rolling 特征之前必须先执行.shift(1)偏移一个步长# ❌ 错误包含了当天自身的数据发生严重穿越 bad_feature df[sales].rolling(7).mean() # ✅ 正确严格只看历史从昨天向回倒推 7 天 good_feature df[sales].shift(1).rolling(7).mean()生产级实战代码多实体分组批量特征生成流水线在实际业务中我们通常需要同时预测成千上万个商品或门店item_id×store_id。特征构造必须在各分组内部独立进行并利用 Pandas 向量化保证秒级计算import pandas as pd import numpy as np def build_advanced_time_series_features( df: pd.DataFrame, group_cols: list, date_col: str, target_col: str ) - pd.DataFrame: 为多实体时间序列批量构造高性能滞后与滑动窗口特征 # 1. 确保按实体和时间严格单调升序排序 df df.sort_values(group_cols [date_col]).copy() # 提取分组对象 grouped df.groupby(group_cols)[target_col] # 2. 构造基础滞后特征 (Lag 1, 2, 3, 7, 14, 28) lag_days [1, 2, 3, 7, 14, 21, 28] for lag in lag_days: df[flag_{lag}d] grouped.shift(lag) # 3. 构造滑动窗口均值、标准差与极值 (窗口大小 7, 14, 28 天) # 关键统一对 shift(1) 后的序列进行 rolling 计算确保零泄露 shifted_grouped df.groupby(group_cols)[target_col].shift(1) windows [7, 14, 28] for w in windows: # 滑动均值 (平滑趋势) df[frolling_mean_{w}d] df.groupby(group_cols)[target_col].transform( lambda x: x.shift(1).rolling(windoww, min_periodsmax(1, w//2)).mean() ) # 滑动标准差 (波动风险) df[frolling_std_{w}d] df.groupby(group_cols)[target_col].transform( lambda x: x.shift(1).rolling(windoww, min_periodsmax(1, w//2)).std() ) # 滑动最大值与最小值 (边界探索) df[frolling_max_{w}d] df.groupby(group_cols)[target_col].transform( lambda x: x.shift(1).rolling(windoww, min_periodsmax(1, w//2)).max() ) df[frolling_min_{w}d] df.groupby(group_cols)[target_col].transform( lambda x: x.shift(1).rolling(windoww, min_periodsmax(1, w//2)).min() ) # 4. 构造动量与相对变动特征 (Momentum Features) # 当前 7 天均值相对 28 天均值的比率 (判断是处于加速上涨还是衰退期) df[rolling_mean_ratio_7_28] df[rolling_mean_7d] / (df[rolling_mean_28d] 1e-5) # 昨天相对上周同天的变动幅度 df[wow_diff_lag1_7] df[lag_1d] - df[lag_7d] return df多步前向预测Multi-Step Ahead的特征构造策略如果业务需求不是预测“明天”$T1$而是要一次性预测“未来 14 天”$T1 \sim T14$特征构造需要做出关键适配策略 A递归预测法Recursive Forecasting仅训练一个单步模型预测出 $T1$ 后将预测值填回作为 $T2$ 的lag_1d特征滚雪球式向后递归优缺点特征工程简单但预测误差会逐日滚雪球累积放大。策略 B直接多模型法Direct Multi-Model / Multi-Horizon如果要预测第 $K$ 天后的销量所有特征的滞后步长必须大于等于 $K$例如预测 7 天后特征只使用lag_7d,lag_8d,rolling_mean_7d_shifted7针对 1~14 天分别训练 14 个独立的特定步长模型优缺点模型开销增大但在长周期预测中绝无误差累积预测精度最为稳定。高质量的特征工程就像给机器学习模型装上了一对能够看清历史周期与演进趋势的眼睛。把统计学的滑动规律扎实地喂给模型哪怕只用默认参数的 LightGBM也能跑出极具竞争力的商业预测表现。
返回列表