Skip to content

周期特征编码(cyclical feature encoding)

Cyclical feature encoding

在典型的机器学习数据集中,我们大多见到的是从一个值推进到另一个值的特征。例如:

  • 数值型特征,比如年龄、收入、交易金额等。
  • 分类特征,比如 T 恤尺码、收入群体、年龄段等。

然而还有一种特征,在大多数情况下值得专门投入特征工程的精力,却常常被忽视。这就是周期特征,即具有重复模式(或周期)的特征。

ds p197 1

不像其他特征那样连续推进(或没有内在顺序),周期特征表现出周期性行为,并在某个特定间隔后重复。例如,一天中的小时、一周中的星期几、一年中的月份都是常见的周期特征。具体来说,比如一天中的小时,它的取值范围在 0 到 23 之间:

ds p197 2

如果我们不把它当作周期特征来处理,也不采用合适的特征工程技术,就会丢失一些非常关键的信息。为了更好地理解,请考虑下面这点:

ds p198 1

从现实角度讲,在我们对“一天中的小时”的“理想”特征表示中,“23”和“0”这两个值应当彼此接近。

此外,“0”和“1”之间的距离应当与“23”和“0”之间的距离相同。

ds p198 2

然而,标准的表示方式并不能满足这些性质。因此,“23”这个值离“0”很远。事实上,距离性质也没有得到满足。现在想一想,从直觉上说,你不觉得这个特征值得专门的特征工程处理吗?也就是说,一种能保留其内在自然性质的处理方式?我相信你的答案是一致的!下面来看看我们通常是怎么做的。

对这类特征进行编码最常用的技术之一,是使用三角函数,具体来说就是正弦和余弦。它们之所以有用,是因为正弦和余弦是周期性的、有界的,并且对所有实数都有定义。

如果我们想从线性表示转换到真正的周期表示,就需要定义一对变量,其中一个用正弦表示、另一个用余弦表示,然后再加以应用。

ds p199 1

例如,考虑把线性的“一天中的小时”特征表示为周期特征:

中心角(2π)代表 24 小时。因此,线性特征值可以很容易地按如下方式转换为周期特征:

ds p199 2

这样做的好处在于,工程化后的特征能干净利落地满足我们之前讨论的那些性质:

ds p199 3

如上所示,“23”和“0”的周期特征表示之间的距离,与“0”和“1”之间的距离相同。然而,“一天中的小时”特征的标准线性表示却违反了这一性质,从而导致信息丢失……

……或者更确切地说,“一天中的小时”特征的标准线性表示会导致信息的利用不充分,而这些信息本可以让模型受益。如果换成一周中的星期几,那么中心角(2π)就应当代表 7 天。

ds p200 1

同样的思路可以推广到你在数据集中可能遇到的各种周期特征:

  • 风向,如果用分类方式表示,会按这个顺序排列:N、NE、E、SE、S、SW、W、NW,然后回到 N。
  • 月相,比如新月、上弦月、满月、下弦月,可以表示为具有周期顺序的类别。
  • 季节,比如春、夏、秋、冬,是具有周期模式的分类特征,因为它们每年重复。关键在于,随着你审视数据集的特征,你会凭直觉知道哪些是周期特征、哪些不是。通常情况下,模型会更容易解读工程化后的特征,并利用它们准确地建模数据集。

本站内容仅供学习交流,版权归原作者所有。