通常,当使用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 )
然后进行拆分?
答案 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)