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

3

我对时间序列还不太熟悉。
这是我正在处理的数据集:

           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,但我不知道如何处理位置这个分类特征:我是应该使用独热编码还是分组聚合? 我想要预测的是基于位置的价格。
我该怎么做? 特别赞赏Python解决方案。

先行致谢。


@SalvatoreDanieleBianco,分割怎么办? 我认为我不能使用经典的70-30对吧? - Salvatore Danilo Palumbo
对于每个地区,我都有从2012年至今(不包括五月)的月份数据,类似于:<br> 2020-01-01 - 价格 - 西西里 <br> 2020-02-01 - 价格 - 西西里等等。 - Salvatore Danilo Palumbo
1
好的,明白了。在这种情况下,我的建议是将不同地区的价格视为不同的特征,以获得形状为(T, 20)的数据集,其中T是时间数据的数量,20是地区的数量。对于训练测试拆分,您可以使用80-20,其中测试20%是时间序列的最后一部分。 - Salvatore Daniele Bianco
1
@SalvatoreDanieleBianco,你能帮我吗?从你的名字来看,我猜你也是意大利人吧 ;) - Salvatore Danilo Palumbo
让我们在聊天中继续这个讨论 - Salvatore Danilo Palumbo
显示剩余3条评论
1个回答

1
假设我的数据集(`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

在我的情况下,每个月我都有三个地区(坎帕尼亚,伦巴第和西西里)的价格记录。我的想法是将不同的地区视为不同的特征,因此我会将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),如此示例中所示,或者传递给多通道 1D-CNN(选择合适的核大小)。两种情况下唯一的问题可能是数据集的规模较小,因此请尽量不要过度参数化模型(例如减少神经元和层数),否则过拟合将是不可避免的。关于这一点,您可以在时间序列的最后 20% 上测试模型:
from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, shuffle=False, test_size=.2)

最后一步是为监督学习构建匹配的 (X, Y),但这取决于你使用的模型和预测任务。 这里有另一个例子

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接