Увеличение временных рядов

Улучшение временных рядов

Простой, но эффективный способ увеличить количество временных рядов данных

Этот блог-пост доступен в виде jupyter-ноутбука на GitHub.

Увеличение данных является неотъемлемым компонентом в области обработки компьютерного зрения. Однако их популярность в других областях, таких как временные ряды, пока не достигла таких же высот. В этом руководстве я рассмотрю мир увеличения временных рядов, пролив свет на их значимость и предоставлю конкретные примеры их применения с помощью мощной библиотеки для моделирования генеративных временных рядов TSGM [5].

Нашей отправной точкой являются набор данных обозначенный (𝐗, 𝐲). Здесь, 𝐱ᵢ ∈ 𝐗 являются многомерными (то есть каждый момент времени представляет собой многомерный вектор особенностей) временными рядами, а 𝐲 – это метки. Предсказание меток 𝐲 называется задачей построения. Нашей целью является использование (𝐗, 𝐲) для создания дополнительных выборок (𝐗*, 𝐲*), которые могут помочь нам эффективнее решать поставленную задачу (с точки зрения предсказательной эффективности или устойчивости). Из простоты, в этом руководстве мы не будем работать с метками, однако описанные здесь методы легко обобщаются на случай с метками, а программные реализации, которые мы используем, легко расширяются до надзорного случая путем добавления дополнительных параметров к методу .generate (см. примеры ниже).

Без лишних слов, давайте рассмотрим увеличение временных рядов пошагово. В TSGM все увеличения удобно организованы в tsgm.models.augmentations, и вы можете ознакомиться с подробной документацией, доступной по ссылке Документация TSGM. Теперь приступим к примерам кодирования, установив tsgm:

pip install tsgm

В дальнейшем, мы импортируем tsgm и загружаем пример набора данных. Тензор X теперь содержит 100 синусоидных временных рядов длиной 64, с 2 особенностями каждый. Случайное изменение сдвига, частоты и амплитуды (максимальная амплитуда равна 20).

# import the librariesimport matplotlib.pyplot as pltimport seaborn as snsimport numpy as npimport randomfrom tensorflow import kerasimport tsgm

# and now generate the datasetX = tsgm.utils.gen_sine_dataset(100, 64, 2, max_value=20)

Сдвиг / Гауссовый шум

В качестве первого увеличения рассмотрим сдвиг.

Временные ряды данных увеличиваются с помощью случайного гауссового шума (Wikipedia))

В tsgm Гауссовое шумовое увеличение может быть применено следующим образом:

aug_model = tsgm.models.augmentations.GaussianNoise()samples = aug_model.generate(X=X, n_samples=10, variance=0.2)

Идея гауссового шумового увеличения заключается в том, что добавление небольшого количества сдвига к временным рядам, скорее всего, не изменит его значительно, но увеличит количество таких шумных образцов в нашем наборе данных. Это часто делает модели более устойчивыми к шумным образцам или улучшает предсказательную эффективность. Параметры Гауссового шума и способ добавления шума (например, гауссовый шум может увеличиваться к концу временного ряда) – это сложный вопрос, который зависит от конкретного набора данных и поставленной задачи. Часто стоит экспериментировать и смотреть, как эти параметры влияют на производительность целевой модели. Здесь мы предоставляем визуализацию образцов из оригинального синусного набора данных и увеличенных образцов.

Original time series and synthetic data generated via Jittering.

Перемешивание признаков

Другой подход к увеличению временных рядов – просто перемешивание признаков. Этот подход подходит только для определенных многомерных временных рядов, где они не изменяются при любой или определенной перестановке признаков. Например, он может быть применен к временным рядам, где каждый признак представляет независимые измерения от различных датчиков.

Для объяснения этого подхода давайте рассмотрим пример пяти идентичных сенсоров, обозначенных как S_1, S_2, S_3, S_4 и S_5. Для иллюстрации предположим, что датчики 1-4 возможно могут быть заменяемыми с точки зрения вращений. Тогда имеет смысл попробовать дополнить данные с помощью поворотов признаков относительно вращений датчиков S_1, …, S_5.

