将特征添加到时间序列预测模型输入的适当方法
Posted
技术标签:
【中文标题】将特征添加到时间序列预测模型输入的适当方法【英文标题】:An appropriate way of adding a feature to a time series forecasting model input 【发布时间】:2020-06-25 07:39:04 【问题描述】:我一直在研究需求预测模型。我正在使用 LSTM 模型来预测公司产品系列的未来需求。为了巩固和举例说明我的原始数据,一个例子如下;
未处理的数据
np.random.seed(1)
raw_data = pd.DataFrame("product_type": ["A"]*3 + ["B"]*3 + ["C"]*3, "product_family": ["x", "y", "z", "t", "u", "y", "p", "k", "l"])
for col in [str(x)+"-"+str(y) for x in range(2015, 2020) for y in range(1, 13)]:
raw_data[col] = np.random.randint(10, 50, 9)
raw_data.head()
product_type product_family 2015-1 ... 2019-10 2019-11 2019-12
0 A x 47 ... 15 39 38
1 A y 22 ... 37 28 29
2 A z 18 ... 41 41 37
3 B t 19 ... 32 44 29
4 B u 21 ... 22 29 25
[5 rows x 62 columns]
从上面可以看出,数据有两个名义特征,其余都是过去的需求数据。
首先,让我解释一下我的情况:
我首先选择要预测的product_family
,让product_family
成为"x"
:
prod_family_data = raw_data.loc[raw_data.product_family == "x", raw_data.columns[2:]].to_numpy()
然后我创建训练集的 x 和 y:
x_train, y_train = [], []
for i in range(0, len(prod_family_data) - 12):
x_train.append(prod_family_data[i: i + 12])
y_train.append(prod_family_data[i + 12])
x_train = np.array(x_train)
y_train = np.array(y_train)
array([[47, 11, 21, 32, 34, 14, 35, 49, 44, 42, 31, 18],
.
.
.
[14, 20, 45, 13, 48, 43, 45, 49, 49, 37, 15, 39]], dtype=object)
y_train
array([28, 38, 12, 12, 23, 29, 19, 23, 39, 38, 18, 40, 46, 48, 44, 27, 10,
24, 25, 22, 15, 28, 44, 46, 22, 12, 45, 47, 38, 21, 46, 26, 12, 21,
18, 14, 20, 45, 13, 48, 43, 45, 49, 49, 37, 15, 39, 38])
x_train = x_train.reshape(x_train.shape[0], x_train.shape[1], 1)
x_train.shape
(48, 12, 1)
y_train.shape
(48,)
然后我用 LSTM 模型预测product_family
的需求,然后我回到开始,选择另一个product_family
,冲洗并重复。
我想知道是否有一种方法可以将 product_family
特征添加到模型的输入(将来也可能是 product_type 和其他产品的标称质量),并将其全部提供给模型一次?
另外,有没有办法将带有时间戳的需求数据绑定到输入,以便模型能够捕捉数据的趋势或季节性/
【问题讨论】:
您必须对数据进行去趋势处理,排除通货膨胀等影响,否则您的模型将始终低于或超出。就季节性而言,您可以添加上周、月、季度、年、2 年的平均值,看看什么对您的数据最有帮助。 【参考方案1】:我首先建议您重新考虑数据集的形状。输入到 LSTM 网络的经典时间序列数据集“X”将具有 3D 形状:
X.shape[0]
:时间序列数(用于训练/测试)
X.shape[1]
: 时间序列中的时间步数
X.shape[2]
: 每个时间序列的特征数
在您的示例中,假设每个唯一对(product_type、product_familly)只有一个时间序列,按产品系列“x”对时间序列进行分组应转换为:
X.shape[0]
: product_type 的数量,包括“x”product_familly
X.shape[1]
: "x" product_familly 销售量中的时间步数
X.shape[2]
: 1,因为你唯一的特征似乎是卖出金额
您可以直接在数据集的第三维 (X.shape[2]
) 中添加 product_type 或 product_familly。
即使信息在时间步长中永远不会改变,它也会在学习阶段被考虑,并可以用于预测。这样做是个好主意吗?我不确定。
现在,要考虑谢尔盖·布什马诺夫的评论。在此类任务中去除数据趋势是一个很好的步骤,您可以查看像 STL 这样的算法来为您做这件事。
如果您还没有这样做,我建议您做的是查看像 ARMA 这样的模型,它可以在其建模中包含 seasonal component,并且是针对预测情况量身定制的像你这样的单变量时间序列。
【讨论】:
我将尝试实施您建议的解决方案。我可能会在以后再次更新问题或评论以获取进一步的意见。感谢您的详尽解释和建议,非常感谢。以上是关于将特征添加到时间序列预测模型输入的适当方法的主要内容,如果未能解决你的问题,请参考以下文章