StandardScaler无法正确缩放

时间:2018-01-13 04:17:07

标签: python pandas scikit-learn theano sklearn-pandas

我正在尝试使用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']

2 个答案:

答案 0 :(得分:4)

instance.attribute会将数据移动平均值并按标准进行缩放,因为您只将一行传递给它,每个列的意思是值本身和价值将转移到零。查看更多here

Uncaught RangeError: Maximum call stack size exceeded
  at objectName.get [as attribute] (file.js:6)

line 6: get: function() { return this.geoData },

在您的情况下,您应该StandardScaler缩放器到所有数据,并且对于每一行,您可以使用>>> 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

答案 1 :(得分:0)

与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 来查找均值或方差。

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