我正在训练一个神经网络。神经网络有三个输入——两个用于时间序列(LSTM 层)和一个纯数字(完全连接的密集层)。通过 .summary() 的神经网络结构:
问题是这样的。目前,在数据准备过程中,我通过 MinMaxScaler(每个输入参数单独)在 0 到 1 的范围内缩放数据。因此,我从两个数组中得到一个输入,长度为 [0; 1] 范围内的 50 个数字和同一范围内的一个数字(即输入的维度为 (n, 50, 1); (n, 50 , 1) ;(n, 1))。必须说,神经元不仅在学习过程中收敛并显示出足够的结果,而且在根据其他数据进行测试时也显示出足够的结果。也就是说,从功能上看,一切似乎都是正确的。
现在的问题: 在准备数据集时,我一次获取大量数据(有条件地,10,000 次测量)并一次缩放整个系列:
data_close = scaler_close.fit_transform(gazp.filter(['close'])[100:])
data_proffit = scaler_proffit.fit_transform(gazp.filter(['proffit'])[100:])
data_rsi = scaler_rsi.fit_transform(rsi.values[100:].reshape(-1,1 ))
data_macd = scaler_macd.fit_transform(macdhist.values[100:].reshape(-1,1 ))
len(data_macd), len(data_close)
事实是,神经网络本身是在具有 50 个样本窗口的样本上训练的,也就是说,用于预测(如果我理解正确的话)——它只需要 50 个样本。此外,神经网络必须动态处理新数据,但如果你先将数据集分成 50 个样本,然后应用缩放器,那么神经网络就会停止工作并发出废话。因此,我有一个问题——如果神经网络必须根据传入的数据预测动态结果,那么在这种情况下,将值缩放到所需范围的正确方法是什么?
如果缩放器不是一次应用,而是应用于部分数据,则需要将其划分
fit_transform为单独的阶段。理想情况下fit,您需要对所有数据执行此操作,然后您可以transform对其中的任何部分执行任意多次。如果不可能fit对所有数据执行此操作,请对当前可用的数据执行此操作。最重要的是固定规模。如果您每次都这样做fit_transform,那么您每次都更改转换比例,那么输出当然是无稽之谈。依此类推,分别针对您的每个特征缩放器。
现在是幻灯片。我采用了数据一直均匀增长的退化情况。
fit有了真实数据,有了一条数据,画面会更好,[0,1]在这种情况下,规模很可能会更接近。但在任何情况下,规模并不完全适合[0,1]神经网络的事实通常应该可以应付。但是,如果数据被破坏,那么它的结果就根本无法预料。但这里的主要问题是,
fit_transform对于每一个单独的数据,这些数据在值方面的匹配度会很差,这就是我想要展示的。幻灯片代码:
更多正弦波图片。
可以看出,使用部分
fit比例,[0,1]结果却是[-1,1],但图形被保留了。并且fit_transform每次正弦明显恶化。