处理机器学习应用程序的时间数据的常见/最佳做法是什么?
例如,如果数据集中有一列带有事件时间戳记的列,例如“ 2014-05-05”,那么如何从该列中提取有用的功能(如果有)?
提前致谢!
处理机器学习应用程序的时间数据的常见/最佳做法是什么?
例如,如果数据集中有一列带有事件时间戳记的列,例如“ 2014-05-05”,那么如何从该列中提取有用的功能(如果有)?
提前致谢!
Answers:
我将从绘制时间变量与其他变量的图表开始,然后寻找趋势。
在这种情况下,存在周期性的每周趋势和长期的上升趋势。因此,您需要对两个时间变量进行编码:
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.
这些通常要求您对照将事件映射到时间的某些外部源交叉引用数据。
我认为制图如此重要有两个原因。
奇怪的趋势
虽然可以很容易地自动将总体趋势(每次都添加),但是奇怪的趋势通常需要肉眼和对世界的了解才能找到。这是制图如此重要的原因之一。
数据错误
通常,数据中都存在严重的错误。例如,您可能会发现日期以两种格式编码,并且只有其中一种已正确加载到程序中。有无数这样的问题,而且它们出奇的普遍。这是我认为制图很重要的另一个原因,不仅对于时间序列,而且对于任何数据都如此。
将数据划分为多个窗口,并找到这些窗口的特征(例如自相关系数,小波等),然后将这些特征用于学习。
例如,如果您具有温度和压力数据,则将其分解为各个参数,并计算该窗口中的局部最小值的数量等特征,然后将这些特征用于模型。
在某些情况下,时间序列内的数据和事件是季节性的。在这种情况下,事件的月份和年份非常重要。因此,在这种情况下,您可以使用二进制变量来表示事件是否在给定的月份/年份内。
希望这能回答您的问题。如果不能的话,请具体说明您要实现的目标
正如Ben和Nar很好地解释的那样,将日期时间对象分解为日期和时间部分可以帮助检测季节趋势,而完整的(通常甚至更糟的是唯一的)日期时间对象会错过它。
您没有提到您感兴趣的任何特定机器学习算法,但是如果您还对基于距离的聚类(例如k均值)感兴趣,我会将日期时间对象归纳为unix时间格式。这将允许对该算法进行简单的数字距离比较,仅说明两个日期值有多远。
在您的示例中,我将仅日期的值2014-05-05推广为1399248000(表示2014年5月5日开始的Unix时间,UTC)。
[有人可能会争辩说,您可以通过将日期时间存储在每个可能的日期时间部分中来实现这一目标,但这会大大增加数据集的维度。因此,我建议结合使用unix时间,距离测量和一些日期时间段]
Ben在谈论静态功能,并利用时间戳功能。
作为扩展,我将介绍滞后功能,我不是在谈论原始时间序列,而是在上面进行汇总。
最神秘的部分是我们看不到未来的价值,我们如何在训练数据中使用这些汇总特征?
举个小例子: 有1991年至2015年的年度用电量数据,我想预测未来5年(2016年至2020年)的用电量。我将最近5年的移动平均值作为2020年的特征值,但是对于我们来说,2016到2020年是未知的,因此我们领先(相对于滞后)时间序列5年,让我们计算2010到2015年的移动平均值,然后将该值用作2020年的特征值。因此,我们可以构建未来5年的特征数据。
下一步就是使用移动功能(count \ mean \ median \ min \ max.etc)并尝试不同的窗口,然后您将构造许多功能!
根据您对日期/时间信息感兴趣的地方,您可能只想对它进行装箱。例如,如果您对距起点的距离(例如,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,...,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)的向量。使用“稀疏向量”,特征量应该不成问题。
对于时间数据,星期几,月几日,可以执行类似的操作...
这完全取决于您希望机器学习模型回答的问题。
我的回应背景:到目前为止,收到了很多回应。但是,我想通过假设您正在谈论机器学习应用程序来扩展对话,以预测该特定时间序列的未来值。考虑到这种情况,下面是我的建议。
建议:首先研究传统的统计预测策略(即指数平滑,SARIMAX或动态回归)作为预测性能的基准。尽管机器学习在各种应用程序中都显示出了巨大的希望,但是对于时间序列而言,还是有可靠的统计方法可供您更好地应用。我将提请您注意最近的两篇文章:
如果您正在寻找良好的性能,请选择一个指标与多个模型(例如MASE)进行比较,并浏览几个统计(以下参考)和机器学习模型(具有上述功能开发策略)。
干杯,
学习统计预测的资源:我将从这里阅读Rob J Hyndman的免费教科书开始:https://otexts.org/fpp2/。文本基于R包,您可以轻松将其包含在分析中:https : //otexts.org/fpp2/appendix-using-r.html。最后,请注意横截面交叉验证与时间序列交叉验证之间的区别,如下所述:https : //robjhyndman.com/hyndsight/tscv/。