在 3D 数据上使用 Standardscaler

Posted

技术标签:

【中文标题】在 3D 数据上使用 Standardscaler【英文标题】:Using Standardscaler on 3D data 【发布时间】:2019-05-21 01:26:24 【问题描述】:

我正在尝试使用 scikit-learn 标准缩放器缩放具有多个特征和时间序列数据的数据集。目前我正在为每个功能创建一个单独的缩放器:

scale_feat1 = StandardScaler().fit(data[:,:,0])
scale_feat2 = StandardScaler().fit(data[:,:,1])
..

有没有办法使用一个缩放器单独缩放所有功能?另外,为所有特征保存缩放器并将其应用于验证数据集的最简单方法是什么?

编辑:Standardscaler 仅适用于 2D 数组,因此必须将数组展平以进行缩放。在 2D Standardscaler 中,为每个特征创建单独的均值和标准差

【问题讨论】:

***.com/a/59601298/10375049 【参考方案1】:

假设你的数据是整形[num_instances, num_time_steps, num_features] 我要做的是首先重塑数据,然后规范化数据。

import numpy as np
from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
num_instances, num_time_steps, num_features = train_data.shape
train_data = np.reshape(train_data, shape=(-1, num_features))
train_data = scaler.fit_transform(train_data)

这将以每个特征为一列的格式重塑数据,并将分别对每个特征进行规范化。之后,您可以在训练之前以相同的形状返回数据。

train_data = np.reshape(train_data, shape=(num_instances, num_time_steps, num_features))

在验证集上使用缩放器时,fit_transform 方法计算训练集上的 meanstd 并将它们存储在对象中。然后,当你想规范化验证集时,你可以这样做:

num_instances, num_time_steps, num_features = val_data.shape
val_data = np.reshape(val_data, shape=(-1, num_features))
val_data = scaler.transform(val_data)

然后将数据重塑为训练所需的形状。

val_data = np.reshape(val_data, shape=(num_instances, num_time_steps, num_features))

这应该对你有用。

更新:

根据@Medomatto 的评论,在后来的numpy 版本中,正确的重塑方法是:

... = np.reshape(data, newshape=(...))

【讨论】:

对于更新的 Numpy 版本,参数 shape= 不再使用,可能会导致错误。否则很好的答案。非常感谢你,你也帮了我很多。 谢谢,很高兴我能帮上忙,我更新了答案。【参考方案2】:

从你的做法来看,似乎可以直截了当

scale_feat = StandardScaler().fit(data[:,:,:])

将缩放应用到所有特征。

如果你想在前 5 个特征上应用缩放,你可以这样做

scale_feat = StandardScaler().fit(data[:,:,0:5])

【讨论】:

这会为每个功能使用单独的比例吗?例如,如果 feat1 描述了一个位置,而 feat2 描述了一个速度,它们会在不同的尺度上进行缩放吗? 这是您必须检查的内容。为此,只需将您的 scale_feat1scale_feat2 值与我发布的 scale_feat 值进行比较。 缩放器为每个时间步创建单独的均值和标准差,但不接受 3D 数组 因此我可能必须为所有时间步展平阵列,然后创建一个适合展平阵列的标准缩放器,然后转换展平阵列并将其重塑为 3D

以上是关于在 3D 数据上使用 Standardscaler的主要内容,如果未能解决你的问题,请参考以下文章

我可以在整个数据集上使用 StandardScaler(),还是应该分别在训练集和测试集上计算?

使用 sklearn StandardScaler 意外获得不同的标准化数据

如何在包含 numpy.ndarrays 的列/列的 pandas 数据帧上执行 StandardScaler?

窗口上的 Pyspark StandardScaler

SVM 分类器模型上的 StandardScaler 问题

在 Pandas 中使用 Keras StandardScaler 和 Groupby 函数