Press "Enter" to skip to content

如何编码周期时间特征

深度学习和其他预测模型中对日期、星期几和时间的周到处理。

作者提供的图片

许多预测任务需要时间信息作为模型的输入。想象一下,一个回归模型用于预测一家零售公司柠檬水销售量(你可能还记得我在关于上下文增强特征的文章中举的例子)。夏季对清凉饮料的需求显然更高,导致销售曲线呈现周期性,7月/8月达到峰值(考虑的是欧洲地区的情况)。

如何编码周期时间特征 四海 第2张

在这种情况下,年份内的时间显然是一种有价值的季节性信息,我们应该将其输入模型。但是我们应该如何做呢?日期是很难处理的,每个月的天数会改变(对于2月来说,甚至会根据年份改变),而且日期以各种不同的格式存在:

2023年1月13日

13.01.2023

2023/03/13

首先,我们可以省略年份。为了考虑季节性影响,我们只需要日期和月份。在一个非常简单(也不太周到)的方法中,我们可以将月份作为一个数字输入,将日期作为另一个数字输入。

如何编码周期时间特征 四海 第3张

为什么这是一个坏主意?模型需要学习基督教格里高利历的工作方式(每个月大约30天,每年12个月,闰年等等)。通过足够的训练数据,深度学习模型肯定能够“理解”我们的日历。在这种情况下,所谓的“理解”是指模型能够从月份和日期的输入中推断出相对时间位置。但是我们应该尽可能地为模型简化学习任务,并承担起这个工作(至少我们已经知道日历是如何工作的)。我们利用Python的datetime库,使用相当简单的逻辑计算年份内的相对时间:

import datetime as
from datetime import datetimeimport calendaryear = 2023month = 12day = 30passed_days = (datetime(year, month, day) - datetime(year, 1, 1)).days + 1nr_of_days_per_year= 366 if calendar.isleap(year) else 365position_within_year = passed_days / nr_of_days_per_year

由此得到的position_within_year特征的值范围接近0.0(1月1日)到1.0(12月31日),比(非常复杂的)格里高利历更容易解释。

如何编码周期时间特征 四海 第4张

但这还不是理想的。position_within_year特征描述了一个“锯齿”模式,每年在1.0和0.0之间有一个大幅度的跳跃。这种突然的不连续性可能导致学习效果不佳。12月31日和1月1日是非常相似的日期:它们是直接相邻的,并且有很多共同之处(例如相似的天气条件),它们可能对柠檬水销售具有相似的潜力。然而,position_within_year特征并不反映12月31日和1月1日的这种相似性;实际上,它们相差如此之大。

理想情况下,彼此接近的时间点应具有相似的时间值。我们必须以某种方式设计一个能够表示年份循环性质的特征。换句话说,到了12月31日,我们应该回到1月1日的位置。因此,将年份内的位置建模为圆上的位置是有意义的。我们可以通过将position_within_year转化为单位圆的x和y坐标来实现这一点。

为此,我们使用正弦和余弦函数:

sin(α) = x

cos(α) = y

其中α是应用于圆的角度。如果单位圆代表一年,那么α表示已经过去的年份内的时间。

如何编码周期时间特征 四海 第5张

α因此等同于position_within_year特征,唯一的区别是α具有不同的刻度(α:0.0–2π¹,position_within_year:0.0-1.0)。

通过简单地将position_within_year缩放为α并计算正弦和余弦,我们将“锯齿”模式转换为具有平滑过渡的圆形表示。

import math# scale to 2pi (360 degrees)alpha = position_within_year * math.pi * 2year_circle_x = math.sin(alpha)year_circle_y = math.cos(alpha)# scale between 0 and 1 (original unit circle positions are between -1 and 1)year_circle_x = (year_circle_x + 1) / 2year_circle_y = (year_circle_y + 1) / 2time_feature = (year_circle_x, year_circle_y) # so beautiful ;)

如何编码周期时间特征 四海 第6张

得到的time_feature是一个两元素向量,缩放在0到1之间,对于你的预测模型很容易理解。通过几行代码,我们减轻了模型的许多不必要的学习负担。

单位圆模型可以应用于任何周期性时间信息,例如月份的日期星期几一天中的时间、每小时的分钟等。该概念还可以扩展到时间域之外的循环特征:

  • 物流/公共交通:巴士在市区往返行驶的相对位置

如何编码周期时间特征 四海 第7张

  • 生物学:细胞在细胞周期中的状态。
  • 您有其他用例吗?欢迎留言!

更多信息/连接点

  • 一篇关于同一主题的实践文章,作者是Pierre-Luis Bescond。
  • 您想了解更多关于深度学习模型的特征工程吗?请查看我的关于上下文丰富数据的文章。
  • 您有问题吗?您需要一位人工智能、数据科学、数据工程或Python开发的自由职业专家吗?请访问我的网站并给我留言。

[1] 这里给出的角度是用弧度表示的。0弧度对应0°,2π弧度对应360°。

所有图形均由作者创建。

Leave a Reply

Your email address will not be published. Required fields are marked *