机器学习-利用日期/时间数据进行功能工程


Answers:


44

我将从绘制时间变量与其他变量的图表开始,然后寻找趋势。

例如

在此处输入图片说明

在这种情况下,存在周期性的每周趋势和长期的上升趋势。因此,您需要对两个时间变量进行编码:

  • day_of_week
  • absolute_time

一般来说

有几种常见的趋势发生时间框架:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

寻找所有这些趋势。

奇怪的趋势

还要寻找怪异的趋势。例如,您可能会看到罕见但持续的基于时间的趋势:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

这些通常要求您对照将事件映射到时间的某些外部源交叉引用数据。

为什么要画图?

我认为制图如此重要有两个原因。

  • 奇怪的趋势
    虽然可以很容易地自动将总体趋势(每次都添加),但是奇怪的趋势通常需要肉眼和对世界的了解才能找到。这是制图如此重要的原因之一。

  • 数据错误
    通常,数据中都存在严重的错误。例如,您可能会发现日期以两种格式编码,并且只有其中一种已正确加载到程序中。有无数这样的问题,而且它们出奇的普遍。这是我认为制图很重要的另一个原因,不仅对于时间序列,而且对于任何数据都如此。


7

将数据划分为多个窗口,并找到这些窗口的特征(例如自相关系数,小波等),然后将这些特征用于学习。

例如,如果您具有温度和压力数据,则将其分解为各个参数,并计算该窗口中的局部最小值的数量等特征,然后将这些特征用于模型。


7

除了Ben Haley所说的之外,还需要考虑的另一件事是转换为用户本地时间。例如,如果您尝试预测所有用户在晚上8点左右发生的情况,那么如果您查看UTC时间,则很难从中进行预测。


6

在某些情况下,时间序列内的数据和事件是季节性的。在这种情况下,事件的月份和年份非常重要。因此,在这种情况下,您可以使用二进制变量来表示事件是否在给定的月份/年份内。

希望这能回答您的问题。如果不能的话,请具体说明您要实现的目标


4

正如BenNar很好地解释的那样,将日期时间对象分解为日期和时间部分可以帮助检测季节趋势,而完整的(通常甚至更糟的是唯一的)日期时间对象会错过它。

您没有提到您感兴趣的任何特定机器学习算法,但是如果您还对基于距离的聚类(例如k均值)感兴趣,我会将日期时间对象归纳unix时间格式。这将允许对该算法进行简单的数字距离比较,仅说明两个日期值有多远。

在您的示例中,我将仅日期的值2014-05-05推广为1399248000(表示2014年5月5日开始的Unix时间,UTC)。

[有人可能会争辩说,您可以通过将日期时间存储在每个可能的日期时间部分中来实现这一目标,但这会大大增加数据集的维度。因此,我建议结合使用unix时间,距离测量和一些日期时间段]


3

Ben在谈论静态功能,并利用时间戳功能。

作为扩展,我将介绍滞后功能,我不是在谈论原始时间序列,而是在上面进行汇总。

最神秘的部分是我们看不到未来的价值,我们如何在训练数据中使用这些汇总特征?

举个小例子: 有1991年至2015年的年度用电量数据,我想预测未来5年(2016年至2020年)的用电量。我将最近5年的移动平均值作为2020年的特征值,但是对于我们来说,2016到2020年是未知的,因此我们领先(相对于滞后)时间序列5年,让我们计算2010到2015年的移动平均值,然后将该值用作2020年的特征值。因此,我们可以构建未来5年的特征数据。

下一步就是使用移动功能(count \ mean \ median \ min \ max.etc)并尝试不同的窗口,然后您将构造许多功能!


2

根据您对日期/时间信息感兴趣的地方,您可能只想对它进行装箱。例如,如果您对距起点的距离(例如,2015年1月1日)感兴趣,并且想要以月为单位进行测量,则可以将其编码为第1个月(对于2015年1月1日至31日),2 (2015年2月1日至28日),3、4、5、6等。由于开始日期之间的距离大致相同,因此以直接连续的格式表示时间距离。我说连续的是因为您可以说6.5个月,并且知道它已经到了2015年6月的中途了。那么您不必担心实际的日期编码,可以使用所有典型的分类方法。

如果您想以天为单位进行测量,我知道MySql具有“ to_days”功能,如果您恰好在分类之前使用它来提取数据。Python可能有类似的东西,或者使用mork建议的unix-time格式。

