在LSTM中,应该在训练和测试集拆分之前或之后进行归一化吗?

时间:2020-04-17 05:02:08

标签: machine-learning neural-network lstm normalization recurrent-neural-network

通常,当使用NN时,我以这种形式进行标准化:

scaler = StandardScaler()
train_X = scaler.fit_transform( train_X )
test_X = scaler.transform( test_X )

也就是说,我在分割后进行归一化,以便从测试集到火车集没有泄漏。 但是我在使用LSTM时对此表示怀疑。

想象一下,我在LSTM中训练集中的最后一个序列是X = [x6,x7,x8],Y = [x9]。

然后,我在测试集中的第一个序列应为X = [x7,x8,x9],Y = [x10]。

那么,如果我最终在测试集的X中混合了来自两个集合的值,那么在分割后对数据进行归一化是否有意义? 还是应该先用

规范化整个数据集
scaler = StandardScaler()
data = scaler.fit_transform( data )

然后进行拆分?

1 个答案:

答案 0 :(得分:1)

您所展示的标准化过程是解决每个机器学习问题的唯一正确方法,而LSTM绝不是例外。

当遇到类似的困境时,有一个一般的经验法则可以用来澄清困惑:

在整个模型构建过程(包括所有必要的预处理)中,假装您根本无法访问任何测试集,然后才能使用该测试集评估模型性能。< / p>

换句话说,假设您的测试集仅在部署模型后 出现,并且它开始接收全新的数据,直到那时才可见。

因此,从概念上讲,将第一个代码段的第三行移到最后可能是有帮助的,即:

X_train, X_test, y_train, y_test = train_test_split(X, y)
### FORGET X_test from this point on...

X_train = scaler.fit_transform(X_train)

# further preprocessing, feature selection etc...

# model building & fitting...

model.fit(X_train, y_train)

# X_test just comes in:

X_test = scaler.transform(X_test)
model.predict(X_test)