特征工程

这张图更明确的指出了我们构建特征和建模的方式。为了便于理解,我们可以假设预测的 horizon 长度仅为 1 天,而历史的特征 window 长度为 7 天,那么我们可以构建的最基础的特征即为过去 7 天的每天的历史值,来预测第 8 天的值。这个历史 7 天的值,跟之前提到的移动平均,AR(自回归)模型里所使用的值是一样的,在机器学习类方法中,一般被称为 lag 特征。
对于时间本身,我们也可以做各类日期衍生特征,例如我们以天为粒度做预测,我们可以添加这天是星期几,是一个月的第几天,是哪个月份,是否是工作日等等特征输入。
另外一类最常见的基础特征,就是区分不同序列的类别特征,例如不同的门店,商品,或者不同的股票代码等。通过加入这个类别特征,我们就可以把不同的时间序列数据放在一张大表中统一训练了。模型理论上来说可以自动学习到这些类别之间的相似性,提升泛化能力。
类别属性实际上可以归类为静态特征,即随着时间的变化,不会发生变化的信息。除了最细粒度的唯一键,还可以加入其它形式的静态特征。例如商品属于的大类,中类,小类,门店的地理位置特性,股票所属的行业等等。除了类别型,静态特征也可能是数值型,例如商品的重量,规格,一般是保持不变的。
Lag 特征,日期特征这类,则属于动态特征,随着时间变化会发生改变。这其中又可以分成两类,一类是在预测时无法提前获取到的信息,例如预测值本身,跟预测值相关的不可知信息,如未来的客流量,点击量等。对于这类信息,我们只能严格在历史窗口范围内做各种特征构建的处理,一般以 lag 为主。另一类则是可以提前获取到的信息,例如我们有明确的定价计划,可以预知在 T+1 时计划售卖的商品价格是多少。对于这类特征,我们则可以直接像静态特征那样直接加入对应时间点的信息进去。
以上提到的基本属于直接输入的信息,基于这些信息,我们还可以进一步做各种复杂的衍生特征。例如在 lag 的基础上,我们可以做各种窗口内的统计特征,比如过去 n 个时间点的平均值,最大值,最小值,标准差等。进一步,我们还可以跟之前的各种维度信息结合起来来计算,比如某类商品的历史均值,某类门店的历史均值等。也可以根据自己的理解,做更复杂计算的衍生,例如过去 7 天中,销量连续上涨的天数,过去 7 天中最大销量与最低销量之差等等。很多数据科学比赛的获胜方案中都会有大量篇幅来讲解这方面的衍生特征如何来构建。
最后值得一提的是还有很多将各类特征工程手段自动化的工具,在时间序列领域最有名的莫过于 tsfresh 了。除了前面提到的一些基础操作,tsfresh 还能够支持 wavelet 等高深操作,但缺点就是运行时间相对有点长,且需要结合特征选择来达到更好的效果。
问:
业界在实际做时序问题时,通常采用的手段还是对每一个序列做训练学习(但不一定是单独模型),把相关的动态和静态信息通过特征的方式输入到模型中。比如股票代码就不再是维度上的区别,而是做成一个类别变量,输入到模型中进行训练。请给出3种方法,并给出相应的代码
答:
以下是三种方法的示例代码,它们将动态和静态信息作为特征输入到模型中进行训练:
方法一:使用Embedding层将类别变量编码为连续向量特征
import numpy as np
from tensorflow.keras.layers import Input, Embedding, LSTM, Dense, concatenate
from tensorflow.keras.models import Model
from tensorflow.keras.utils import to_categorical
# 动态信息
dynamic_data = np.random.rand(100, 10, 1) # (样本数, 时间步长, 动态特征维度)
# 静态信息
static_data = np.random.randint(0, 10, size=(100,)) # (样本数,)
# 将类别变量进行编码
num_categories = len(np.unique(static_data

最低0.47元/天 解锁文章
1266

被折叠的 条评论
为什么被折叠?