希望这可以帮助!


1

根据结果​​变量绘制具有不同时间变化的图表,以查看其影响。您可以使用月,日,年作为单独的功能,并且由于月是一个分类变量,因此您可以尝试用箱形图/晶须图查看是否有任何模式。对于数字变量,可以使用散点图。


1

我不知道这是否是常见/最佳做法,但这是此事的另一种观点。

假设您有一个日期,则可以将每个字段都视为“类别变量”而不是“连续变量”。一天中的值将为{1,...,31},月份中的值将为{1,...,12},对于年份,您可以选择最小值和最大值并建立一套。

然后,由于天,月和年的特定数字值可能对查找数据趋势没有帮助,因此请使用二进制表示形式对数字值进行编码,每个数字都有一个特征。例如,第5个月将是0 0 0 0 1 0 0 0 0 0 0 0(11 0是第5位的1),每个位都是一个要素)。

因此,例如,在“年份集合”中有10年,则日期将转换为具有43个特征(= 31 + 12 + 10)的向量。使用“稀疏向量”,特征量应该不成问题。

对于时间数据,星期几,月几日,可以执行类似的操作...

这完全取决于您希望机器学习模型回答的问题。


这无法捕获可能存在的关系,例如每月的14日和15日是“相似的”。在某种程度上,您认为每天都有不同,因此您也无法预测明天。也不必对分类进行一键编码。
肖恩·欧文

我看不到为什么它无法捕获临近日期的“接近度”。例如,如果您将二进制向量输入到NN,经过适当的训练后,它将自行计算出来。使用二进制向量只是表示类别的一种方法。
Paco Barter

在这种情况下,您实际上具有“ is_12th”和“ is_13th”之类的列,它们在输入空间中是不相关的,并且与“ is_1st”无关,等等。作为连续的功能,它将正确地捕获第12和第13个是在某种意义上说比第1位和第12位更近。您对模型可以推断出的内容很感兴趣,但是,我正在谈论输入功能所编码的内容。
肖恩·欧文

好的我明白了。没错,continuos功能可以更好地捕获日期的“接近”质量。我的观点是,数据中可能存在与日期的数值无关的趋势(例如,某种特定模式的客户仅在星期六购物)。因此,为处理日期提供了另一种观点。
Paco Barter

正如@PacoBarter所说,Actuall忽略了类别之间的不同距离。这并不是那么容易解决的问题,因为这些功能本质上是相位信息,而大多数机器学习模型都没有相位类型输入。不过,一些关于距离指标的DIY可能会做到。
plpopk

0

我的回应背景:到目前为止,收到了很多回应。但是,我想通过假设您正在谈论机器学习应用程序来扩展对话,以预测该特定时间序列的未来值。考虑到这种情况,下面是我的建议。

建议:首先研究传统的统计预测策略(即指数平滑,SARIMAX或动态回归)作为预测性能的基准。尽管机器学习在各种应用程序中都显示出了巨大的希望,但是对于时间序列而言,还是有可靠的统计方法可供您更好地应用。我将提请您注意最近的两篇文章:

  1. 统计和机器学习预测方法: Spyros Makridakis等人的关注点和前进方向。该文章指出,在许多时间序列中,传统的统计时间序列分析均优于机器学习(ML)模型。本质上,机器学习有过度拟合的趋势,并且违反了关于独立条目的任何机器学习模型假设。
  2. 简单与复杂的预测: Kesten C Green等人的证据。本文比较并检查了经过同行评审的期刊文章的时间序列输出,报告了对时间序列的分析,以及是否与各种模型进行了比较。总而言之,研究人员过度地使用难以解释且性能较差的模型来使分析复杂化。通常,这是由于激励结构不佳而发生的。

如果您正在寻找良好的性能,请选择一个指标与多个模型(例如MASE)进行比较,并浏览几个统计(以下参考)和机器学习模型(具有上述功能开发策略)。

干杯,

学习统计预测的资源:我将从这里阅读Rob J Hyndman的免费教科书开始:https//otexts.org/fpp2/。文本基于R包,您可以轻松将其包含在分析中:https : //otexts.org/fpp2/appendix-using-r.html。最后,请注意横截面交叉验证与时间序列交叉验证之间的区别,如下所述:https : //robjhyndman.com/hyndsight/tscv/

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.