如何在Keras中实现含额外特征拼接的LSTM多变量时序预测模型
在Keras中实现带额外特征拼接的LSTM时间序列预测模型
Sequential模型仅支持单输入单输出的线性结构,你的需求需要多分支输入(时序特征分支+额外特征分支),因此必须使用Keras函数式API来构建自定义模型,以下是具体实现方案:
核心思路
- 拆分输入:将数据集分为两部分
- 时序特征输入:包含X1-X5和y的6个序列特征,形状为
(样本数, 时间步长n_input, 6) - 额外特征输入:包含mean、std、var、median、volume的静态特征,形状为
(样本数, 5)(无时间维度)
- 时序特征输入:包含X1-X5和y的6个序列特征,形状为
- 构建LSTM分支:处理时序输入提取时序特征
- 特征拼接:根据需求在全连接层前后拼接LSTM输出与额外特征
- 组合模型:定义多输入与最终输出,完成模型构建
完整代码实现(全连接层前拼接)
from keras.models import Model from keras.layers import Input, LSTM, Dense, Concatenate # 定义参数:n_input为时间步长,n_seq_features为时序特征数,n_extra_features为额外特征数 n_input = 30 n_seq_features = 6 n_extra_features = 5 # 定义两个输入分支 seq_input = Input(shape=(n_input, n_seq_features), name='sequence_input') extra_input = Input(shape=(n_extra_features,), name='extra_features_input') # LSTM分支处理时序数据 lstm_out = LSTM(100, activation='relu')(seq_input) # 拼接LSTM输出与额外特征(此处为全连接层前拼接) concat_out = Concatenate()([lstm_out, extra_input]) # 全连接层与输出层 dense_out = Dense(64, activation='relu')(concat_out) final_out = Dense(1)(dense_out) # 定义并编译模型 model = Model(inputs=[seq_input, extra_input], outputs=final_out) model.compile(optimizer='adam', loss='mse') # 查看模型结构 model.summary()
训练时的数据输入方式
训练时需同时传入两个输入数据集:
# X_seq为时序特征数据,X_extra为额外特征数据,y为预测标签 model.fit([X_seq, X_extra], y, epochs=50, batch_size=32)
调整为全连接层后拼接
若需要在全连接层之后拼接额外特征,只需调整拼接顺序:
# LSTM分支 lstm_out = LSTM(100, activation='relu')(seq_input) # 先经过全连接层 dense1_out = Dense(64, activation='relu')(lstm_out) # 再拼接额外特征 concat_out = Concatenate()([dense1_out, extra_input]) # 最终输出层 final_out = Dense(1)(concat_out) model = Model(inputs=[seq_input, extra_input], outputs=final_out)
内容的提问来源于stack exchange,提问作者Ismaele Le Voci
相关产品推荐
相关产品推荐

