具有单一分类特征的 LSTM 预测

LSTM forecasting with single categorical feature

我对时间序列还很陌生。
这是我正在处理的数据集:

           Date   Price               Location
0    2012-01-01  1771.0                 Marche
1    2012-01-01  1039.0               Calabria
2    2012-01-01  2193.0               Campania
3    2012-01-01  2015.0         Emilia-Romagna
4    2012-01-01  1483.0  Friuli-Venezia Giulia
...         ...     ...                    ...
2475 2022-04-01  1963.0                  Lazio
2476 2022-04-01  1362.0  Friuli-Venezia Giulia
2477 2022-04-01  1674.0         Emilia-Romagna
2478 2022-04-01  1388.0                 Marche
2479 2022-04-01  1103.0                Abruzzo

我正在尝试构建用于价格预测的 LSTM,但我不知道如何管理 Location 分类特征:我是否必须使用 one-hot 编码还是群友? 我想预测的是基于位置的价格。
我怎样才能做到这一点? Python 解决方案特别受欢迎。

提前致谢。

假设我的数据集 (df) 与您的类似:

          Date       Price  Location
0   2021-01-01  791.076890  Campania
1   2021-01-01  705.702464  Lombardia
2   2021-01-01  719.991382  Sicilia
3   2021-02-01  825.760917  Lombardia
4   2021-02-01  747.734309  Sicilia
...        ...         ...        ...
31  2021-11-01  886.874348  Lombardia
32  2021-11-01  935.040583  Campania
33  2021-12-01  771.165378  Sicilia
34  2021-12-01  952.255227  Campania
35  2021-12-01  939.754515  Lombardia

就我而言,我每个月都有 3 个地区(坎帕尼亚、伦巴第、西西里)的 Price 记录。我的想法是将不同的区域视为不同的特征,所以我将 df 转换为:

df = df.set_index(["Date", "Location"]).Price.unstack()

现在我的数据集是这样的:

Location    Campania    Lombardia   Sicilia
Date            
2021-01-01  791.076890  705.702464  719.991382
2021-02-01  758.872755  825.760917  747.734309
2021-03-01  880.038005  803.165998  837.738419
       ...         ...         ...         ...
2021-10-01  908.402345  805.081193  792.369610
2021-11-01  935.040583  886.874348  736.862025
2021-12-01  952.255227  939.754515  771.165378

在此之后,请确保没有 NaN 个值 (df.isna().sum())。

现在您可以将此数据传递给多特征 RNN(或 LSTM),如 this example 中所述,或传递给 multi-channel 1D-CNN(选择合适的内核大小)。两种情况下唯一的问题可能是数据集的尺寸太小,所以尽量不要 over-parameterize 模型(例如减少神经元和层数),否则 over-fitting 将是不可避免的。关于这一点,您可以在 time-series:

的最后 20% 上测试模型
from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, shuffle=False, test_size=.2)

最后一部分是为监督学习建立匹配(X, Y),但这取决于你使用的是什么模型以及你的预测任务是什么。 Another example here.