Вопрос или проблема
У меня есть входные данные, величины которых значительно варьируются между признаками. Я масштабировал их с помощью StandardScaler() из sklearn, а затем использовал keras для обучения нейронной сети на этих данных для предсказания моей целевой переменной. Я обучил/испробовал эту нейронную сеть, и она показывает хорошие результаты.
Обучающие данные представляют собой временной ряд входных данных для функции в рамках более крупной модели, и моя цель – временной ряд выходных данных. Я обучил модель на масштабированных входных данных (офлайн), но хотел бы, чтобы она заменила эту функцию в модели. Тогда она будет принимать несмасштабированные входные данные (те же признаки) на каждом временном шаге и давать хорошее предсказание для целевой переменной (выхода).
Поскольку модель обучалась на временных рядах данных оффлайн, она, похоже, не лучшим образом подходит для обработки несмасштабированных данных, шаг за шагом, что ей придется делать при использовании в модели. Должен ли я также масштабировать этот онлайн-ввод (и как сделать это совместимым с масштабированными оффлайн данными?), или, например, следует обучать на несмасштабированных данных и использовать “этот метод оптимизации, который хорошо работает с несмасштабированными данными”?
Кто-нибудь знает, как решить эту проблему?
Как вы и упоминаете, вы действительно должны применять те же преобразования, которые вы использовали при обучении вашей модели, к любым новым данным. Для scikit-learn
вы можете использовать формат файлов pickle
или joblib
для сохранения ваших шагов/порядков преобразования (как описано в документации), а затем загрузить его снова в скрипте, где вы делаете предсказания, используя новые данные, и использовать метод transform
для применения преобразований к новым данным.
Ответ или решение
При использовании нейронных сетей для прогнозирования временных рядов, очень важно, чтобы входные данные, используемые в процессе предсказания, соответствовали тем данным, на которых модель была обучена. В вашем случае, поскольку вы уже масштабировали данные с помощью StandardScaler
из библиотеки sklearn
, вам необходимо применять тот же процесс масштабирования к новым данным, которые вы будете подавать в вашу модель.
Вот как это можно сделать:
-
Сохранение экземпляра StandardScaler: После того как вы обучили свою модель на масштабированных данных, необходимо сохранить экземпляр
StandardScaler
. Вы можете сделать это с помощью модуляpickle
илиjoblib
:import joblib from sklearn.preprocessing import StandardScaler # Предположим, scaler – это ваш StandardScaler после обучения joblib.dump(scaler, 'scaler.pkl')
-
Загрузка и трансформация новых данных: В момент, когда вы хотите использовать модель для предсказания, вам нужно загрузить сохраненный
scaler
и применить его к новым данным. Это должно происходить непосредственно перед подачей данных в модель:import joblib import numpy as np # Загрузите сохранённый скейлер scaler = joblib.load('scaler.pkl') # Предположим, new_data – это ваши новые входные данные (несмасштабированные) new_data_scaled = scaler.transform(new_data) # Далее, используете new_data_scaled для предсказания predictions = model.predict(new_data_scaled)
-
Обработка данных в реальном времени: Если ваш сценарий подразумевает поступление данных в реальном времени, вам нужно будет последовательно обрабатывать каждую порцию входных данных (например, при каждом такте времени). Важно, чтобы вы сохраняли состояние
StandardScaler
между итерациями, чтобы у вас не происходило сдвигов в масштабировании данных. -
Обучение на не масштабируемых данных: Обучение модели на не масштабированных данных может быть сложным, и, как правило, не рекомендуется, особенно если ваши алгоритмы чувствительны к масштабам (как нейронные сети). Лучше использовать масштабированные данные, так как это улучшает стабильность и предсказуемость модели.
В итоге, лучшее решение для вашей задачи — сохранить и использовать тот же StandardScaler
, который вы использовали для обучения модели, чтобы применять его к входным данным, предоставляемым во время предсказаний. Это обеспечит согласованность между обучающим и предсказательным этапами, что критически важно для достижения хороших результатов в ваших прогнозах.