Как правильно масштабировать данные для тензорного потока? - PullRequest
0 голосов
/ 24 января 2020

Для ввода в нейронные сети данные должны быть масштабированы до диапазона [0,1]. Для этого часто я вижу следующий вид кода в блогах:

x_train, x_test, y_train, y_test = train_test_split(x, y)
scaler = MinMaxScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

Проблема здесь в том, что мин / макс тестового набора может быть вне диапазона мин / макс обучающего набора. Если это произойдет, то нормализованные значения в X_test будут больше 1,0 или отрицательны. Например:

train_data = [[0,3],[0,7],[0,9],[0,16],[0,10]]
test_data = [[1,1],[1,25],[1,6]]
scaler = MinMaxScaler()
train_scaled = scaler.fit_transform(train_data)
test_scaled = scaler.transform(test_data)
print(test_scaled)

[[ 1.         -0.15384615]
 [ 1.          1.69230769]
 [ 1.          0.23076923]]

Тривиальным решением является масштабирование перед расщеплением, но это не решит проблему, кроме как в образцах игрушек. В качестве примера из реальной жизни рассмотрим обнаружение аномалий, когда обучающий набор обычно состоит из довольно обычных данных. В таких случаях, когда аномальная ситуация может содержать данные, выходящие за пределы того, что сеть видела на этапе обучения.

В таких ситуациях можно ли подавать> 1,0 или <0,0 числа в нейронную сеть? сеть? Если нет, каков рекомендуемый способ нормализации данных? </p>

(Одним из возможных решений является определение верхней границы для значений, например, 120% от максимального значения, наблюдаемого во время тренировки, и насыщение любого значения сверх этого к этой верхней границе. Но есть ли предопределенная функция масштабирования, которая делает этот вид отсечения перед масштабированием?)

1 Ответ

0 голосов
/ 24 января 2020

Я понимаю, что вы говорите, но я думаю, что это потому, что ваши наборы поездов и тестов не принадлежат одному и тому же набору данных, и поэтому имеют одинаковые диапазоны. Наборы X_test и X_train должны быть репрезентативными друг для друга. Если вы создадите большой случайный набор данных, а затем разделите его, вы обнаружите, что MinMaxScaler () делает то, что ему нужно, в указанных диапазонах.

sidenote: лично я не согласен с масштабированием перед разделением, что создает утечку.

...