Работа с временными рядами

Основные концепции временных рядов

Временные ряды — это последовательности данных, упорядоченные по времени. Примеры включают значения температуры, котировки акций, показатели трафика сайта. Для анализа временных рядов важны тренды, сезонные колебания, шумы и автокорреляции.

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

Установка и подключение ml5.js

Для работы с ml5.js используется подключение через CDN или пакетный менеджер:

<script src="https://cdn.jsdelivr.net/npm/ml5@latest/dist/ml5.min.js"></script>

или через npm:

npm install ml5

После подключения библиотека доступна через глобальный объект ml5.

Подготовка данных временных рядов

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

const timeSeriesData = [
  { time: '2026-01-01', value: 100 },
  { time: '2026-01-02', value: 105 },
  { time: '2026-01-03', value: 102 },
  { time: '2026-01-04', value: 108 }
];

Для большинства моделей важно масштабирование значений. Используется нормализация или стандартизация, чтобы значения находились в диапазоне [0, 1] или имели нулевое среднее и единичную дисперсию.

function normalize(data) {
  const values = data.map(d => d.value);
  const min = Math.min(...values);
  const max = Math.max(...values);
  return data.map(d => ({ ...d, value: (d.value - min) / (max - min) }));
}

Создание модели LSTM для временных рядов

В ml5.js для работы с последовательностями используется модель LSTM. Она подходит для предсказания будущих значений на основе предыдущих.

const options = {
  inputs: 1,
  outputs: 1,
  task: 'regression',
  debug: true
};

const lstm = ml5.LSTMTimeSeries(timeSeriesData, options);

Параметры:

  • inputs: количество входных признаков (для простого ряда — 1, значение в момент времени);
  • outputs: количество предсказываемых значений;
  • task: 'regression' для прогнозирования числовых значений;
  • debug: вывод информации о процессе обучения.

Настройка обучения модели

Обучение LSTM происходит с использованием метода train:

const trainingOptions = {
  epochs: 100,
  batchSize: 1,
  learningRate: 0.01
};

lstm.train(trainingOptions, whileTraining);

function whileTraining(epoch, loss) {
  console.log(`Эпоха: ${epoch}, Потеря: ${loss}`);
}
  • epochs: количество проходов по данным;
  • batchSize: размер пакета данных на одну итерацию;
  • learningRate: скорость обновления весов модели;
  • колбэк whileTraining позволяет отслеживать прогресс.

Прогнозирование будущих значений

После обучения используется метод predict:

const futureSteps = 5;
lstm.predict(futureSteps, function(err, results) {
  if (err) {
    console.error(err);
  } else {
    console.log('Прогноз:', results);
  }
});

results возвращает массив предсказанных значений временного ряда.

Визуализация временных рядов

Для анализа модели удобно использовать графическое отображение. Например, с библиотекой Chart.js:

const ctx = document.getElementById('chart').getContext('2d');
const chart = new Chart(ctx, {
  type: 'line',
  data: {
    labels: timeSeriesData.map(d => d.time),
    datasets: [
      {
        label: 'Исторические значения',
        data: timeSeriesData.map(d => d.value),
        borderColor: 'blue',
        fill: false
      },
      {
        label: 'Прогноз',
        data: [...Array(timeSeriesData.length).fill(null), ...predictedValues],
        borderColor: 'red',
        fill: false
      }
    ]
  }
});
  • Исторические значения отображаются синим, прогнозируемые — красным.
  • Для корректного отображения прогнозов добавляются null для выравнивания по времени.

Сохранение и загрузка модели

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

lstm.save('my-lstm-model');

Для загрузки:

ml5.LSTMTimeSeries.load('my-lstm-model', function(err, loadedModel) {
  if (err) {
    console.error(err);
  } else {
    console.log('Модель загружена');
  }
});

Сохранение позволяет избегать повторного обучения и использовать модель в браузере или на сервере.

Работа с многомерными временными рядами

Если данные имеют несколько признаков (например, температура, влажность, давление), inputs устанавливается равным количеству признаков:

const multivariateOptions = {
  inputs: 3, // температура, влажность, давление
  outputs: 1,
  task: 'regression'
};

const lstmMulti = ml5.LSTMTimeSeries(multivariateData, multivariateOptions);

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

Подводные аспекты

  • Проблемы с малым объемом данных: LSTM требует значительного количества наблюдений для точного прогнозирования.
  • Переобучение: необходимо контролировать epochs и learningRate.
  • Шумные данные: рекомендуется сглаживание или фильтрация перед обучением.
  • Интерпретируемость: LSTM сложны для интерпретации, поэтому полезно анализировать важность входных признаков и визуализировать ошибки предсказания.

Дополнительные возможности ml5.js для временных рядов

  • Генерация синтетических последовательностей для увеличения обучающего набора.
  • Кластеризация временных рядов с использованием KMeans через ml5.KNNClassifier.
  • Обнаружение аномалий путем сравнения предсказанных и фактических значений.

Работа с временными рядами в ml5.js сочетает в себе удобство браузерной интеграции, доступ к мощным моделям LSTM и возможности быстрой визуализации и анализа данных.