как правильно масштабировать данные для тензорного потока

Для ввода в нейронные сети данные должны быть масштабированы до диапазона [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? Если нет, то каков рекомендуемый способ нормализации данных?

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


person R71    schedule 24.01.2020    source источник


Ответы (1)


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

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

person fbrand    schedule 24.01.2020
comment
Нет, даже из того же источника данных диапазоны, видимые на этапе обучения, могут быть меньше, чем диапазоны, наблюдаемые во время тестирования в реальной жизни. См. Комментарий, который я добавил к вопросу. - person R71; 24.01.2020
comment
Я бы порекомендовал взглянуть на следующую ссылку и, возможно, посмотрите на последний Normalize. - person fbrand; 24.01.2020