首页 > 解决方案 > 在 LSTM 中,应该在训练集和测试集分割之前还是之后进行归一化?

问题描述

通常,在使用 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 )

然后做分裂?

标签: machine-learningneural-networklstmnormalizationrecurrent-neural-network

解决方案


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

当涉及到类似的困境时,有一个通用的经验法则可以用来澄清混淆:

在整个模型构建过程(包括所有必要的预处理)中,在使用此测试集评估模型性能之前,假设您根本无法访问任何测试集。

换句话说,假设您的测试集仅部署您的模型之后才出现,并且它开始接收全新且在此之前看不见的数据。

所以从概念上讲,将第一个代码片段的第三行移到最后可能会有所帮助,即:

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)

推荐阅读