Работа с временными рядами: скользящее окно

Временные ряды представляют собой последовательности данных, упорядоченные по времени. Для их анализа и прогнозирования в нейронных сетях используется подход скользящего окна (sliding window), который позволяет преобразовать последовательность в набор входных и выходных данных, пригодных для обучения сети.

Принцип скользящего окна

Суть метода заключается в следующем:

  1. Выбирается фиксированная длина окна n.
  2. Последовательность делится на фрагменты длиной n для входа сети.
  3. Следующий элемент ряда используется как целевое значение для обучения.

Пример: Для временного ряда [x1, x2, x3, x4, x5, x6] и окна размера 3 формируются пары:

Вход Выход
[x1, x2, x3] x4
[x2, x3, x4] x5
[x3, x4, x5] x6

Таким образом, сеть обучается предсказывать следующий элемент на основе предыдущих n элементов.

Подготовка данных для Synaptic

Библиотека Synaptic работает с нейронными сетями на уровне нейронов и слоев, без встроенных функций работы с временными рядами. Для обучения необходимо подготовить данные в формате:

const dataset = [
    { input: [x1, x2, x3], output: [x4] },
    { input: [x2, x3, x4], output: [x5] },
    { input: [x3, x4, x5], output: [x6] }
];

Каждый элемент массива — объект с полями input и output, где input — массив входных значений, а output — массив целевых значений.

Построение сети

Для работы с временными рядами чаще всего применяются многослойные перцептроны (MLP). Создание сети в Synaptic:

const { Layer, Network, Trainer } = require('synaptic');

const inputLayer = new Layer(3);      // размер окна
const hiddenLayer = new Layer(5);     // произвольное количество нейронов скрытого слоя
const outputLayer = new Layer(1);     // прогноз одного значения

inputLayer.project(hiddenLayer);
hiddenLayer.project(outputLayer);

const myNetwork = new Network({
    input: inputLayer,
    hidden: [hiddenLayer],
    output: outputLayer
});

Выделение ключевых моментов:

  • Размер входного слоя соответствует размеру окна.
  • Скрытый слой можно увеличивать для повышения способности сети выявлять сложные зависимости.
  • Выходной слой содержит один нейрон, предсказывающий следующий элемент ряда.

Обучение сети

Обучение выполняется с помощью Trainer:

const trainer = new Trainer(myNetwork);

trainer.train(dataset, {
    rate: 0.01,           // скорость обучения
    iterations: 20000,    // количество итераций
    error: 0.005,         // допустимая ошибка
    shuffle: true,        // перемешивание данных
    log: 1000             // вывод информации каждые 1000 итераций
});

Особенности при работе с временными рядами:

  • Нормализация данных: значения ряда желательно масштабировать в диапазон [0,1] или [-1,1] для стабильного обучения.
  • Перемешивание данных (shuffle) часто помогает ускорить сходимость, но может размывать временную последовательность. Для прогнозирования лучше обучать сеть на последовательных фрагментах и тестировать на следующих временных шагах.

Генерация прогноза

После обучения можно использовать сеть для пошагового предсказания:

let inputWindow = [x4, x5, x6];  // последние известные значения
let nextValue = myNetwork.activate(inputWindow)[0];

// для многократного прогноза:
inputWindow.push(nextValue);
inputWindow.shift(); // удаление самого старого элемента

Такой метод позволяет прогнозировать несколько шагов вперед, используя каждое новое предсказание как вход для следующего.

Оптимизация и расширенные подходы

  1. Подбор размера окна

    • Слишком маленькое окно не захватывает зависимости.
    • Слишком большое — увеличивает сложность сети и риск переобучения.
  2. Добавление нескольких скрытых слоев

    • Позволяет сети выявлять более сложные паттерны.
    • В Synaptic можно создавать цепочки скрытых слоев через массив hidden: [layer1, layer2].
  3. Регуляризация

    • Можно применять шум к входным данным или ограничивать веса сети для предотвращения переобучения.
  4. Многомерные временные ряды

    • Для рядов с несколькими измерениями входное окно содержит все измерения на каждом временном шаге.
    • Например, для ряда с 2 измерениями и окном 3 вход [x1_1, x1_2, x2_1, x2_2, x3_1, x3_2].

Применение

Метод скользящего окна с Synaptic эффективен для:

  • Прогноза цен акций или финансовых показателей.
  • Предсказания температуры, потребления энергии или трафика.
  • Обнаружения аномалий во временных рядах.

Система обучения на скользящем окне превращает последовательность в классификационную/регрессионную задачу, делая возможным применение стандартного MLP, несмотря на отсутствие встроенной поддержки рекуррентных сетей.