如何标准化 3D 数组的特定维度

Leo*_*Leo 3 numpy machine-learning scikit-learn keras

sklearn.preprocessing.normalize仅支持二维数组标准化。然而,我目前有一个用于 LSTM 模型训练的 3D 数组(批量、步骤、特征),我希望对特征进行标准化。

我已经尝试过tf.keras.utils.normalize(X_train, axis=-1, order=2 ) 但它不正确。

另一种方法是将 3D 数组折叠成 2D 数组

print(X_train.shape)
print(max(X_train[0][0]))
Run Code Online (Sandbox Code Playgroud)

输出

(1883, 100, 68)
6.028588763956215
Run Code Online (Sandbox Code Playgroud)
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]))
Run Code Online (Sandbox Code Playgroud)

输出

(1883, 100, 68)
3.2232538993444533
-1.9056918449890343
Run Code Online (Sandbox Code Playgroud)

该值仍然不在 1 和 -1 之间。

我应该如何处理它?

Mar*_*ani 6

根据评论中的建议,我提供了答案

您可以使用预处理方法缩放 3D 数组sklearn。您只需重新转换为 2D 数据以适合它们,然后再反转回 3D。只需几行代码即可轻松完成此操作。

如果您希望缩放后的数据在 (-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, 100

scaler = 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
Run Code Online (Sandbox Code Playgroud)