基于sktime的多变量时间序列预测:ARIMA、Prophet、LightGBM示例请求
多门店多商品销售额预测:sktime ARIMA/Prophet/LightGBM 实现示例
数据预处理
首先需要将数据转换为sktime兼容的格式。你的数据包含date(时间索引)、store(门店)、item(商品),每个(store, item)组合对应一条独立时间序列,先整理成面板数据结构:
import pandas as pd from sktime.forecasting.base import ForecastingHorizon # 合并特征与标签 train_df = pd.concat([x_train, y_train.rename('sales')], axis=1) # 转换时间格式并构建面板结构 train_df['date'] = pd.to_datetime(train_df['date']) train_df = train_df.set_index(['store', 'item', 'date']).unstack(level=-1)['sales'] # 处理测试集,生成预测时间范围 test_df = x_test.copy() test_df['date'] = pd.to_datetime(test_df['date']) fh = ForecastingHorizon(test_df['date'].unique(), is_relative=False)
1. ARIMA模型实现
使用sktime的AutoARIMA自动适配最优参数,结合PanelForecaster批量处理多序列:
from sktime.forecasting.arima import AutoARIMA from sktime.forecasting.panel import PanelForecaster # 初始化面板预测器,假设数据为月度周期(sp=12),日度可设sp=7 arima_forecaster = PanelForecaster( forecaster=AutoARIMA(sp=12, seasonal=True), strategy="recursive" ) # 训练模型 arima_forecaster.fit(train_df) # 生成预测并转换回原始格式 arima_preds = arima_forecaster.predict(fh=fh) arima_preds = arima_preds.stack().reset_index(name='pred_sales') arima_preds = arima_preds.merge(test_df, on=['store', 'item', 'date'], how='right')
2. Prophet模型实现
sktime封装了Facebook Prophet,同样通过PanelForecaster处理多序列:
from sktime.forecasting.fbprophet import Prophet from sktime.forecasting.panel import PanelForecaster # 初始化Prophet面板预测器 prophet_forecaster = PanelForecaster( forecaster=Prophet(seasonality_mode='additive', yearly_seasonality=True), strategy="recursive" ) # 训练模型 prophet_forecaster.fit(train_df) # 生成预测并转换格式 prophet_preds = prophet_forecaster.predict(fh=fh) prophet_preds = prophet_preds.stack().reset_index(name='pred_sales') prophet_preds = prophet_preds.merge(test_df, on=['store', 'item', 'date'], how='right')
3. LightGBM模型实现
作为机器学习模型,需先提取时间特征,再用make_reduction转换时间序列为表格数据:
from sktime.forecasting.compose import make_reduction from sktime.transformations.series.date import DateTimeFeatures from lightgbm import LGBMRegressor from sktime.forecasting.panel import PanelForecaster # 提取时间特征:年、月、周几、季度 dt_transformer = DateTimeFeatures( features_to_extract=["year", "month", "day_of_week", "quarter"] ) # 构建LightGBM预测器,用过去30天数据作为特征 lgbm_forecaster = make_reduction( estimator=LGBMRegressor(n_estimators=100, random_state=42), transformer=dt_transformer, strategy="recursive", window_length=30 ) # 包装为面板预测器批量处理多序列 lgbm_panel_forecaster = PanelForecaster( forecaster=lgbm_forecaster, strategy="recursive" ) # 训练与预测 lgbm_panel_forecaster.fit(train_df) lgbm_preds = lgbm_panel_forecaster.predict(fh=fh) # 转换回原始格式 lgbm_preds = lgbm_preds.stack().reset_index(name='pred_sales') lgbm_preds = lgbm_preds.merge(test_df, on=['store', 'item', 'date'], how='right')
关键注意事项
- 周期参数调整:ARIMA的
sp需匹配数据频率(日度=7,月度=12,季度=4)。 - 自定义特征:LightGBM可添加门店促销、节假日等额外特征,只需扩展特征提取步骤。
- 模型评估:用sktime内置指标对比效果:
from sktime.performance_metrics.forecasting import MeanAbsoluteError mae = MeanAbsoluteError() print("ARIMA MAE:", mae(y_true=actual_sales, y_pred=arima_preds['pred_sales']))
内容的提问来源于stack exchange,提问作者user1388142
相关产品推荐
相关产品推荐

