machine-learning - 在 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 )
然后做分裂?
解决方案
正如您所展示的,标准化过程是每个机器学习问题的唯一正确方法,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)
推荐阅读
- html - 如何使用这个 CSS Grid 自动填充实验来停止换行
- python - ValueError:只有一个元素张量可以转换为 Python 标量
- android-studio - 编写函数时显示提示
- python - 如何获取 tab_id 将其设置为活动选项卡
- swiftui - SwiftUI 中具有不同列的侧边栏
- android - 如何将时钟显示系统从 24 小时更改为 12 小时 android
- rxjs - Rxjs array of object distinct with clause
- ios - Animate UIView transform happens instantly instead of over duration value
- java - Is there anyway to limit the number of QueryParam?
- python - Running pgadmin throw an unexpected error