在R中实现百分比时间序列预测的可行方案咨询
周度弱季节性百分比指标预测方案
你当前的场景属于小样本短时序预测任务,2.5年周度数据累计仅约130个样本,深度学习模型需要足够多的样本拟合时序规律,LSTM效果差属于正常情况,优先选择轻量时序模型+特征工程的方案适配性更高。
一、前期数据预处理
- 先校验百分比指标的取值范围,如果固定在0-1区间,可先做
logit变换将值域拉伸到实数域,预测完成后再做逆变换,避免预测结果超出合理范围 - 构造基础特征:以日期为时间索引,生成「周数」「月份」「季度」「是否节假日周(若业务相关)」等时间特征
- 构造滞后特征:滑动生成前1周、前2周、前4周、前12周、前52周(对应去年同周)的历史百分比值,弱季节性场景下同期历史值的参考性很高
二、推荐适配模型
1. Prophet(优先尝试,门槛最低)
专门适配小样本、弱季节性的时序数据,自动拟合趋势与周期规律,支持加入自定义特征提升效果,示例代码如下:
import pandas as pd from prophet import Prophet # 转换为Prophet要求的输入格式 df = df.rename(columns={'date':'ds', 'percentage':'y'}) # 开启年度季节性,关闭周度季节性(周度数据天然按周采样不需要额外拟合周规律) model = Prophet(weekly_seasonality=False, yearly_seasonality=True) # 加入周数作为额外回归因子,强化季节性拟合 df['week_of_year'] = df['ds'].dt.isocalendar().week model.add_regressor('week_of_year') model.fit(df) # 生成未来预测结果,periods填需要预测的剩余周数 future = model.make_future_dataframe(periods=20, freq='W') future['week_of_year'] = future['ds'].dt.isocalendar().week forecast = model.predict(future) # forecast['yhat'] 即为预测的百分比值
2. TBATS模型
无需手动构造特征,自动适配多周期弱季节性的时序数据,对非严格符合季节性规律的序列适配性远高于传统ARIMA类模型。
3. LightGBM/XGBoost回归
将构造的时间特征、滞后特征作为输入,目标值为当周百分比,采用时间序列交叉验证(按时间顺序划分训练测试集,禁止随机划分)训练即可,拟合非线性规律的能力更强。
三、效果优化建议
- 评估指标同时参考MAE和MAPE,百分比指标的相对误差参考价值高于均方误差
- 单模型效果达不到要求可以做加权融合:比如将Prophet的预测结果和LightGBM的预测结果按7:3的权重加权,通常可以带来5%-10%的精度提升
- 不建议继续尝试深度学习类模型:2.5年的周度数据量不足以支撑LSTM等模型拟合有效规律,强行使用大概率会出现过拟合、泛化能力差的问题
内容的提问来源于stack exchange,提问作者Miki Parr
相关产品推荐
相关产品推荐

