标准化期间屏蔽 0 值

Leo*_*Leo 6 python machine-learning scikit-learn

我正在对数据集进行标准化,但由于填充,数据包含很多 0。

我可以在模型训练期间屏蔽它们,但显然,当我应用归一化时,这些零会受到影响。

from sklearn.preprocessing import StandardScaler,MinMaxScaler

我目前正在使用 Sklearn 库进行规范化

例如,给定一个维度为 (4,3,5) 的 3D 数组为 (batch, step, features)

零填充的数量因批次而异,因为这些是我从音频文件中提取的特征,这些文件具有不同的长度,使用固定的窗口大小。

[[[0 0 0 0 0],
  [0 0 0 0 0],
  [0 0 0 0 0]]

 [[1 2 3 4 5],
  [4 5 6 7 8],
  [9 10 11 12 13]],

 [[14 15 16 17 18],
  [0 0 0 0 0],
  [24 25 26 27 28]],

 [[0 0 0 0 0],
  [423 2 230 60 70],
  [0 0 0 0 0]]
]
Run Code Online (Sandbox Code Playgroud)

我希望按列执行标准化

scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train.reshape(-1,X_train.shape[-1])).reshape(X_train.shape)
X_test = scaler.transform(X_test.reshape(-1,X_test.shape[-1])).reshape(X_test.shape)
Run Code Online (Sandbox Code Playgroud)

但是,在这种情况下,零被视为有效值。例如,第一列的最小值应该是 1 而不是 0。

此外,应用缩放器后 0 的值也会更改,但我希望将它们保留为 0,以便我可以在训练期间屏蔽它们。 model.add(tf.keras.layers.Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))

有没有什么方法可以在标准化过程中屏蔽它们,以便在标准化中仅使用本示例中的第 2 步和第 3 步?

另外,我项目的数组的实际维度在68个特征中比(2000,50,68)大,68个特征的值差异可能非常大。我试图通过将每个元素除以它们行中最大的元素来规范化它们,以避免来自 0 的影响,但这并不奏效。


Art*_*oul 3

MinMaxScaler()屏蔽的任务可以通过下一个代码来解决。

其他每个操作都需要单独的处理方式,如果您提到所有需要屏蔽的操作,那么我们可以一一解决它们,我将扩展我的答案。例如,如您所提到的,keras 层可以通过tf.keras.layers.Masking()层进行屏蔽。

接下来的代码仅最小/最大缩放非零特征,其余的保持为零。

import numpy as np
from sklearn.preprocessing import MinMaxScaler

X = np.array([
     [[0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0],
      [0, 0, 0, 0, 0]],

     [[1,  2,  3,  4,  5],
      [4,  5,  6,  7,  8],
      [9, 10, 11, 12, 13]],

     [[14, 15, 16, 17, 18],
      [0, 0, 0, 0, 0],
      [24, 25, 26, 27, 28]],

     [[0, 0, 0, 0, 0],
      [423, 2, 230, 60, 70],
      [0, 0, 0, 0, 0]]
], dtype = np.float64)

nz = np.any(X, -1)
X[nz] = MinMaxScaler().fit_transform(X[nz])

print(X)
Run Code Online (Sandbox Code Playgroud)

输出:

[[[0.         0.         0.         0.         0.        ]
  [0.         0.         0.         0.         0.        ]
  [0.         0.         0.         0.         0.        ]]

 [[0.         0.         0.         0.         0.        ]
  [0.007109   0.13043478 0.01321586 0.05357143 0.04615385]
  [0.01895735 0.34782609 0.03524229 0.14285714 0.12307692]]

 [[0.03080569 0.56521739 0.05726872 0.23214286 0.2       ]
  [0.         0.         0.         0.         0.        ]
  [0.05450237 1.         0.10132159 0.41071429 0.35384615]]

 [[0.         0.         0.         0.         0.        ]
  [1.         0.         1.         1.         1.        ]
  [0.         0.         0.         0.         0.        ]]]
Run Code Online (Sandbox Code Playgroud)

如果您需要MinMaxScaler()在一个数据集上进行训练并稍后将其应用于其他数据集,那么您可以执行下一步操作:

scaler = MinMaxScaler().fit(X[np.any(X, -1)])
X[np.any(X, -1)] = scaler.transform(X[np.any(X, -1)])
Y[np.any(Y, -1)] = scaler.transform(Y[np.any(Y, -1)])
Run Code Online (Sandbox Code Playgroud)