仅用于站内搜索,没有排版格式,具体信息请跳转上方微信公众号内链接
时间序列预测是预测建模的基础,引起了数据科学家的极大兴趣。其应用范围包括供应链需求预测和金融市场预测。与传统模型不同的是,时间序列预测模型可能会因为时间固有的可变性而不稳定。
在这篇文章中,小猴子将和大家一起继续探讨时间序列模型、它们是如何工作的,以及为什么我提出了一个使用特征工程预测交易数据的通用机器学习框架。虽然将机器学习应用于时间序列预测并不是什么新鲜事,但我提出的通用框架旨在解决各种情况下的时间序列预测难题。
样本外模型与时间外模型
预测与预测经常被交替使用,但在时间序列分析中它们有着不同的含义。预测是指通过分析过去和现在的长期数据,预测未来的数据点,并根据历史趋势预测未来值。这就是为什么预测序列中未来值的模型被称为时间序列预测模型的原因。相比之下,传统的预测模型,如线性回归,预测的是与训练数据相同时间范围内的值,但预测的是新的或未见过的样本。
例如,根据历史月度销售数据预测明年的销售额就是时间序列预测,模型通过学习模式来预测未来的销售额。相比之下,使用线性回归模型根据价格和营销支出等特征预测新产品的销售额则属于样本外预测。该模型根据现有产品数据进行训练,但预测的是一种未见过的产品。时间序列预测考虑了时间依赖性和趋势,因此与传统的预测建模不同,往往更加复杂。
由于数据和建模目标的性质不同,建立时间序列预测模型和机器学习预测模型需要不同的方法。不过,机器学习技术可以有效地应用于时间序列预测。
回顾一下建立时间序列预测模型的主要注意事项:
通过滞后值将因变量(如销售额)用作自变量。
将季节性虚拟变量纳入周期效应(如月份、星期、节假日、事件)。
加入趋势变量(随时间变化),以捕捉长期变化。
使用部分数据(如最近100天的数据)以保持记忆。
根据需要对目标变量进行各种转换。
由于时间依赖性,不要使用随机拆分。
使用回溯测试对模型进行顺序测试,确定模型在特定时间范围内何时起作用,何时失效。
离群值被视为时间序列数据中的干预因素。
通过考虑数据关系和重新定义变量(如引入新的斜率变量)来处理异常值。
在预测未来数据时,应事先考虑已知的干预因素(如市场促销、节假日)。
例如,在零售销售预测中,趋势可能会显示当月销售额的整体增长。季节性可能会显示每个星期六的销售额较高。干预可能会显示每次市场促销期间的销售额波动。部分数据使用包括在建立零售销售预测模型时关注最新数据,确保模型利用最新趋势和模式。
时间序列数据可被视为物品的交易数据。因此,使用用于时间序列预测的机器学习算法来预测未来的交易金额,就相当于根据交易数据开发一个预测模型。在本研究中使用以下交易数据格式:
对销售额进行广义转换并限制在特定时间范围内的时间序列预测模型可表示为
其中
y_t为t时间的预测转化销售额,其中y_t=f(sales_t),f(⋅)为转化函数(如log(⋅)、sqrt()、logistic())。
G(⋅)表示机器学习算法(如线性回归、LightGBM、XGBoost或随机森林)。
trend_t是时间t的趋势成分。
seasonal_t是虚拟变量(如工作日、月份、周末标志)。
event_t是事件成分(如节假日、促销、特殊事件)。
lag_t是滞后销售值(如n=1、2、滞后订单时的销售额等)。
mov_avg_t是指定窗口内销售额的移动平均值。
ϵ_t是噪声或误差项。
要理解我提出的机器学习(ML)框架背后的原理,就必须了解ARIMA模型,这是时间序列分析中的一种基本方法。ARIMA(自回归整合移动平均)可以有效地模拟时间依赖性,并捕捉时间序列数据中的潜在模式:
请注意,上述模型可扩展为SARIMA,其中明确包含季节性成分。广义ML时间序列预测模型以ARIMA的原理为基础,加入了更多特征并利用了先进的机器学习算法。具体来说,ML方法通过以下方式增强了ARIMA:
利用机器学习的优势(如处理非线性和交互作用),同时保持核心时间序列分析原则。
将模型限制为最新数据,以确保平稳性和相关性,从而提高预测性能。
纳入事件指标或干预变量,以考虑外部影响。
对目标变量进行转换,以处理离散性或非平稳性问题。
在此,我将详细解释实施上述框架的代码。
最初,我使用模拟数据来开发用于时间序列预测(预测销售额)的机器学习框架的Python代码。在随后的章节中,我使用生成的数据和公开的数据集Electric_Production_tm.csv测试了该方法,以全面验证结果。
接下来,我们定义一个函数create_data,用于提取与日期相关的特征,并创建滞后变量和移动平均值。该函数对于捕捉销售数据中的季节性、趋势、事件和各种滞后效应至关重要。
接下来,我们定义一个函数create_data,用于提取与日期相关的特征,并创建滞后变量和移动平均值。该函数对于捕捉销售数据中的季节性、趋势、事件和各种滞后效应至关重要。
我们定义了训练各种机器学习模型的函数,包括LightGBM、XGBoost、线性回归和随机森林。
我们根据特征与目标(销售额)变量的相关性(绝对值)和阈值,为机器学习模型选择最相关的特征。
然后,我们使用滚动窗口方法定义了以下函数,以验证模型的性能,模拟现实世界中新数据随时间推移不断出现的情况。
接下来,我们将介绍预测代码,以便使用建议的机器学习框架预测未来的销售额。
forecast_next_1_day函数通过创建必要的特征并应用训练好的模型来预测第二天的销售额。这个函数非常重要,因为预测未来的销售额需要迭代预测,将当天的预测结果作为第二天预测的输入。
下面定义的forecast_next_7_days函数使用之前的forecast_next_1_day函数反复预测未来7天的销售额。通过根据每次新的预测更新DataFrame,该函数可确保每天的预测结果都被用作后一天预测的输入。
然后,我们使用函数forecast_next_7_days来预测未来七天的销售额,并用预测结果更新数据帧。
下面的代码将预测添加到原始DataFrame中,并为可视化做好准备。
最后,我们绘制培训和测试数据以及未来7天的预测销售额。
我使用两个数据集测试了上一节的代码:一个是Kaggle的电力生产数据集,该数据集分析了工业能源消耗的长期趋势(参见:《时间序列预测模型比较分析:SARIMAX、RNN、LSTM、Prophet及Transformer》)。另一个数据集由我生成的销售交易数据组成。
我之所以选择这些数据集,是因为第一个数据集是典型的时间序列数据集,第二个数据集是我自己生成的,目的是弱化自回归和移动平均效应,同时强调影响销售额的其他因素,如节假日、周末和特定日子(如星期二)。这些因素在零售业中很常见。通过这样做,我可以在不同的数据条件和场景下对SARIMAX和机器学习方法进行比较分析。
以下是电力生产数据集的测试结果(MAPE比率):
我们可以看到,LightGBM在所有变换中始终显示出最低的误差,这表明其在该数据集上的鲁棒性和可靠性。XGBoost也表现出色,尤其是对数变换。随机森林在所有变换中都表现出稳定的性能。相比之下,线性回归的错误率随着变换的增加而增加,尤其是对数变换。SARIMAX受益于转换,但仍落后于机器学习模型。总体而言,机器学习模型,尤其是LightGBM和XGBoost,对电力生产数据集的时间序列预测更为有效。目标(销售)转换可以提高SARIMAX(Arima)的性能。
现在我们来看看生成数据集的测试结果(MAPE比率):
对于模拟销售交易数据,线性回归和随机森林模型的MAPE比值最低,表明在不同变换函数下都具有很高的性能和稳定性。XGBoost性能良好,尤其是在使用sqrt变换时。LightGBM虽然有效,但误差略高于线性回归和随机森林。SARIMAX的误差率一直最高,表明它不太适合该数据集。
如果数据缺乏自回归项(滞后期)和移动平均因子,SARIMAX等基于ARIMA的传统方法就很难提供准确的预测。相比之下,机器学习模型更加灵活,因为它们可以轻松捕捉假期、时间事件和非线性趋势等各种特征。
本文利用特征工程引入了一个通用机器学习框架,用于对交易数据进行时间序列预测。我们通过提取工作日、节假日和趋势等时间特征,提高了模型性能,超越了传统的ARIMA模型。该方法使用LightGBM、XGBoost、线性回归和随机森林等模型来整合这些特征。该方法的主要优点包括可灵活使用各种外部变量,并能捕捉ARIMA模型经常忽略的复杂非线性关系。
这一框架可以通过多种方式进行扩展,例如纳入神经网络和SVM等其他机器学习算法。我们还可以根据应用情况考虑其他相关特征,如市场促销活动和天气条件。这些扩展可以进一步提高预测模型在不同现实世界场景中的准确性和适用性。
长按👇关注-机器学习研习院-设为星标,干货速递