Огромная вариативность в моделях прогнозирования временных рядов. Как бы вы с этим справились?

Вопрос или проблема

Я работаю над сложной моделью прогнозирования временных рядов с использованием TensorFlow.

Модель является бинарным классификатором с примерно 100 признаками, и в основном состоит из 4 слоев LSTM (входной + 2 скрытых + выходной), с стандартной функцией активации/инициализации/стратегией и оптимизируется с помощью Adam с стандартными параметрами (без планирования LR).

Функция потерь – бинарная кросс-энтропия, и я регулирую модель через относительно высокий уровень выброса и рекуррентный выброс, плюс ранняя остановка по потере. Преимущества L1 и L2 регуляризаторов были опровергнуты при настройке гиперпараметров с использованием кросс-валидации, то же самое касается стратегий нормализации, таких как обрезка градиента или нормализация слоя (хотя я тестировал только последнюю, размещенную после функций активации).

Модель в порядке – на некоторых подгонках. Подгоняя модель с абсолютно теми же параметрами и вызывая tf.set_random_seed (и аналогичный параметр numpy) в начале кода, иногда я получаю хорошую модель, а в других случаях – худшую, чем посредственная.

Эффективность, измеренная по глобальным метрикам, таким как средняя точность, на одном фиксированном тестовом наборе (ранняя остановка выполняется на отдельном, также фиксированном валидационном наборе), варьируется до 25%.

У меня нет идеи, как с этим справиться. Как получить больше стабильности между «разными экземплярами одной и той же модели»? Как я мог бы протестировать, например, отбор признаков, установить эталоны для более сложных архитектур или даже выполнить настройку гиперпараметров, если результаты не могут быть доверительными и последовательными? Как выбрать одну конкретную подгонку для развертывания/выполнения вывода? Я полагаю, ансамбли могут быть решением, но это звучит сложно.

Я новичок в этом и буду рад любым советам.

Ответ или решение

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

1. Управление случайностью

Хотя вы уже используете tf.set_random_seed и устанавливаете фиксированные значения для numpy, важно убедиться, что все аспекты случайности фиксированы. Убедитесь, что:

  • Вы задаете random_state для всех используемых в вашей модели библиотек (например, для Splitters в sklearn, если они применяются).
  • Ваши данные не имеют каких-либо случайных изменений между итерациями; возможно, стоит использовать одинаковые способы предварительной обработки данных.

2. Увеличение объема и качества данных

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

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

3. Экспериментирование с архитектурой модели

Возможно, стоит попробовать поменять архитектуру модели, чтобы найти более стабильный подход. Некоторые идеи:

  • Использование менее сложных архитектур, таких как простые RNN или GRU, что может помочь лучше обобщать информацию.
  • Применение методов, таких как Bidirectional LSTM, для улучшения захвата последовательной информации.

4. Оптимизация гиперпараметров

Рекомендую попробовать более системный подход к поиску гиперпараметров. Используйте подходы, такие как:

  • Random Search или Bayesian Optimization, чтобы более эффективно исследовать пространство гиперпараметров.
  • Использование Keras Tuner или Optuna для автоматизации процесса.

5. Регуляризация и нормализация

Хотя предыдущие тесты не показали эффектов L1 и L2 регуляризации, вы можете попробовать другие методы, такие как:

  • Применение Batch Normalization между слоями для стабилизации обучения.
  • Увеличение нормализации dropout, либо изменив частоту его применения, либо варьируя его значения.

6. Ансамблирование моделей

Вы упомянули ансамблирование, и это действительно может быть мощным инструментом. Попробуйте:

  • Создавать несколько моделей с разными инициализациями и hyperparametрами; это может помочь сгладить variance ваших оценок.
  • Использовать Voting или Averaging Ensemble, которые обобщают результаты моделей и могут повысить стабильность предсказаний.

7. Оценка и выбор моделей

Предлагаю использовать k-fold cross-validation для более надежной оценки вашей модели. Это не только позволит вам получить средние значения метрик, но и обеспечит лучшее представление об устойчивости модели к изменениям.

  • После выбора наилучших моделей используйте метод holdout для выбора конкретной модели перед развертыванием.

Заключение

Работа с временными рядами и моделями машинного обучения может оказаться сложной задачей, особенно на начальных этапах. Однако применение вышеуказанных стратегий должно помочь снизить вариативность результатов и сделать вашу модель более стабильной и предсказуемой. Не забывайте, что исследование и итерации — это основной путь к успеху в машинном обучении. Удачи!

Оцените материал
Добавить комментарий

Капча загружается...