我正在尝试在 keras 中训练具有两个密集层的 MLP 模型,以对大约 100 个单变量时间序列的小数据集进行预测。该模型应获取 6 天的值并预测第 7 天的值。作为模型的输入,我首先将这些时间序列在数据框中相互连接,如下所示:
ts1 val1
ts1 val2
...
ts1 varN
ts2 val1
ts2 val2
...
ts3 varN
ts3 val1
ts3 val2
...
ts3 varN
...
ts100 val1
ts100 val2
...
ts100 varN
我想知道扩展这些数据的最佳方法是什么?首先,我应该独立缩放每个时间序列(ts_n),这样最终会有 100 个缩放器吗?或者我应该更好地将它们全部缩放到一起(最后一个缩放器),这样我就不会失去它们之间的相关性?或者既然所有这些时间序列都被认为是相同的特征,那么相关性就没有意义了?!
我的第二个问题是我应该选择哪种缩放方法? min-max 还是 StandardScaler(来自 sklearn)?有些时间序列的表现与其他时间序列完全不同,并且它们的值也有很大差异。如果我使用最小-最大缩放器,它会忽略这些差异,对吗?那么使用 StandardScaler(希望)考虑每个时间序列之间的分数差异不是更好吗?
附注我应该提到的是,缩放完成“之后”,我将创建时间步并将得到如下所示的最终结果:
timestep1 | timestep2 | timestep3 | timestep4 | timestep5 | timestep6 | timestep7
ts1 var1 | var2 | var3 | var4 | var5 | var6 | var7
ts1 var2 | var3 | var4 | var5 | var6 | var7 | var8
ts1 var3 | var4 | var5 | var6 | var7 | var8 | var9
...
ts2 var1 | var2 | var3 | var4 | var5 | var6 | var7
ts2 var2 | var3 | var4 | var5 | var6 | var7 | var8
ts2 var3 | var4 | var5 | var6 | var7 | var8 | var9
...
ts100 var1 | var2 | var3 | var4 | var5 | var6 | var7
ts100 var2 | var3 | var4 | var5 | var6 | var7 | var8
ts100 var3 | var4 | var5 | var6 | var7 | var8 | var9
...
总的来说,我发现 MinMaxScaler 和 StandardScaler 之间的性能差异很小。当然,由于(看起来)您还将缩放目标变量,因此您应该确保使用与输出激活函数一致的缩放器。例如,如果您的输出激活函数是 ReLU,您将无法预测任何负值。在这种情况下,我会倾向于 MinMaxScaler,因为所有目标都将位于区间 [0,1] 内。
至于时间序列是一起缩放还是单独缩放,可能取决于具体设置。如果尺度往往具有不同的时间相关行为,则最好将它们一起缩放以保留差异。如果它们都具有相似的行为模式,那么单独缩放它们可能会效果最好。
还值得考虑其他网络架构进行时间序列预测,例如RNN。
您需要注意 MinMax Scale,因为在实际情况下,您的预测数据可能具有不同的尺度,换句话说,它们可能大于训练集中的最高值。
我认为在这种情况下标准比例是最好的,因为我们将平均值=0(或定义的数字)和std=0或1。
您也可以尝试的另一件事是使网络的第一层和最后一层都无需激活。或者如果不使用负值,则使用 relu。
根据我的经验,我相信这取决于你的功能如何分布。尝试绘制所有特征的统计分布,并尝试了解其中大多数特征是否呈正态分布。如果是,那么使用标准缩放器将使模型受益,但是,如果您注意到您的特征不倾向于遵循正态分布(或接近正态分布),那么也许最好使用 MinMax 缩放器。这是因为,如果您的特征不是正态分布并且您使用标准缩放器,那么您将强制将正态分布放入非正态分布的数据集中,因此可能会导致严重的过度拟合和对未见数据的性能不佳。