时间序列简单地表示随时间推移的数据点。因此,它们在自然界和商业中无处不在:温度、心跳、出生、人口动态、互联网流量、库存、库存、销售、订单、工厂生产-任何你能想到的。在无数情况下,对时间序列的有效处理和预测具有提供决定性优势的潜力。它可以帮助企业提前调整其战略(例如,如果可以提前计划生产),或改进其运营(例如,通过检测复杂系统中的异常)。尽管存在许多用于时间序列的模型和工具,但使用它们仍然非常重要,因为它们各自都有自己的错综复杂之处,并且不能总是以相同的方式使用。在第八单元,我们经常处理时间序列,因此我们开始开发我们自己的工具,让我们的生活变得更简单。我们还决定通过开源的方式为社区做出贡献。在本文中,我们将介绍DART,这是我们在Python中简化时间序列处理和预测的尝试。
如果你是一名研究时间序列的数据科学家,你已经知道这一点:时间序列是一种特殊的野兽。对于常规的表格数据,您通常只需使用SCRICKIT-学习执行大多数ML操作-从预处理到预测和模型选择。但对于时间序列,情况就不同了。您很容易在需要一个库进行预处理(例如,Pandas用于插入缺失值并重新采样)、另一个库用于检测季节性(例如statsModels)、第三个库用于适应预测模型(例如Facebook Prophet)的情况下结束,最后,您通常需要实现自己的回测和模型选择例程。这可能相当乏味,因为大多数库使用不同的API和数据类型。这甚至没有提到涉及更复杂的基于神经网络的模型的情况,或者涉及外部数据和更多维度的问题。在这种情况下,您可能必须针对您的用例自己实现模型,例如使用TensorFlow或PyTorch等库。总体而言,我们觉得在Python中对时间序列进行机器学习的体验还不是很流畅。
我们是SCRKIT-LEARN方法的铁杆粉丝:一个具有一致API的单一开源库,其中包含一套非常棒的端到端机器学习工具。DARTS试图成为时间序列的科学学习工具,其主要目标是简化整个时间序列的机器学习体验。
DARTS是开源的,可以在这里获得。您可以将其安装在您最喜欢的Python环境中,如下所示:
DART中的基本数据类型是时间序列,它表示多变量时间序列。它主要是对Pandas DataFrame进行包装,并有一些额外的保证,以确保它表示格式良好的时间序列,并具有适当的时间索引。例如,可以很容易地从DataFrame构建它:
在上面的代码片段中,我们首先读取了一个包含航空乘客数据集的DataFrame。然后,我们构建一个(单变量)时间序列,指定时间和值列(分别为Month和#Passenger)。
现在让我们将我们的序列分成训练和验证时间序列,并对训练序列训练指数平滑模型:
就是这样,我们现在对我们的验证系列有了一个预测。我们可以将其与实际的系列一起绘制出来:
正如您可能已经猜到的,我们正在模仿用于训练模型和进行预测的SCRICKIT-LEARN FIT()和Predict()模式。函数的作用是:接受训练时间序列的参数,而预测()函数的作用是返回表示预测的新时间序列。这意味着模型操作时间序列,而这几乎是DART中唯一被操作的数据类型。这使用户可以轻松地交换和比较型号。例如,我们可以同样轻松地使用自动ARIMA模型(它在幕后围绕着pmdarima):
有两种模式。预测模型在给定过去值的情况下预测时间序列的未来值,而回归模型在给定一组特征时间序列的情况下预测目标时间序列的值。我们上面建立的指数平滑和自ARIMA模型就是预测模型的例子。
模型消耗并产生时间序列,这意味着例如,很容易让回归模型消耗预测模型的输出。
时间序列可以是单变量(一维)或多变量(多维)。某些模型,如基于神经网络的模型,作用于多变量序列,而另一些模型仅限于单变量序列。
该库还包含对预测和回归模型进行反向测试、对超参数执行网格搜索、评估残差,甚至执行自动模型选择的功能。
在上面的示例中,我们使用DART获得了从1958年1月开始的未来36个月的一次预测。然而,一旦有新的数据可用,预测往往需要立即更新。使用DART,使用回溯测试可以很容易地计算这样一个过程产生的预测。例如,使用回溯测试比较两个模型如下所示:
从DART.backtest导入来自DARTS的BACKTEST_FOREGING。MODELES IMPORT PROPHET MODELES=[ExponentialSmooating(),Prophet()]Backtest=[Backtest_Forecast(Series,Model,pd.Timestamp(';19550101';),fcast_Horizon_n=3)for model in model]。
BACKTEST_FOREGING函数接受时间序列、预测模型、时间戳和预测范围。它返回包含历史预测的时间序列,当使用模型预测具有指定预测展望期(这里是3个月)的序列时,从指定的时间戳开始(使用扩展窗口策略)。
返回类型是时间序列,因此我们可以快速计算误差度量-例如这里的平均绝对误差百分比:
从darts.metrics导入枚举(型号)中i、m的Mape Series es.lot(Label=';data';):ERR=Mape(backtest[i],Series)backtest[i].lot(lw=3,label=';{},MAPE={:.2F}%';.format(m,err))plt.title(';带有3个月预测展望期的回测)plt.title(';Backtest with 3个月预测展望期)plt.。
此外,因为backtest_forecast()的返回类型是时间序列,所以我们还可以简单地使用回归模型中的输出要素序列,这可以用来集成(堆叠)几个模型所做的预测,并且可能还包括外部时间序列数据。
这里还有很多我们没有谈到的内容。我们提供了一系列涵盖更多材料的示例笔记本。例如,您可以查看简介笔记本,或者了解如何使用FIT()和Predict()模式轻松地训练RNN或TCNs神经网络。此外,我们还建议参考DARTS文档。
我们正在积极开发DART并增加新功能。例如,我们想补充以下几点:
最后,在我们为几家公司的日常AI/ML工作中,DART是我们内部使用的工具之一。如果您认为您的公司可以从时间序列解决方案中获益或有其他以数据为中心的问题,请不要犹豫与我们联系。