Предобработка многогрупповых временных рядов: кодировать каждую выборку отдельно или в агрегированном виде?

Вопрос или проблема

Допустим, у меня есть 3 плотные последовательности одинаковой длины. Должен ли я подгонять масштабировщик по ним отдельно или вместе?

import numpy as np
from sklearn.preprocessing import StandardScaler

arr = np.array([
    [
        [1.1],[2.2],[3.3]
    ],
    [
        [1.2],[2.3],[3.4]
    ],
    [
        [4.0],[5.0],[6.0]
    ]
])

SS = StandardScaler()

Отдельно:

SS.fit_transform(arr[0])
SS.fit_transform(arr[1])
SS.fit_transform(arr[2])

Или вместе?

tall_2d = np.concatenate((arr[0],arr[1],arr[2]))
SS.fit(tall_2d)

SS.transform(arr[0])
SS.transform(arr[1])
SS.transform(arr[2])

Я предполагаю, что я буду выполнять интерполяцию для каждой последовательности отдельно, так что мне стоит кодировать и выявлять выбросы по отдельности?

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

  • В 2D данных ‘sample==row’. Вы не подгоняете по одному образцу.
  • В 3D данных ‘sample==sequence’, поэтому вы кодируете все последовательности.

Это также означает меньше кодировщиков, за которыми нужно следить ради обратной трансформации и кодирования для вывода.

Ответ или решение

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

Масштабирование данных

Если у вас есть три последовательности одинаковой длины, вы можете масштабировать их как отдельно, так и вместе. Давайте рассмотрим оба подхода:

  1. Отдельное масштабирование:
    В этом случае вы будете применять fit и transform на каждой последовательности независимо:

    SS.fit_transform(arr[0])
    SS.fit_transform(arr[1])
    SS.fit_transform(arr[2])

    Однако этот метод имеет свои недостатки. Он не учитывает общую статистику (средние значения, стандарты отклонения и т.д.) между последовательностями. Это может привести к различиям в масштабах между вашими рядами, что нежелательно, если вы собираетесь использовать их для сравнения или в рамках одной модели.

  2. Агрегированное масштабирование:
    Вы можете агрегировать все ваши последовательности в один массив и затем применить fit к этому объединенному массиву:

    tall_2d = np.concatenate((arr[0], arr[1], arr[2]))
    SS.fit(tall_2d)
    
    arr[0] = SS.transform(arr[0])
    arr[1] = SS.transform(arr[1])
    arr[2] = SS.transform(arr[2])

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

Интерполяция и детектирование выбросов

Как вы упомянули, если вы интерполируете данные по отдельности, то логично проводить и кодирование, а также детектирование выбросов отдельно для каждой последовательности. Логика такова:

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

Выводы

В общем, в зависимости от вашей задачи и модели, могут быть разные подходы к масштабированию:

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

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

Оцените материал
Добавить комментарий

Капча загружается...