В этом примере присутствуют пять датчиков, и измерения с этих датчиков порождают пятимерные временные ряды данных. Датчики с 1 по 4 могут произвольно поворачиваться для создания новых синтетических выборок (например, 1->2, 2->3, 3->4, 4->1). Таким образом, применяя такие преобразования к исходным данным, можно генерировать новые синтетические выборки.

Аналогично предыдущему примеру, дополнение может работать следующим образом:

aug_model = tsgm.models.augmentations.Shuffle()samples = aug_model.generate(X=X, n_samples=3)

Здесь мы показываем одну выборку из временного ряда с 5 признаками и дополненную выборку, аналогично изображению выше.

Исходные временные ряды и синтетические данные, сгенерированные путем перемешивания признаков.

Разделение и перемешивание

Аугментация разделения и перемешивания [3] разбивает временной ряд на сегменты и перемешивает их. Эта аугментация может выполняться для временных рядов, которые проявляют некоторую инвариантность со временем. Например, представьте себе временной ряд, измеренный с помощью носимых устройств в течение нескольких дней. Хорошей стратегией в этом случае будет разделение временного ряда по дням и, перемешивая эти дни, получить дополнительные выборки. Визуализация аугментации разделения и перемешивания представлена на следующем изображении:

Схематическое представление разделения и перемешивания.
aug_model = tsgm.models.augmentations.SliceAndShuffle()samples = aug_model.generate(X=X, n_samples=10, n_segments=3)

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

Исходные временные ряды и синтетические данные, сгенерированные путем разделения и перемешивания.

Изменение амплитуды

Изменение амплитуды [3] изменяет амплитуду каждой выборки в наборе данных временных рядов путем умножения их на кубическую сплайн-кривую. Этот процесс масштабирует амплитуду временных рядов, что может быть полезно во многих случаях, например, в синтетическом примере с синусами n_knots количество узлов при случайных амплитудах, распределенных как N(1, σ^2), где σ задается параметром sigma в функции .generate.

aug_model = tsgm.models.augmentations.MagnitudeWarping()samples = aug_model.generate(X=X, n_samples=10, sigma=1)

Вот пример оригинальных данных и дополненных выборок, сгенерированных с помощью MagnitudeWarping.

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

Изменение окна

В этой технике [4] выбранные окна во временных рядах либо ускоряются, либо замедляются. Затем весь полученный временной ряд масштабируется обратно до исходного размера, чтобы сохранить длину отсчетов с той же продолжительностью. Ниже приведен пример такого увеличения:

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

В tsgm, как всегда, генерация может быть выполнена с помощью

aug_model = tsgm.models.augmentations.WindowWarping()samples = aug_model.generate(X=X, n_samples=10, scales=(0.5,), window_ratio=0.5)

Ниже приведен пример сгенерированного временного ряда.

Оригинальные временные ряды и синтетические данные, сгенерированные с помощью изменения окна.

Усреднение динамического временного искривления (DTWBA)

Усреднение динамического временного искривления (DTWBA) [2] – это метод аугментации, основанный на динамическом временном искривлении (DTW). DTW – это метод измерения сходства между временными рядами. Идея заключается в “синхронизации” этих временных рядов, как показано на следующей картинке.

DTW измеряется для двух временных рядов $\sin(x)$ и $\sin(2x)$. Измерение DTW показано белой линией. Также визуализируется перекрестная матрица сходства.

Подробнее о вычислении DTW можно узнать по адресу https://rtavenar.github.io/blog/dtw.html.

DTWBA работает следующим образом: 1. Алгоритм выбирает один временной ряд для инициализации результата DTWBA. Этот временной ряд может быть явно указан или выбран случайным образом из набора данных 2. Для каждого из N временных рядов алгоритм вычисляет расстояние DTW и путь (путь – это отображение, которое минимизирует расстояние) 3. После вычисления всех N расстояний DTW алгоритм обновляет результат DTWBA, выполняя усреднение по всем найденным путям 4. Алгоритм повторяет шаги (2) и (3) до тех пор, пока результат DTWBA не стабилизируется

