StandardScaler 无法正确缩放
StandardScaler Doesn't Scale Properly
我正在尝试使用 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']
显然神经网络不会这样工作,因为行不一样。有什么方法可以在某种程度上使用 Standard scaller,以便每次针对相同的输入(行)得到相同的结果?
这是代码和输出:
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']
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
与 StandardScaler 一样,所有估算器都有 class 可以访问的变量,并且可以打印值。
在 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
并对其进行缩放,不是 来求均值或方差。
这样做是为了让您的输入成为其他 functions/algorithms 可以工作的理想输入,并且您可以获得更好的准确性。
我正在尝试使用 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']
显然神经网络不会这样工作,因为行不一样。有什么方法可以在某种程度上使用 Standard scaller,以便每次针对相同的输入(行)得到相同的结果?
这是代码和输出:
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']
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
与 StandardScaler 一样,所有估算器都有 class 可以访问的变量,并且可以打印值。
在 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
并对其进行缩放,不是 来求均值或方差。
这样做是为了让您的输入成为其他 functions/algorithms 可以工作的理想输入,并且您可以获得更好的准确性。