用于时间序列预测的AutoML

2020-01-17 17:43:10 浏览数 (3)

作者 | Denis Vorotyntsev

来源 | Medium

编辑 | 代码医生团队

最近,参加了AutoSeries —时间序列数据的AutoML竞赛,在其中设法获得40个竞争对手(决赛中的15个)的第一名。这篇文章是解决方案的概述。

比赛说明

AutoSeries是Web搜索和数据挖掘(WSDM)会议的竞赛之一。该竞赛是由4Paradigm和ChaLearn组织的第十届AutoML竞赛。先前的旨在为表格数据,计算机视觉,自然语言处理和语音识别任务提供自动机器学习解决方案。过去挑战的完整列表可以在AutoML挑战的官方网站上找到。

http://automl.chalearn.org/

这项挑战旨在为时间序列回归任务提出自动化解决方案。AutoSeries仅限于多元回归问题,这些问题来自不同的时间序列域,包括空气质量,销售,工作状态,城市交通等。挑战中的每个数据集都是表格数据,其特征主要有以下三种类型:Id(可以是多个特征或没有特征),时间戳(每个数据集只有一个时间戳),其他特征(数值或分类)以及预测目标。Id功能的组合标识一个变量(时间序列)。

给定数据集的示例。数据被混淆了,但是有一些时间序列模式

参与者必须提交代码,这些代码将在Docker容器中运行(CPU:4核,16 Gb RAM,无GPU)。首先,该模型是在完整数据上训练的,但是在推理过程中,可以对其进行更新或重新训练。公开排行榜是根据五个数据集(私有)得出的-5个新数据集,无需人工干预。私有数据集的结果确定最终排名。

最终解决方案概述

最终解决方案的一般步骤

本节专门介绍最终解决方案的主要部分。它的代码在这里发布:

https://github.com/DenisVorotyntsev/AutoSeries

特色工程

该解决方案包括几个步骤。首先,为时序任务生成通用功能。这些功能的数量和类型是管道的超参数,应针对每个任务分别对其进行优化,但是由于缺乏计算时间,决定为所有任务生成相同的功能,并在功能选择阶段删除无用的功能。

第一批特征是基于最关键的数字特征的特征。成对的数字特征的数字运算(加,减,乘和除)始终会提高基于树的模型的得分,因为新特征可能会揭示数据中的某些隐藏关系。

例如,预测一下公寓的价格。在公寓的地板(已知信息ap_floor)和地板(总数total_floors -在建筑物)可能通过添加新功能来丰富relative_floor -这说明在建设公寓的地板上的相对位置:

rel_floor = ap_floor / total_floors

此功能可能有助于模型理解排屋的第三层(rel_floor接近于1)与摩天大楼的第三层(rel_floor接近于0)不同。

但是,如果执行所有可能对的数值运算,则此类特征工程策略存在两个重大问题:过拟合(在时间序列任务中尤其重要)和内存问题(使用了16个RAM泊坞窗)。为了减少负面影响,选择了一小部分特征并将其用于对。通过将整个数据集拟合到浅LigtGBM模型(10棵树)来完成。所有使用的功能均按“获得”重要性进行排序,即使用该功能的拆分的总增益之和。然后,将对前n个最 重要的数字特征进行选择。

下一批功能基于数据的时间序列性质:先前的值和差异。计算目标的滞后值,最重要的数字和分类特征,目标的最后一个值(滞后= 1)和目标的滞后值(滞后> 1)之间的差。这些新功能是最重要的功能。

最后一批是时间序列功能:年,月,周几,年几和小时。可以添加更多基于时间的功能,例如一天中的一分钟,一年中的时数等,但是决定不这样做,因此解决方案将是通用的。将这些新功能视为类别有时会提高得分,但在其他情况下,它会大大降低得分。在推理过程中,没有足够的计算时间来优化此超参数(即,将其视为数值或分类),因此将它们全部都视为数值。

验证和基准模型

