我在尝试一些关于循环神经网络的演示。
我注意到每列数据的尺度差异很大。因此,我考虑在将数据批次输入到RNN之前进行一些预处理工作。收盘价这一列是我未来想要预测的目标。
open high low volume price_change p_change ma5 ma10 \0 20.64 20.64 20.37 163623.62 -0.08 -0.39 20.772 20.7211 20.92 20.92 20.60 218505.95 -0.30 -1.43 20.780 20.7182 21.00 21.15 20.72 269101.41 -0.08 -0.38 20.812 20.7553 20.70 21.57 20.70 645855.38 0.32 1.55 20.782 20.7884 20.60 20.70 20.20 458860.16 0.10 0.48 20.694 20.806 ma20 v_ma5 v_ma10 v_ma20 close0 20.954 351189.30 388345.91 394078.37 20.561 20.990 373384.46 403747.59 411728.38 20.642 21.022 392464.55 405000.55 426124.42 20.943 21.054 445386.85 403945.59 473166.37 21.024 21.038 486615.13 378825.52 461835.35 20.70
我的问题是,在我的情况下,是否有必要使用sklearn中的StandardScaler对数据进行预处理?为什么?
(欢迎编辑我的问题)
回答:
对你的训练数据进行归一化是有益的。如果输入模型的不同特征具有非常不同的尺度,会导致网络对这些特征的权重分配不均。这可能会导致在表示中错误地优先考虑某些特征而不是其他特征。
尽管关于数据预处理的讨论存在争议,无论是何时真正需要以及如何为每个给定的模型和应用领域正确地归一化数据,但机器学习界普遍认为,执行均值减法以及一般的归一化预处理步骤是有帮助的。
在均值减法的情况下,每个特征的均值从数据中减去,这可以从几何角度解释为将数据中心化到原点。对于任何维度,这都是成立的。
在均值减法步骤之后对数据进行归一化,会使数据的维度归一化到大致相同的尺度。请注意,正如上面提到的,经过这一步骤,不同的特征将不再具有相互之间的优先级。如果你有充分的理由认为你的特征中的不同尺度承载了网络可能需要理解数据集中潜在模式的重要信息,那么归一化可能会有害。标准做法是将输入缩放到均值为0和方差为1。
在特定情况下,进一步的预处理操作可能有帮助,例如对数据进行主成分分析(PCA)或白化。请参考CS231n(设置数据和模型)的优秀笔记,以获取有关这些主题的进一步参考以及上述主题的更详细解释。