时间序列数据在现实世界的应用中无处不在。这些数据产生了不同但密切相关的学习任务(例如,时间序列分类、回归或预测)。与更传统的横断面设置相比,这些任务往往没有被完全正规化。因此,不同的任务可能被混同在同一个名称下,算法经常被应用于错误的任务,而性能估计可能是不可靠的。在实践中,像scikit-learn这样的软件框架已经成为数据科学的基本工具。然而,大多数现有的框架都集中在横断面数据上。据我们所知,对于时间性数据,还没有类似的框架存在。此外,尽管这些框架很重要,但它们的设计原则却从未被充分理解。相反,讨论往往集中在使用和功能上,而几乎完全忽略了设计。
为了解决这些问题,我们在本论文中开发了(i)学习任务的正式分类法,(ii)ML工具箱的新设计原则和(iii)一个新的统一的时间序列ML框架。该框架已经在一个名为sktime的开源Python包中实现。设计原则来自于现有的最先进的工具箱和经典的软件设计实践,使用了领域驱动的方法和一个新的科学类型系统。我们表明,这些原则不仅可以解释现有框架的关键方面,还可以指导像sktime这样的新框架的开发。最后,我们用sktime重现并扩展了M4比赛,这是一项主要的预测基准比较研究。复制比赛使我们能够验证已发布的结果并说明sktime的有效性。扩展比赛使我们能够探索以前没有研究过的ML模型的潜力。我们发现,在M4数据的一个子集上,用sktime实现的简单ML模型可以与手工制作的M4赢家模型的最先进性能相媲美。
时间序列数据在科学、商业和工业应用中无处不在。一个时间序列由一个有索引的数值序列组成,通常是在一段时间内反复观察所研究的一些现象。时间序列出现在许多应用中。例如,金融市场的价格变动、工业过程中的传感器读数(如化学反应器中的温度或压力)、病人的医疗记录(如血压和心率)以及顾客的购物记录。
时间序列的一个内在特征是,通常情况下,观察值在统计上依赖于以前的观察值。直观地说,在过去观察到某些数值后,在未来观察到某些数值的可能性更大。时间序列分析是一套涉及分析这种依赖性的技术。分析时间序列在现实世界的应用中是非常重要的。它使我们能够更好地理解产生观察数据的基本过程,并对其进行预测。最终,时间序列分析可以指导我们的决策,改善现实世界应用的结果。
机器学习为数据分析和预测提供了一套密切相关的技术。虽然机器学习传统上侧重于非时间性的截面数据,但近年来已经开发了许多技术来对时间序列数据进行预测。在整个论文中,我们将这些技术称为 "机器学习",或简称为 "ML",当应用于时间序列时,称为 "带时间序列的ML"。
时间序列的ML是一个高度跨学科的领域。技术在不同的学科中使用和发展,通常是重叠的,包括计量经济学、金融学、医学、工程学和自然与社会科学等等。正因为如此,类似的问题和技术经常在不同的背景下出现。与更传统的、横断面的ML设置相比,对于常见的时间序列问题,即我们所说的 "学习任务",似乎没有既定的 "共识"定义。同时,在时间数据背景下,会出现各种密切相关但不同的任务。例如,预测,最常见的任务之一,一般来说,指的是根据过去的数据进行时间上的前瞻性预测的问题。但是,根据不同的背景,预测可能有不同的含义:它可能涉及一个或多个时间序列,序列可能是相关的或独立的,而且我们想要预测的未来时间段可能有也可能没有数据。这些对于现实世界的应用来说是微妙但重要的区别。虽然仅仅是预测就会产生模棱两可的问题表述,但在时间数据背景下还会出现许多学习任务,包括时间序列分类、时间序列回归和注释等等。因此,不同的问题之间的关系并不总是那么明显,或者一个问题的解决方案如何应用于另一个问题。了解这些问题可能采取的不同形式,对于理解我们如何使用ML技术来解决这些问题至关重要。在时间背景中出现的常见数据形式是什么?什么是常见学习问题的种类?它们是如何关联的?以及我们如何以数学上的精确方式来定义这些问题?
本论文的第一个目标就是要解决这些问题。我们通过开发时间序列数据和关键学习任务的正式描述和分类法来实现这一目标。该分类法集中于预测性的时间序列任务,特别是(确定性的)点预测任务,包括预测以及时间序列分类和回归,将非预测性任务(如时间序列聚类)和概率性任务(如分布性预测)留给未来的工作。请注意,在整个论文中,我们关注的是学习关联而不是识别因果关系。
本论文的第二个目标是为多个时间序列学习任务设计一个统一的软件框架。在实践中,ML应用通常涉及一些步骤:从业者首先指定、训练和选择一个合适的模型,然后验证和部署它。为了评估这样的工作流程,从业人员编写了软件代码,通常结合了现有软件包的功能。这些软件包被称为 "工具箱",提供预制的代码片断,使编写应用程序代码的速度更快。从业人员不需要从头开始构建每一个软件,而是可以简单地把预制的代码片断放在一起。另一方面,"框架 "是一种特殊的工具箱。框架不仅提供可重复使用的功能,而且还提供整体结构。它们在一个给定的应用领域中捕捉常见的软件设计决策,并将其提炼成模板,从业者只需复制和填写即可。这就减少了从业人员必须做出的决定数量,使他们能够专注于应用程序的细节。这样一来,从业人员不仅可以更快地编写软件,而且应用程序也会有一个类似的结构。它们将更一致,更可重复使用,更容易维护。
近年来,框架已经成为现代数据科学的重要基础设施。它们在很大程度上决定了实践中的可能性。它们已经成为从业者的主要工具和科学、商业和工业应用的核心组件。流行的例子包括Python中的scikit-learn[205],Java中的Weka[101],Julia中的MLJ[31],以及R中的mlr3[151]或caret[148]。横断面数据包括对多个独立实例的观察,这些观察来自于一个时间点上的不同种类的测量(例如,不同病人入院时的医疗诊断)。横断面数据的基本假设,即观测值代表独立样本,通常被时间序列数据所违反。这就是为什么横断面框架倾向于将时间序列视为范围之外的原因(例如,见Buitinck等人[46])。请注意,虽然人们仍然可以将截面技术应用于时间序列,但这通常会给标准的数据科学工作流程带来相当大的复杂性,并且需要格外小心以避免错误。尽管时间序列数据无处不在,但据我们所知,目前还没有一个与截面技术相媲美的框架用于时间序列的ML。本论文的第二个目标是开发这样一个框架。
正如我们所见,时间序列数据可以产生许多学习任务,包括预测、分类和注释。这些任务描述了不同的学习问题,但它们也是密切相关的。这种关系可以用 "还原(Reduction)"来理解[24]。还原是一种技术,利用一个任务的算法来解决另一个任务。正如我们将看到的,还原是时间序列分析的核心。在时间序列领域,许多还原方法是可能的,许多现有的最先进的解决方案都使用了还原。
还原方法将一个时间序列任务重塑为一个相关的截面任务,这样我们就可以使用任何一个更成熟的截面算法来解决原来的时间序列任务。例如,一个预测任务可以在数据的先验滑动窗口转换的帮助下通过截面回归来解决[34]。同样,一个时间序列的分类任务可以通过首先从每个时间序列中提取特征来重新构建成一个横断面分类任务[87]。
然而,尽管还原方法很重要,但并没有一个统一的框架用于多种学习任务,这将使从业者能够轻松地将一种任务的算法应用于另一种。与此相反,目前的时间序列分析的软件生态系统是相对分散的。虽然有各种专门的工具箱为特定的模型系列或学习任务提供丰富的接口,但大多数工具箱都是相互不兼容的,并且缺乏与更多基础性的横断面框架的整合。对于实践者来说,这使得他们很难结合不同工具箱的功能,也很难充分利用还原关系。对于开发者来说,这使得他们很难建立和整合新的方法,而不必重新实现其他地方已有的大量功能。因此,总的来说,时间序列分析的工具箱能力仍然有限。为了解决这些问题,我们建议开发一个统一的框架,支持多种学习任务和它们之间的还原方法。
建议的框架已经在sktime中实现,这是一个免费的开源软件包。sktime的目的是建立一个完善的框架,使目前的生态系统作为一个整体更加可用和可互操作。虽然我们的目标受众有基本的编程能力,但我们的目标是在Python中提供一个实用和一致的ML框架,以便在一个非ML专家可以使用的编程环境中指定、训练和验证时间序列算法,并在各种科学应用中可重复使用。因此,重点是提供一个模块化和原则性的面向对象的应用编程接口(API)。我们利用了专门为科学计算设计的增强型交互式Python解释器[206],而不是花力气创建一个命令行界面,更不用说图形用户界面(GUI)。我们专注于适合单机内存的中等规模的数据。对于更大的数据集,我们打算整合现有的工具,以便在多台机器上进行更可扩展的分布式计算(例如Dask[219])。
当前版本的sktime专注于常见的预测性任务,如时间序列分类、回归和预测。然而,该设计很容易扩展到其他任务。在未来的工作中,我们希望增加对非预测性任务的支持,如时间序列聚类和注释。
从上述内容中,区分ML应用和研究中的两个基本问题将是有帮助的。我们称它们为 "从业者的问题 "和 "开发者的问题"。实践者的问题是要解决手头的特定ML问题。例如,预测一个化学过程的温度或从病人的心率预测疾病的类型。为了解决这些问题,从业者编写应用程序代码。另一方面,开发者的问题是开发工具箱,帮助从业者更有效地解决他们各自的问题。现有的大部分ML研究都集中在算法开发和为特定的从业者的问题找到更好的解决方案。相比之下,本论文的大部分内容关注的是为开发者的问题找到更好的解决方案。
一个工具箱的有效性和适用性关键取决于它的设计。工具箱的设计--和任何软件设计一样--是很难的。我们必须确定从业者工作流程中的关键对象,在适当的粒度水平上为它们找到抽象,将它们转化为具有明确接口的类和函数,明确它们之间的层次和关系,并在一个可重用的软件包中实现它们。例如,ML背景下的关键对象是学习算法和数据容器。工具箱的设计就是为这些对象寻找抽象,这样从业者就可以在不同的数据集上重复使用算法,而不需要改变很多代码。
虽然开发者问题的重要性已经得到了认可(例如,见Sonnenburg等人[238]),但到目前为止,针对其挑战的研究仍然很少。特别是,很少有论文研究工具箱设计的原则。相反,讨论往往集中在交流设计的 "什么 "上(如软件功能或使用方法),而几乎完全忽略了 "为什么"。例如,工具箱的开发者在介绍他们的工作时,常常认同一套设计原则,然而这些原则通常仍然过于模糊,无法解释具体的设计决策(例如,见Buitinck等人[46])。虽然实际的软件往往包含了大量的设计思想,但我们并不知道有任何文献描述了ML框架的可概括的设计原则。为了解决这些问题,本论文的第三个目标是得出ML工具箱的关键软件设计原则。
我们认为,分析 "为什么 "对于将成功的设计从一个领域推广到新的领域(例如,从截面数据领域到时间序列)至关重要。正如我们将看到的,我们的原则不能仅仅解释现有工具箱的关键方面,还可以指导新框架的发展--包括sktime,我们提出的用于时间序列的ML框架。最终,我们希望我们的研究能够启发其他关于ML工具箱的基本设计原则的研究。
我们的软件设计方法主要属于 "领域驱动的设计"[78]。领域驱动设计的中心思想是,软件的结构和语言应该与感兴趣的领域中的关键概念紧密对应。每个软件都与它的目标用户的某些活动或兴趣有关。用户应用软件的那个主题领域就是领域。因此,工具箱设计的第一步是为我们感兴趣的领域开发一个概念模型,即ML理论或方法论,特别是针对时间序列的ML。
第二步是将概念模型映射到软件上。经典软件设计的语料库提供了一个相关的想法、有用的形式主义和将概念转化为软件的最佳实践的自然来源。虽然很多东西可以直接从现有的软件设计实践中转移过来,但是ML有一个实质性的方面与经典领域不同:算法、界面和工作流与数学和统计理论密切相关--在某种程度上,数学对象不仅是方法论的核心,也是其表示、工作流规范和用户互动的关键元素。我们认为,工具箱设计的进步需要ML理论的进步,包括概念分析和数学形式主义方面。然而,在关于软件设计的科学讨论中,ML理论在很大程度上仍然缺席。这种情况带来了独特的挑战。如何识别、描述和激励ML工具箱的设计方案?我们如何能在ML领域找到精辟的抽象?我们如何将这些抽象概念形式化,使之与基础数学概念相联系,同时又能在软件中实现?从现有的工具箱中可以得出哪些可概括的设计原则来指导新工具箱的设计?虽然这些问题更普遍地涉及ML工具箱的设计,但也有一些针对时间序列领域的问题需要回答。在有时间序列的ML领域,有哪些不同类型的算法?这些算法的界面应该是什么样子的?不同的算法是如何相互作用和相互联系的?
我们试图通过概念建模、形式化的数学统计、新的设计原则和适用的先进设计模式的结合来解决这些问题。我们将首先回顾软件设计的关键概念,重点是面向对象的编程,这是ML软件的主要范式。然后,我们提出了一个简单而强大的想法,即 "科学类型"--一个新的类型系统,它捕捉了关键ML概念的数据科学目的。简而言之,科学类型是一种结构化的数据类型,同时具有该类型的所有元素必须满足的关键数学或统计属性。科学类型将使我们能够以一种在数学上精确和在软件上容易实现的方式来描述关键概念。例如,我们可以说一个 "管道 "由一个 "特征提取器 "和一个 "监督学习器 "组成,以某种形式放在一起。我们相信,有关的类型可以被精确化,从而可以利用它们进行设计考虑,而不仅仅是没有实际内容的模糊隐喻。通过科学的类型,我们能够推导出一套新颖的针对ML的软件设计原则。正如我们将看到的,这些原则不仅可以解释现有工具箱的核心内容,还可以指导新工具箱的开发,如sktime。
在开发了一个统一的时间序列ML框架后,本论文的第四个也是最后一个目标是通过复制和扩展一个主要的预测基准比较研究,即M4竞赛[182]来说明其有效性。
基准比较研究对ML研究至关重要,因为它们允许我们系统地评估新算法,并将其与现有的基线和最先进的解决方案进行比较。因此,这些研究的可重复性对科学进步至关重要[40, 128, 178]。工具箱,如sktime,具有原则性和模块化的界面,使我们能够轻松地复制现有算法的结果,并对新算法进行实验。
特别是,复制M4竞赛将使我们能够验证已发表的结果,用参考实现测试我们的框架,并说明其有效性和适用性。扩展M4竞赛将使我们能够实现和评估以前没有研究过的算法,并研究简单的、基于还原的ML算法是否能够与赢得M4竞赛的定制算法的最先进性能相匹配。为此,我们使用sktime重新实现了比赛中的关键算法,并增加了在sktime中容易实现的基于减少的模型。据我们所知,这是第一个独立于已发布代码的M4竞赛的完整复制品。正如我们将看到的,我们不仅能够在sktime提供的单一框架内重新实现比赛,而且还能够建立简单的ML模型,在M4数据集的重要子集上与获胜模型的性能相当。
综上所述,本论文所涉及的研究问题可以按照其概念性、方法性和应用性分为三组问题。
第一组问题是概念性的。在时间序列数据背景下,有哪些不同类型的数据形式和学习问题?我们如何以一种数学上的精确方式将这些问题形式化?它们之间有什么联系?这些问题在本论文的第一部分通过开发一个正式的学习任务分类法来解决。
第二组问题是方法论性质的。我们怎样才能识别、描述和激励ML工具箱的设计方案?我们如何能在ML领域找到精准的抽象?我们如何将这些抽象概念形式化,使之与基础数学概念相联系,同时又能在软件中轻松实现?从现有的工具箱中可以得出哪些可归纳和可重复使用的设计原则和模式来指导新工具箱的设计?这些问题将在第二部分讨论。对这些问题的回答在很大程度上需要对ML工具箱设计进行新的研究。我们希望在这篇论文中提供一些答案,从现有的最先进的工具箱和经典软件设计的最佳实践中得出关键设计原则。虽然这些问题更普遍地涉及到工具箱的设计,但本论文也涉及到一个统一的时间序列的ML框架的具体设计。在这个领域有哪些不同类型的算法?这些算法类型的界面应该是什么样子的?不同的算法类型是如何相互作用和联系的?此外,我们还讨论了与为时间序列的ML创建一个新的统一框架的理由有关的问题。已经存在哪些相关的软件?现有软件生态系统的局限性是什么?为时间序列的ML开发一个统一的框架的原因是什么?虽然存在几个用于时间序列的ML的工具箱,但据我们所知,我们是第一个提供一个由我们的学习任务分类和设计原则支持的统一框架。
最后一组问题是应用性质的。我们如何使用统一的框架来指定新的ML算法?考虑到一个统一的时间序列ML框架,我们能否找到简单的ML算法来匹配最先进的预测算法的性能?这些问题将在第三部分通过重现和扩展M4竞赛来解决,M4竞赛是预测研究中关键的比较基准研究之一。
本论文的研究贡献可以概括为以下几点。
1.将时间序列学习问题形式化为学习任务,并为时间序列学习任务制定了正式的分类法,重点是常见的(确定性的)点预测任务,如时间序列分类、回归和预测,以及它们之间的还原关系。
2.受现有的最先进的工具箱和经典软件设计的最佳实践的启发,为ML工具箱开发、形式化和激励一套新颖的、可重复使用的设计原则,该原则基于科学类型系统的理念,将软件的实现与基础的数学和统计概念联系起来。
3.回顾现有的时间序列分析软件,讨论当前工具箱功能的局限性,重点是Python的开源生态系统。
4.设计并实现了第一个用于时间序列的ML的统一框架,目的是在Python中提供一个原则性和模块化的面向对象的应用编程接口(API),用于指定、训练和验证中等规模数据的时间序列算法。这个统一的框架已经在一个名为sktime的开源项目中实现。
5.M4预测竞赛的再现和扩展,这是预测算法预测性能的主要基准比较研究之一,重点是使用sktime来评估和比较简单的基于还原的ML算法。据我们所知,这是在一个独立于已发布代码的单一框架内第一次完整地再现M4竞赛。
本论文有三部分结构,包括概念、方法和应用部分。
在第一部分,我们为时间序列的ML领域建立了概念模型,包括时间序列学习任务的分类。在第二章中,我们首先回顾了关键的ML概念和传统的横断面监督学习环境,这将作为我们在整个论文中进行比较的参考。然后在第三章制定了时间序列学习任务的正式分类法。
第二部分是方法论。我们首先推导出ML工具箱的一般软件设计原则,然后用这些原则来开发用sktime实现的时间序列ML的统一框架的具体设计。我们在第四章开始介绍ML工具箱设计背景下的软件设计的基本概念。第5章介绍了科学类型的概念,并推导出了可以通用的设计原则。第7章回顾了开源的Python时间序列生态系统,并讨论了目前的局限性和建立一个统一的时间序列分析框架的理由。第八章激励并描述了sktime的设计和实现,结合了第一部分的概念模型和第二部分的软件设计原则。
第三部分也是最后一部分是应用。在第九章中,我们使用sktime来评估和比较用于预测的简单ML算法,通过重现和扩展M4预测比赛,验证已发表的结果,对照参考实现测试所实现功能的正确性,并说明sktime的有效性和适用性。
第十章最后讨论了本论文的局限性和未来研究的方向第十章最后讨论了本论文的局限性和未来研究的方向。