gpt4 book ai didi

python - 标准化期间屏蔽 0 值

转载 作者:行者123 更新时间:2023-12-03 14:37:31 32 4
gpt4 key购买 nike

我正在对数据集进行标准化,但由于填充,数据包含很多 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]]
]
我希望按列执行规范化
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)
但是,在这种情况下,零被视为有效值。例如,第一列的最小值应该是 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 步?
另外,我的项目数组的实际尺寸大于 (2000,50,68)
在 68 个特征中,68 个特征的值差异可能非常大。我试图通过将每个元素除以它们行中最大的元素来规范化它们,以避免来自 0 的影响,但这并不奏效。

最佳答案

刚刚的任务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)
输出:
[[[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. ]]]
如果您需要培训 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)])

关于python - 标准化期间屏蔽 0 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64567464/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com