Для ввода в нейронные сети данные должны быть масштабированы до диапазона [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% максимального значения, наблюдаемого во время обучения, и довести любое значение сверх этого до этой верхней границы. Но существует ли предопределенная функция масштабирования, которая выполняет такое ограничение перед масштабирование?)