Вопрос или проблема
Я пытаюсь создать модель для прогноза валютных курсов. Она дает многообещающие результаты для классификации каждого периода как покупка/продажа/нейтрально. При использовании в качестве классификатора фактическая доходность преобразуется в 0, 1 или 2, чтобы отразить возможные действия (продажа=0, нейтрально=1, покупка=2) в зависимости от того, превышает ли изменение цен в будущем заданный порог в сторону повышенной или пониженной.
Однако, пытаясь предсказать будущее изменение как задачу линейной регрессии, она делает бессмысленные прогнозы. Каждый раз, когда я обучаю модель, она быстро сходится к различному фиксированному значению прогноза для каждого периода.
Вот упрощенная версия построения/компиляции модели:
def build(self, is_evolution=False):
self.model = models.Sequential()
self.model.add(layers.Dense(self.num_layers, activation="relu", input_shape=(self.x_train.shape[1],)))
self.model.add(layers.Dense(self.num_layers, activation="relu"))
if self.is_classification:
class_counts = np.array(list(map(lambda x: self.y_train[self.y_train == x].shape[0], self.classes)))
total_count = self.y_train.shape[0]
bias_initializer = tf.constant_initializer(tuple(class_counts / total_count))
self.model.add(layers.Dense(len(self.classes), activation="sigmoid", bias_initializer=bias_initializer))
else:
self.model.add(layers.Dense(1))
loss = "sparse_categorical_crossentropy" if self.is_classification else tf.keras.losses.MeanSquaredError()
self.model.compile(optimizer=tf.keras.optimizers.Adam(), loss=loss, metrics=["accuracy"])
Вот пример прогнозов, когда is_classification
установлено на False
. Это бессмысленно, потому что все прогнозы одинаковы, но и числа в этом случае тоже очень большие (т.е. фактическое среднее очень близко к нулю), хотя числа прогнозов могут значительно варьироваться при различных обучениях.
[[0.00081437]
[0.00081437]
[0.00081437]
...
[0.00081437]
[0.00081437]
[0.00081437]]
Основываясь на предложениях здесь: Модель регрессии Tensorflow дает одинаковый прогноз каждый раз, я пытался изменить скорость обучения, но без успеха. Я также убедился, что масштабирую обучающую и тестовую выборки, хотя не уверен, что это должно иметь значение для линейной регрессии.
Сначала я думал, что это просто из-за очень шумного набора данных, но размышляя больше, я полагаю, что модель, которая может классифицировать покупку или продажу, также должна быть в состоянии делать регрессионные прогнозы, когда выходной слой модифицирован, как указано выше.
Любые мысли будут приветствоваться.
Обновление: Я проверял отдельные веса и вижу, что прогнозы линейной регрессии равны смещению выходного слоя, однако другие веса, похоже, “нормальные” (т.е. различные положительные и отрицательные веса).
Удивительно, но изменение оптимизатора с adam
на tf.keras.optimizers.SGD(lr=0.01, momentum=0.9)
устранило идентичные прогнозы, но похоже, что требуется больше настроек, чтобы получить хорошие результаты, как в модели классификации.
Единственный вопрос — почему это изменение делает такую значительную разницу? Я был бы любопытен узнать ответ, если кто-то его знает.
Ответ или решение
Когда вы сталкиваетесь с проблемой, когда модель TensorFlow для регрессии выдает одинаковые предсказания, это может быть вызвано несколькими факторами, связанными с особенностями настройки модели, инициализации весов и используемыми функциями потерь. Рассмотрим ключевые моменты, которые могут помочь в понимании и решении этой проблемы.
1. Архитектура модели
На первый взгляд, архитектура вашей модели выглядит достаточно стандартной для задач регрессии. Однако несколько компонентов могут требовать особого внимания:
-
Инициализация весов: В вашем коде инициализация смещения (bias) происходит на основе частоты классов для задачи классификации. В регрессии такая инициализация может привести к сильной предвзятости в предсказаниях. Рекомендуется использовать стандартные методы инициализации, такие как
he_uniform
илиglorot_uniform
, для лучшего распределения весов. -
Количество слоев и нейронов: Возможно, стоит экспериментировать с количеством нейронов или слоев. Для задач регрессии часто используется менее сложная архитектура, чем для классификации.
2. Функция потерь
Вы используете функцию потерь MeanSquaredError
, что является правильным выбором для регрессии. Однако при отсутствии значимых сигналов в данных (сильно зашумленных), эта функция может не обеспечивать хорошую обратную связь для обучения весов модели.
3. Масштабирование данных
Вы упомянули, что ваши данные масштабированы. Это крайне важно. Для моделей регрессии особенно рекомендуется применять стандартное масштабирование (стандартизация), чтобы привести данные к нормальному распределению с нулевым средним и единичной дисперсией. Это помогает избежать проблем с затухающими градиентами и усреднением предсказаний.
4. Оптимизатор
Ваше замечание о смене оптимизатора с Adam на SGD имеет смысл. Adam адаптивно изменяет скорость обучения на основе первого и второго момента градиентов, что делает его более устойчивым к шуму, однако в некоторых случаях результаты могут быть непредсказуемыми.
SGD с заданной скоростью обучения и моментом может лучше справляться с некоторыми специфическими задачами, когда необходимо более детальное управление процессом обновления весов. Он обеспечивает более стабильное поведение в ситуациях высокой коррелированности данных, позволяя избежать "залипания" в локальных минимумах.
5. Параметры обучения
Обратите внимание на скорость обучения. Если она слишком высокая, модель может не успевать адаптироваться к данным. Если слишком низкая, может потребоваться слишком много времени для достижения результата. Экспериментируйте с различными значениями.
6. Шум в данных
Если ваши данные имеют сильный шум, они могут затруднить обучение модели. В таком случае стоит рассмотреть возможность очистки данных, применение методов регуляризации (например, L1 или L2) или даже использование более сложных архитектур, таких как LSTM, которые могут лучше справляться с временными рядами.
Заключение
Ваша задача по прогнозированию изменение валютных курсов требует комплексного подхода. Важность правильной архитектуры, функции потерь, инициализации весов и выбора оптимизатора нельзя недооценивать. Применение предложенных мер может значительно улучшить качество ваших предсказаний. Не забывайте про важность анализа данных и их предварительной обработки для успешного применения машинного обучения в реальных задачах.