StandardScaler не масштабируется должным образом

Я пытаюсь использовать 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']

person Brana    schedule 13.01.2018    source источник
comment
Из документов входными данными для fit_transform являются [n_samples, n_features] . Это масштабирование по столбцам. В каждом столбце есть только одно значение, поэтому вы получаете 0.   -  person pault    schedule 13.01.2018
comment
Да, в каждом столбце есть только одно значение. Но результат должен быть одинаковым. В противном случае ввод для нейронной сети не будет таким же.   -  person Brana    schedule 13.01.2018
comment
Но результаты не могут быть одинаковыми, потому что вы подходите к разным данным. Возможно, вы хотели позвонить fit_transform(AR) и transform(AR1)   -  person pault    schedule 13.01.2018
comment
На самом деле да, это должно быть преобразование вместо fit_transform. Но по другим данным я почему-то не получаю точно такие же данные, даже когда использую преобразование. Но в этом примере все ок.   -  person Brana    schedule 13.01.2018
comment
Я попытаюсь изолировать проблему, так как этот пример огромен - около 300 строк или более. А потом выложу.   -  person Brana    schedule 13.01.2018
comment
На самом деле этот poart, вероятно, в порядке, потому что, когда я изолирую матрицу от основной программы и выполняю все так же, как и должно. Я предполагаю, что что-то еще является проблемой, но не связано со стандартным скалером.   -  person Brana    schedule 13.01.2018
comment
Спасибо за transform/fit_transform. Я неправильно использовал его как с labelencoder, так и с onohotencoder.   -  person Brana    schedule 13.01.2018
comment
Рад помочь. Пожалуйста, рассмотрите возможность пометить ответ, за который проголосовали ниже, как правильный, поскольку он, по сути, говорит то же самое.   -  person pault    schedule 13.01.2018


Ответы (2)


StandardScaler сместит данные на среднее и масштабирует их на std, поскольку вы передаете ему только одну строку, среднее значение для каждого столбца — это само значение, и значение будет сдвинуто на нуль. Подробнее см. здесь.

>>> 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 
person CtheSky    schedule 13.01.2018

Как и 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 и его масштабирование, а НЕ поиск среднего значения или дисперсии.

Это делается для того, чтобы ваш ввод стал идеальным для работы других функций/алгоритмов, и вы получили лучшую точность.

person morphine    schedule 13.01.2018