时间序列之特征工程:动态和静态信息通过特征的方式输入模型

特征工程

在这里插入图片描述

这张图更明确的指出了我们构建特征和建模的方式。为了便于理解,我们可以假设预测的 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))
encoded_static_data = to_categorical(static_data, num_categories)

# 定义动态特征输入
dynamic_input = Input(shape=(10, 1))
lstm_output = LSTM(64)(dynamic_input)

# 定义静态特征输入
static_input = Input(shape=(num_categories,))
embedding_output = Embedding(num_categories, 32)(static_input)
flattened_embedding = Flatten()(embedding_output)

# 合并动态和静态特征
merged_features = concatenate([lstm_output, flattened_embedding])

# 构建模型
output = Dense(1, activation='sigmoid')(merged_features)
model = Model(inputs=[dynamic_input, static_input], outputs=output)

# 编译和训练模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit([dynamic_data, encoded_static_data], labels, epochs=10, batch_size=32)

方法二:使用特征拼接或堆叠的方式将动态和静态特征合并

import numpy as np
from tensorflow.keras.layers import Input, LSTM, Dense, concatenate
from tensorflow.keras.models import Model

# 动态信息
dynamic_data = np.random.rand(100, 10, 1)  # (样本数, 时间步长, 动态特征维度)
# 静态信息
static_data = np.random.randint(0, 10, size=(100,))  # (样本数,)

# 定义动态特征输入
dynamic_input = Input(shape=(10, 1))
lstm_output = LSTM(64)(dynamic_input)

# 定义静态特征输入
static_input = Input(shape=(1,))  # 根据静态特征维度调整shape
dense_output = Dense(32, activation='relu')(static_input)

# 合并动态和静态特征
merged_features = concatenate([lstm_output, dense_output])

# 构建模型
output = Dense(1, activation='sigmoid')(merged_features)
model = Model(inputs=[dynamic_input, static_input], outputs=output)

# 编译和训练模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit([dynamic_data, static_data], labels, epochs=10, batch_size=32)

方法三:使用多个独立的模型分别处理动态和静态特征,并将它们的输出进行合并

``

import numpy as np
from tensorflow.keras.layers import Input, LSTM, Dense, concatenate
from tensorflow.keras.models import Model

# 动态信息
dynamic_data = np.random.rand(100, 10, 1)  # (样本数, 时间步长, 动态特征维度)
# 静态信息
static_data = np.random.randint(0, 10, size=(100,))  # (样本数,)

# 定义动态特征模型
dynamic_input = Input(shape=(10, 1))
lstm_output = LSTM(64)(dynamic_input)
dynamic_model = Model(inputs=dynamic_input, outputs=lstm_output)

# 定义静态特征模型
static_input = Input(shape=(1,))  # 根据静态特征维度调整shape
dense_output = Dense(32, activation='relu')(static_input)
static_model = Model(inputs=static_input, outputs=dense_output)

# 将动态和静态特征模型输出进行合并
merged_features = concatenate([dynamic_model.output, static_model.output])

# 构建模型
output = Dense(1, activation='sigmoid')(merged_features)
model = Model(inputs=[dynamic_model.input, static_model.input], outputs=output)

# 编译和训练模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.fit([dynamic_data, static_data], labels, epochs=10, batch_size=32)

上述代码示例了三种方法来将动态和静态特征结合输入到模型中进行训练。根据您的数据和需求,选择适合的方法,并根据需要调整模型架构和参数。

有什么好的模型可以做高精度的时间序列预测呢?

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
睡眠状态监测是一项重要的健康监测任务,可以帮助人们了解自己的睡眠质量以及发现睡眠障碍。为了提高睡眠状态监测的准确性和效果,可以使用改进的支持向量机(SVM)模型时间序列特征提取方法。 首先,改进的SVM模型可以通过优化算法来改善现有的SVM分类器。传统的SVM模型使用线性核函数,而改进的SVM模型可以采用非线性核函数,如高斯径向基函数(RBF)。这样可以更好地处理非线性关系,提高分类器的性能。此外,还可以通过调节C值和gamma值等参数来进一步优化模型,以获得更好的睡眠状态监测结果。 其次,时间序列特征提取是指从睡眠信号中提取相关特征,用于睡眠状态分类。常用的时间序列特征包括统计特征(如平均值、标准差、峰值等)、频域特征(如功率谱密度、频谱峰值等)和时域特征(如自相关系数、互相关系数等)。可以通过对原始睡眠信号进行滤波、降采样等预处理操作,再结合相关的特征提取方法,将睡眠信号转化为可用于监测的特征向量。 基于改进的SVM模型时间序列特征提取方法,可以构建一个睡眠状态监测系统。该系统的工作流程如下:首先,从睡眠信号中提取特征向量;然后,将特征向量输入到改进的SVM模型中进行分类;最后,根据分类结果判断睡眠状态,如清醒、浅睡眠、深睡眠等。 该方法的优点在于,改进的SVM模型时间序列特征提取可以更准确地捕捉睡眠信号的特征,提高分类器的性能。此外,该方法还可以处理多种类型的睡眠信号数据,可以适应不同个体和不同环境的睡眠状态监测需求。 总之,基于改进的SVM模型时间序列特征提取的睡眠状态监测能够提高准确性和效果,可应用于医疗、运动、智能家居等领域,为人们的睡眠健康提供有效的监测和反馈。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值