Пример реализации можно найти в tslearn, а описание – в [2].

В tsgm, сэмплы могут быть сгенерированы следующим образом

aug_model = tsgm.models.augmentations.DTWBarycentricAveraging()initial_timeseries = random.sample(range(X.shape[0]), 10)initial_timeseries = X[initial_timeseries]samples = aug_model.generate(X=X, n_samples=10, initial_timeseries=initial_timeseries )
Исходные временные ряды и синтетические данные, сгенерированные с помощью DTWBA.

Аугментация с помощью генеративных моделей машинного обучения

Другой подход к аугментации состоит в обучении модели машинного обучения на исторических данных и обучении ее генерировать новые синтетические образцы. Это метод черного ящика, поскольку сложно интерпретировать, как были сгенерированы новые образцы. В случае временных рядов могут быть применены несколько методов, в частности, tsgm имеет VAE, GANs и гауссовские процессы. Пример генерации синтетических временных рядов с использованием VAE:

n, n_ts, n_features = 1000, 24, 5data = tsgm.utils.gen_sine_dataset(n, n_ts, n_features)scaler = tsgm.utils.TSFeatureWiseScaler() scaled_data = scaler.fit_transform(data)

architecture = tsgm.models.zoo[“vae_conv5”](n_ts, n_features, 10)encoder, decoder = architecture.encoder, architecture.decodervae = tsgm.models.cvae.BetaVAE(encoder, decoder)vae.compile(optimizer=keras.optimizers.Adam())vae.fit(scaled_data, epochs=1, batch_size=64)samples = vae.generate(10)

Вывод

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

Как выбрать? Сначала проанализируйте, содержит ли ваша проблема инвариантности. Она устойчива к случайному шуму? Она устойчива к перемешиванию признаков?

Затем выберите широкий набор методов и проверьте, улучшает ли какой-либо из выбранных методов производительность вашей проблемы (у tsgm есть метрика производительности для последующих операций). Затем выберите набор методов аугментации, который дает наибольший прирост производительности.

В заключение, я благодарю Летицию Ианнуччи и Георгия Гриценко за помощь и полезные дискуссии по написанию этого поста. Если не указано иное, все изображения принадлежат автору.

Этот блог является частью проекта TSGM, в рамках которого мы создаем инструмент для улучшения конвейеров временных рядов с помощью аугментации и генерации синтетических данных. Если вам это помогло, посмотрите наш репозиторий и рассмотрите возможность цитирования статьи о TSGM:

@article{  nikitin2023tsgm,  title={TSGM: A Flexible Framework for Generative Modeling of Synthetic Time Series},  author={Nikitin, Alexander and Iannucci, Letizia and Kaski, Samuel},  journal={arXiv preprint arXiv:2305.11567},  year={2023}}

Ссылки

[1] H. Sakoe and S. Chiba, “Dynamic programming algorithm optimization for spoken word recognition”. IEEE Transactions on Acoustics, Speech, and Signal Processing, 26(1), 43–49 (1978).

[2] F. Petitjean, A. Ketterlin & P. Gancarski. A global averaging method for dynamic time warping, with applications to clustering. Pattern Recognition, Elsevier, 2011, Vol. 44, Num. 3, pp. 678–693

[3] Um TT, Pfister FM, Pichler D, Endo S, Lang M, Hirche S,Fietzek U, Kulic´ D (2017) Data augmentation of wearable sensor data for parkinson’s disease monitoring using convolutional neural networks. In: Proceedings of the 19th ACM international conference on multimodal interaction, pp. 216–220

[4] Rashid, K.M. and Louis, J., 2019. Window-warping: a time series data augmentation of IMU data for construction equipment activity identification. In ISARC. Proceedings of the international symposium on automation and robotics in construction (Vol. 36, pp. 651–657). IAARC Publications.

[5] Никитин, А., Яннуччи, Л. и Каски, С., 2023. TSGM: гибкий фреймворк для генеративного моделирования синтетических временных рядов. Предварительная печать arXiv:2305.11567. Ссылка на Arxiv.