如何在多变量LSTM销售预测中利用未来已知特征数据?
结合未来已知特征优化LSTM销售额预测方案
针对你已用150天数据构建多变量LSTM,但需加入明日已知特征(工作日=1、节假日=1、降雨)做预测的需求,可按以下步骤调整:
1. 重构训练样本结构
现有LSTM可能仅用历史时序数据(过去N天的特征+销售额)预测下一日销售额,现在需要把目标日的已知特征纳入训练输入,让模型学习“历史趋势+未来已知条件”与销售额的关联:
- 定义时序窗口大小(比如7天,可根据数据调整),每个训练样本包含:
- 过去N天的完整时序数据:
[[Weekday_t-N, Holiday_t-N, Weather_encoded_t-N, Sales_t-N], ..., [Weekday_t-1, Holiday_t-1, Weather_encoded_t-1, Sales_t-1]] - 目标日t的已知特征:
[Weekday_t, Holiday_t, Weather_encoded_t]
- 过去N天的完整时序数据:
- 将这两部分数据组合后作为模型输入,目标输出为
Sales_t
2. 预处理分类特征
数据中Weather是分类变量(Rainy/Sunny/Cloudy),需转为数值型:
- 独热编码(适合无顺序分类):
import pandas as pd df = pd.get_dummies(df, columns=['Weather'], drop_first=True) - 标签编码(适合有顺序分类,比如天气对销售额影响有强弱):
from sklearn.preprocessing import LabelEncoder le = LabelEncoder() df['Weather'] = le.fit_transform(df['Weather'])
注意:预测明日天气时,必须使用和训练时一致的编码规则转换(比如Rainy对应0,就用0输入)
3. 调整LSTM模型结构
采用双分支输入结构,分别处理时序数据和未来已知特征:
from keras.models import Model from keras.layers import LSTM, Dense, Input, Concatenate # 分支1:处理历史时序数据 timesteps = 7 # 过去7天的数据 n_features = 4 # 历史数据特征数:Weekday+Holiday+Weather_encoded+Sales seq_input = Input(shape=(timesteps, n_features)) lstm_out = LSTM(64, activation='relu')(seq_input) # 分支2:处理目标日的已知特征 future_features_input = Input(shape=(3,)) # Weekday+Holiday+Weather_encoded dense_future = Dense(32, activation='relu')(future_features_input) # 拼接两个分支的输出 combined = Concatenate()([lstm_out, dense_future]) final_out = Dense(1)(combined) # 构建并编译模型 model = Model(inputs=[seq_input, future_features_input], outputs=final_out) model.compile(optimizer='adam', loss='mse')
4. 明日预测的具体操作
当预测明日销售额时:
- 提取最近N天的历史数据(比如最近7天的Weekday、Holiday、编码后的Weather、Sales),整理成形状为
(1, timesteps, n_features)的时序输入 - 将明日的已知特征转换为数值型(比如Weekday=1, Holiday=1, Weather=Rainy编码后的值),整理成形状为
(1, 3)的特征输入 - 用模型预测:
# 假设seq_data是预处理后的最近7天时序数据,future_data是明日的特征数据 predicted_sales = model.predict([seq_data, future_data])
关键注意事项
- 训练时的特征预处理规则(编码、归一化)必须和预测时完全一致,比如如果训练时对Sales做了归一化,预测后要反归一化得到真实销售额
- 可尝试调整时序窗口大小、LSTM层神经元数量,优化模型预测效果
内容的提问来源于stack exchange,提问作者K.Doruk
相关产品推荐
相关产品推荐

