StandardScaler 无法正确缩放

Posted

技术标签:

【中文标题】StandardScaler 无法正确缩放【英文标题】:StandardScaler Doesn't Scale Properly 【发布时间】:2018-06-22 13:00:24 【问题描述】:

我正在尝试使用 StandardScaler 来缩放神经网络的特征。

假设神经网络具有以下特征:

1.0  2.0   3.0
4.0  5.0   6.0
4.0  11.0  12.0
etc ...

当我将 StandardScaler 应用于整个事物(所有行)时,第一行得到以下结果:

['-0.920854068785', '-0.88080603151', '-0.571888559111']

当我尝试仅将 StandardScaler 应用于第一行(仅由第一行组成的矩阵)时,我得到完全不同的结果。

['0.0', '0.0', '0.0']

显然神经网络不会以这种方式工作,因为行不一样。有什么方法可以以某种方式使用标准调用程序,以便我每次都得到相同的结果,对于相同的输入(行)?

这是代码和输出:

from sklearn.preprocessing import StandardScaler
import numpy as np
sc = StandardScaler()

#defining the (big) matrix
AR = np.array([[1.0,2.0,3.0],[4.0,5.0,6.0],[4.0,11.0,12.0],[42.0,131.0,1121.0],[41.0,111.0,121.0]])
AR = sc.fit_transform(AR)
print "fited data from big array:"
m=0
for row in AR: 
    m = m + 1
    if m==1:print [str(m) for m in row]

#defining the (small) matrix
AR1 = np.array([[1.0,2.0,3.0]])
AR1 = sc.fit_transform(AR1)
print "fited data from small array"
for row in AR1: 
     print [str(m) for m in row]

输出是:

fited data from big array:
['-0.920854068785', '-0.88080603151', '-0.571888559111']
fited data from small array
['0.0', '0.0', '0.0']

【问题讨论】:

从docs,fit_transform 的输入是[n_samples, n_features]。它在列上缩放。每列只有一个值,因此你得到 0。 是的,每一列只有一个值。但结果必须相同。否则神经网络的输入就不一样了。 但结果不可能相同,因为您要适应不同的数据。也许你打算打电话给fit_transform(AR)transform(AR1) 感谢 transform/fit_transform 我错误地将它与 labelencoder 以及 onohotencoder 一起使用。 很高兴为您提供帮助。请考虑将下面赞成的答案标记为正确,因为它本质上说的是同一件事。 【参考方案1】:

StandardScaler 会将数据移动 mean 并按 std 缩放,因为您只传递一行给它,每列的意思是值本身和值将被移至零。查看更多here。

>>> sc = StandardScaler()
>>> arr = np.array([[1.0,2.0,3.0]])
>>> sc.fit(arr)

>>> sc.mean_, sc.scale_
array([ 1.,  2.,  3.]), array([ 1.,  1.,  1.]))

在您的情况下,您应该 fit 对所有数据进行缩放,对于每一行,您可以使用 transform 来获得结果。

sc.fit(data) # this will compute mean and std on all rows
scaled_row = sc.transform(row) # apply shift to a single row 

【讨论】:

【参考方案2】:

与 StandardScaler 一样,所有估算器都具有可以访问的类变量并且可以打印值。 如果是StandardScaler,因为您想打印平均值,您应该执行以下操作:

scaler = StandardScaler() scaler.fit(my_input_array) print scaler.mean_ # to get the mean for every column print scaler.var_ # to get the variance for every column

您可以在doc 中找到所有此类变量的列表

注意:StandardScaler 的目的是使您的平均值 0 并对其进行缩放,而 NOT 是为了找到平均值或方差。

这样做是为了让您的输入成为其他功能/算法可以工作的理想输入,并且您可以获得更好的准确性。

【讨论】:

以上是关于StandardScaler 无法正确缩放的主要内容,如果未能解决你的问题,请参考以下文章

机器学习特征工程之特征缩放+无量纲化:数据标准化(StandardScaler)

在 3D 数据上使用 Standardscaler

带有管道和 GridSearchCV 的 StandardScaler

lin_reg.coef_ 函数在使用 StandardScaler 缩放训练数据时返回过高的系数

如何仅在某些值上在管道内使用 StandardScaler?

如何在列子集上实现 PySpark StandardScaler?