生成新功能后,将对基线模型进行训练。基准模型使用所有初始和创建的功能。它使用CatBoost编码器对类别进行编码,并按原样使用目标。该模型分两个步骤进行训练:

  1. 首先将数据分为训练和验证部分。通常希望训练/验证/测试拆分模拟“生产设置”中模型的使用。对于时间序列,这意味着该模型不会频繁更新,并且需要在验证部分中获取20%到30%的数据(或使用具有相同比例的滚动窗口)。在这次比赛中,可以频繁更新模型,因此验证部分应该较小:验证部分是全部训练数据的10%。它用于早期停止,即在增强合奏时优化树木的数量。完成此步骤后,模型可以开始进行预测,并且随后的所有步骤都是可选的(bt对于获得高分至关重要)。
  2. 使用最佳数量的树,可以对完整数据进行模型拟合。

使用了单独的LigthGBM模型进行预测。测试了CatBoost(没有GPU的速度太慢)和LinearModels(不够精确)。还用不同的种子测试了装袋和训练以减少预测的差异,但是这些方法花费了很多时间,并且得分的提高不足以包含在最终解决方案中。

超参数优化

超参数优化的步骤

在推理过程中,花很少的时间进行超参数优化,因此决定将所有可能的超参数组合缩小到最有前途的组合,即:

  1. 处理类别变量:将类别特征视为pandas类别类型,让LightGBM头痛不已,或者使用CatBoost编码对每个类别进行编码。
  2. 目标预处理:按原样使用目标,或通过区分:new_target(t)= target(t)-target(t-1)计算新的目标以进行回归。差异可以帮助克服非平稳时间序列数据。还测试了功率变换(扎根于目标和Box-Cox)以减少平稳性,但是它并没有将分数提高到足以包含在最终解决方案中。

首先对每组参数进行验证,如果新的验证评分更好,则重新安装模型。在选择了最佳的管道超参数集之后,模型开始特征选择:使用最重要的特征(“获得”重要性)的前5%,10%,20%等对模型进行重新拟合。如果分数提高了-在最后的可选步骤中使用了一组新功能-优化超参数(RandomGrid)。

更新中

更新很简单:用完整的数据(训练数据加上新的训练数据)重新拟合最佳模型。然而频繁更新对于获得高分至关重要。

结果

为这个项目付出了很多努力,而奋斗得到了回报。在公共排行榜中排名第三,在私人排行榜中排名第一。

比赛的私人排行榜

总结经验

在比赛中,遇到了很多错误,这浪费了时间和精力。错误是不可避免的,但是有一些注释,如果从一开始就使用它们,这些注释有很大帮助:

  1. 记录尽可能多的有用信息:数据框中的列(训练和测试数据中的列顺序可能不同),数据类型(训练和测试数据框中的数据类型可能不同),每次训练的时间,训练剩余时间等等。这将有助于理解为什么提交失败或得分较低的原因。例如某些提交中的模型由于一个愚蠢的错误而没有更新,而却没有注意到。因此分数远远低于应有的分数。简单的消息打印(“模型已更新!”)节省了一天的时间,并帮助找到了错误。
  2. 在AutoML中,对看不见的数据进行测试至关重要。可能很容易为公共部分过度安装解决方案,并且可能导致看不见的数据崩溃。这就是提交在第一项任务上失败了。在比赛开始时尝试收集更多数据。新的数据集应该是多种多样的,例如,缺少值或类别中的字符串以及其他因素,这可能会使代码崩溃。用不同的时间预算测试它们:尝试在时间紧张的情况下输出甚至较差的模型。
  3. 以“即插即用”的方式组织代码:管道的每个部分都不应依赖其他部分。例如,想拟合线性回归而不是LightGBM,这容易吗?如果代码井井有条,那就可以了。在这场比赛中,朝着更干净,更有条理的代码迈出了一大步。
  4. 请勿在pandas中使用就地操作,因为它有故障。只是尽可能不要使用它。

https://github.com/pandas-dev/pandas/issues/30484

致谢

要感谢AutoSeries竞赛的组织者-4Paradigm和ChaLearn团队。他们做得很好:收集了数据,准备了提交评分引擎,编写了可靠的基准解决方案,并在论坛和电子邮件中回答了出现的问题。

0 人点赞