Временные ряды: предсказание следующего значения

Временные ряды — это последовательности данных, упорядоченные по времени, где каждое значение зависит от предыдущих. Классическими примерами являются котировки акций, температура воздуха, посещаемость сайта или показатели сенсоров. Основная задача при работе с временными рядами — прогнозирование будущих значений на основе исторических данных.

Подготовка данных

Для корректного обучения модели важно правильно подготовить данные:

  1. Нормализация: масштабирование значений ряда в диапазон [0,1] или [-1,1] помогает ускорить обучение и избежать проблем с градиентным спуском.

    const min = Math.min(...data);
    const max = Math.max(...data);
    const normalizedData = data.map(x => (x - min) / (max - min));
  2. Формирование окон (windowing): последовательности данных разбиваются на окна фиксированной длины. Каждое окно становится входом модели, а следующее значение — целевым выходом.

    const createDataset = (data, windowSize) => {
      const xs = [];
      const ys = [];
      for (let i = 0; i < data.length - windowSize; i++) {
        xs.push(data.slice(i, i + windowSize));
        ys.push(data[i + windowSize]);
      }
      return { xs, ys };
    };
  3. Преобразование в тензоры: TensorFlow.js работает с tf.Tensor, поэтому массивы данных необходимо преобразовать.

    const { xs, ys } = createDataset(normalizedData, 10);
    const xsTensor = tf.tensor2d(xs);
    const ysTensor = tf.tensor1d(ys);

Выбор архитектуры модели

Для предсказания следующего значения временного ряда обычно применяются рекуррентные нейронные сети (RNN) или их модификации — LSTM и GRU. LSTM (Long Short-Term Memory) особенно эффективны для выявления долгосрочных зависимостей в данных.

Пример построения модели LSTM в TensorFlow.js:

const model = tf.sequential();

model.add(tf.layers.lstm({
  units: 50,
  inputShape: [xsTensor.shape[1], 1],
  returnSequences: false
}));

model.add(tf.layers.dense({ units: 1 }));

model.compile({
  optimizer: tf.train.adam(),
  loss: 'meanSquaredError'
});

Ключевые моменты:

  • units определяет количество нейронов в LSTM-слое, что влияет на способность модели к запоминанию сложных зависимостей.
  • inputShape — форма входных данных [длина_окна, количество_фич].
  • dense слой на выходе используется для предсказания одного числа — следующего значения ряда.

Обучение модели

Обучение модели проводится методом градиентного спуска с минимизацией функции потерь. Для временных рядов обычно используется meanSquaredError (MSE).

await model.fit(xsTensor.reshape([xsTensor.shape[0], xsTensor.shape[1], 1]), ysTensor, {
  epochs: 100,
  batchSize: 16,
  validationSplit: 0.2,
  callbacks: tf.callbacks.earlyStopping({ monitor: 'val_loss', patience: 10 })
});

Особенности:

  • reshape необходим для приведения данных к форме [batch, timesteps, features].
  • validationSplit позволяет контролировать переобучение.
  • earlyStopping автоматически завершает обучение при отсутствии улучшений.

Предсказание следующего значения

После обучения модель способна предсказывать будущее значение ряда на основе последних windowSize элементов.

const lastWindow = normalizedData.slice(-10);
const inputTensor = tf.tensor2d([lastWindow]).reshape([1, lastWindow.length, 1]);
const prediction = model.predict(inputTensor);
const predictedValue = prediction.dataSync()[0] * (max - min) + min; // обратная нормализация

Важные моменты:

  • Использование последних windowSize элементов позволяет модели опираться на актуальные тенденции.
  • Обратная нормализация возвращает значение в исходный диапазон данных.

Рекомендации по улучшению предсказаний

  • Увеличение размера окна помогает захватывать более длинные зависимости.
  • Добавление нескольких LSTM-слоев может повысить точность, но увеличивает риск переобучения.
  • Dropout и регуляризация помогают бороться с переобучением.
  • Интеграция дополнительных признаков (например, день недели, месяц, события) позволяет модели учитывать внешние влияния.

Визуализация и анализ ошибок

Для анализа качества предсказаний важно визуализировать результаты:

const predictedSeries = normalizedData.slice(0, 10).concat([predictedValue]);
console.log(predictedSeries);

Сравнение предсказанных значений с фактическими позволяет выявлять систематические ошибки и отклонения тренда. Для оценки качества модели часто используют метрики MSE, RMSE или MAE.

Обработка многошаговых прогнозов

Для предсказания нескольких шагов вперед можно использовать итеративный метод: предсказанное значение добавляется в конец окна, и цикл повторяется для следующего шага. Для более стабильных результатов применяют модели Sequence-to-Sequence (Seq2Seq), где на вход подается целая последовательность, а на выход — прогноз сразу нескольких точек.


Использование TensorFlow.js позволяет полностью реализовать процесс предсказания временных рядов на стороне клиента, комбинируя удобство JavaScript и мощь современных нейросетевых архитектур. Такой подход подходит для интерактивных веб-приложений, анализа данных в реальном времени и создания прототипов сложных прогнозных систем.