Следует ли мне использовать те же параметры нормализации, которые использовались для обучающих данных, или нормализовать данные заново?

Когда я нормализую данные, я использую этот код:

mean = data_for_l.mean(axis=0)
std = data_for_l.std(axis=0)

data_for_l -= mean
data_for_l /= std

Я прочитал о таком методе в книге. Возникает вопрос: стоит ли мне сохранять значения mean и std и использовать их для нормализации всегда, или лучше считать их заново для данных, которые я хочу предсказать? У меня простая полносвязная нейронная сеть с одним слоем.
  • 5 января 2024 г. 7:09
Ответы на вопрос 2
Когда вы нормализуете данные для нейронной сети, очень важно использовать те же параметры (среднее значение `mean` и стандартное отклонение `std`) для нормализации как обучающего, так и тестового (или новых) наборов данных. Это обеспечивает согласованность в масштабировании признаков и позволяет модели правильно интерпретировать новые данные.

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

Процесс должен выглядеть следующим образом:

1. Вычисляете среднее значение и стандартное отклонение на обучающем наборе данных:
```python
mean = train_data.mean(axis=0)
std = train_data.std(axis=0)
```

2. Нормализуете обучающие данные с использованием этих параметров:
```python
train_data -= mean
train_data /= std
```

3. Сохраняете значения `mean` и `std`.

4. Нормализуете тестовые или новые данные, используя сохраненные значения `mean` и `std` (не вычисляете их заново на тестовых данных):
```python
test_data -= mean
test_data /= std
```

Это гарантирует, что новые данные будут отображаться в той же области пространства признаков, что и обучающие данные.

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

В заключение, вы должны всегда использовать параметры нормализации (`mean` и `std`), полученные из обучающего набора данных, для всех последующих преобразований данных перед предсказаниями.
Хороший вопрос. Есть правило никогда не использовать метод fit на тестовом сете. Иными словами будьто нормализация, скалинг, стандартизация или другие трансформации, ты никогда не находишь никакие параметры в тестовом наборе  - это грубая ошибка. А всегда используешь только тренировочный набор. По этому все свои mean, std и прочее ты берешь только из тренировочного набора . 

В scikit-learn есть трансформаторы, к примеру StandardScaler так вот у него есть методы fit, transform и fit_transform. Так вот для тестового дата сета ты используешь только transform и никогда fit или fit_transform. Что означает применить трансформацию к тестовому сету с параметрами посчитанными на тренировочном сете.

С нейронными сетями абсолютно тоже самое без каких либо исключений.
Похожие вопросы