首页
/ StatsForecast时间序列特征生成指南:利用MSTL分解提升预测效果

StatsForecast时间序列特征生成指南:利用MSTL分解提升预测效果

2025-07-08 07:28:58作者:仰钰奇

概述

在时间序列预测中,特征工程是提升模型性能的关键步骤。StatsForecast提供了强大的特征生成功能,特别是通过MSTL(Multiple Seasonal-Trend decomposition using Loess)模型分解时间序列,可以提取出趋势和季节性成分作为新特征,显著提升后续预测模型的准确性。

MSTL分解原理

MSTL是一种时间序列分解方法,能够同时处理多个季节性模式。它将时间序列分解为三个主要部分:

  1. 趋势成分(Trend): 反映时间序列的长期变化方向
  2. 季节性成分(Seasonal): 反映固定周期的重复模式
  3. 残差成分(Residual): 去除趋势和季节性后的剩余部分

在StatsForecast中,我们可以利用mstl_decomposition函数轻松实现这种分解,并将分解结果作为特征用于其他预测模型。

实战步骤

1. 准备数据

首先导入必要的库并加载示例数据:

import pandas as pd
from statsforecast import StatsForecast
from statsforecast.feature_engineering import mstl_decomposition
from statsforecast.models import ARIMA, MSTL

# 加载示例数据
df = pd.read_parquet('时间序列数据文件路径')
uids = df['unique_id'].unique()[:10]  # 选取前10个序列
df = df[df['unique_id'].isin(uids)]

2. 数据划分

将数据划分为训练集和验证集:

season_length = 24  # 季节性周期长度
horizon = 2 * season_length  # 预测步长
valid = df.groupby('unique_id').tail(horizon)  # 最后48个点作为验证集
train = df.drop(valid.index)  # 其余作为训练集

3. 执行MSTL分解

使用MSTL模型分解时间序列并生成特征:

model = MSTL(season_length=24)  # 初始化MSTL模型
transformed_df, X_df = mstl_decomposition(
    train, 
    model=model, 
    freq=1,  # 数据频率
    h=horizon  # 预测步长
)

transformed_df包含原始数据及分解出的趋势和季节性特征,X_df包含未来预测期对应的特征值。

4. 使用特征训练ARIMA模型

将分解得到的特征作为外部变量训练ARIMA模型:

sf = StatsForecast(
    models=[ARIMA(order=(1, 0, 1), season_length=season_length)],
    freq=1
)
preds = sf.forecast(
    h=horizon, 
    df=transformed_df,  # 包含特征的数据
    X_df=X_df  # 预测期特征
)

5. 模型评估

定义评估函数并比较使用特征前后的模型性能:

def compute_evaluation(preds):
    full = preds.merge(valid, on=['unique_id', 'ds'])
    mase24 = partial(mase, seasonality=24)
    res = evaluate(full, metrics=[smape, mase24], train_df=train).groupby('metric')['ARIMA'].mean()
    return pd.Series({
        'mase': '{:.1f}'.format(res['mase']),
        'smape': '{:.1%}'.format(res['smape'])
    })

# 使用特征的模型表现
compute_evaluation(preds)  
# 输出示例: mase 1.0, smape 3.9%

# 不使用特征的模型表现
preds_noexog = sf.forecast(h=horizon, df=train)
compute_evaluation(preds_noexog)  
# 输出示例: mase 2.3, smape 7.7%

性能对比分析

从评估结果可以看出:

  • 使用MSTL特征:MASE=1.0,sMAPE=3.9%
  • 不使用特征:MASE=2.3,sMAPE=7.7%

使用MSTL分解特征后,模型在两项指标上均有显著提升:

  1. MASE(平均绝对标度误差)降低了57%
  2. sMAPE(对称平均绝对百分比误差)降低了49%

应用场景建议

这种特征生成方法特别适用于以下场景:

  1. 复杂季节性模式:当时间序列包含多个季节性周期时
  2. 趋势明显的数据:当数据呈现明显上升或下降趋势时
  3. 外部变量有限:当缺乏足够的外部解释变量时
  4. 混合模型开发:需要结合不同模型优势时

注意事项

  1. 季节性周期长度(season_length)需要根据数据特性合理设置
  2. 分解质量会直接影响最终预测效果,需检查分解结果的合理性
  3. 对于非季节性数据,可能需要考虑其他分解方法
  4. 特征数量增加可能带来过拟合风险,需适当控制模型复杂度

通过这种特征工程方法,我们可以充分利用StatsForecast的强大功能,构建更精确的时间序列预测模型。