Временные ряды — это последовательности данных, упорядоченные по времени, где каждое значение зависит от предыдущих. Классическими примерами являются котировки акций, температура воздуха, посещаемость сайта или показатели сенсоров. Основная задача при работе с временными рядами — прогнозирование будущих значений на основе исторических данных.
Для корректного обучения модели важно правильно подготовить данные:
Нормализация: масштабирование значений ряда в диапазон [0,1] или [-1,1] помогает ускорить обучение и избежать проблем с градиентным спуском.
const min = Math.min(...data);
const max = Math.max(...data);
const normalizedData = data.map(x => (x - min) / (max - min));Формирование окон (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 };
};Преобразование в тензоры: 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 элементов позволяет
модели опираться на актуальные тенденции.Для анализа качества предсказаний важно визуализировать результаты:
const predictedSeries = normalizedData.slice(0, 10).concat([predictedValue]);
console.log(predictedSeries);
Сравнение предсказанных значений с фактическими позволяет выявлять систематические ошибки и отклонения тренда. Для оценки качества модели часто используют метрики MSE, RMSE или MAE.
Для предсказания нескольких шагов вперед можно использовать итеративный метод: предсказанное значение добавляется в конец окна, и цикл повторяется для следующего шага. Для более стабильных результатов применяют модели Sequence-to-Sequence (Seq2Seq), где на вход подается целая последовательность, а на выход — прогноз сразу нескольких точек.
Использование TensorFlow.js позволяет полностью реализовать процесс предсказания временных рядов на стороне клиента, комбинируя удобство JavaScript и мощь современных нейросетевых архитектур. Такой подход подходит для интерактивных веб-приложений, анализа данных в реальном времени и создания прототипов сложных прогнозных систем.