sklearn.preprocessing.normalize
仅支持二维数组的标准化。然而,我目前有一个用于LSTM模型训练的三维数组(批次、步长、特征),我想对特征进行标准化。
我尝试过 tf.keras.utils.normalize(X_train, axis=-1, order=2 )
但结果不正确。
另一种方法是将三维数组折叠成二维数组
print(X_train.shape)print(max(X_train[0][0]))
输出
(1883, 100, 68)6.028588763956215
scaler = StandardScaler()X_train = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)).reshape(X_train.shape)X_test = scaler.transform(X_test.reshape(X_test.shape[0], -1)).reshape(X_test.shape)print(X_train.shape)print(max(X_train[0][0]))print(min(X_train[0][0]))
输出
(1883, 100, 68)3.2232538993444533-1.9056918449890343
数值仍然不在1和-1之间。
我应该如何处理这个问题?
回答:
如评论中所建议,我提供了答案
你可以使用 sklearn
的预处理方法来缩放三维数组。你只需将其转换为二维数据进行拟合,然后再转换回三维。这可以通过几行代码轻松完成。
如果你希望缩放后的数据在范围(-1,1)内,你可以简单地使用 MinMaxScaler
,并指定 feature_range=(-1,1)
X_train = np.random.uniform(-20,100, (1883, 100, 68))X_test = np.random.uniform(-20,100, (100, 100, 68))print(X_train.shape)print(X_train.min().round(5), X_train.max().round(5)) # -20, 100scaler = MinMaxScaler(feature_range=(-1,1))X_train = scaler.fit_transform(X_train.reshape(X_train.shape[0], -1)).reshape(X_train.shape)X_test = scaler.transform(X_test.reshape(X_test.shape[0], -1)).reshape(X_test.shape)print(X_train.shape)print(X_train.min().round(5), X_train.max().round(5)) # -1, 1