StatsForecast时间序列特征生成指南:利用MSTL分解提升预测效果
2025-07-08 07:28:58作者:仰钰奇
概述
在时间序列预测中,特征工程是提升模型性能的关键步骤。StatsForecast提供了强大的特征生成功能,特别是通过MSTL(Multiple Seasonal-Trend decomposition using Loess)模型分解时间序列,可以提取出趋势和季节性成分作为新特征,显著提升后续预测模型的准确性。
MSTL分解原理
MSTL是一种时间序列分解方法,能够同时处理多个季节性模式。它将时间序列分解为三个主要部分:
- 趋势成分(Trend): 反映时间序列的长期变化方向
- 季节性成分(Seasonal): 反映固定周期的重复模式
- 残差成分(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分解特征后,模型在两项指标上均有显著提升:
- MASE(平均绝对标度误差)降低了57%
- sMAPE(对称平均绝对百分比误差)降低了49%
应用场景建议
这种特征生成方法特别适用于以下场景:
- 复杂季节性模式:当时间序列包含多个季节性周期时
- 趋势明显的数据:当数据呈现明显上升或下降趋势时
- 外部变量有限:当缺乏足够的外部解释变量时
- 混合模型开发:需要结合不同模型优势时
注意事项
- 季节性周期长度(season_length)需要根据数据特性合理设置
- 分解质量会直接影响最终预测效果,需检查分解结果的合理性
- 对于非季节性数据,可能需要考虑其他分解方法
- 特征数量增加可能带来过拟合风险,需适当控制模型复杂度
通过这种特征工程方法,我们可以充分利用StatsForecast的强大功能,构建更精确的时间序列预测模型。