Вопрос или проблема
Допустим, у меня есть 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’, поэтому вы кодируете все последовательности.
Это также означает меньше кодировщиков, за которыми нужно следить ради обратной трансформации и кодирования для вывода.
Ответ или решение
При обработке многократных временных рядов важно учитывать, как вы будете масштабировать и кодировать ваши данные. Ваша задача заключается в том, чтобы решить, следует ли масштабировать каждый ряд данных отдельно или в агрегированном виде.
Масштабирование данных
Если у вас есть три последовательности одинаковой длины, вы можете масштабировать их как отдельно, так и вместе. Давайте рассмотрим оба подхода:
-
Отдельное масштабирование:
В этом случае вы будете применятьfit
иtransform
на каждой последовательности независимо:SS.fit_transform(arr[0]) SS.fit_transform(arr[1]) SS.fit_transform(arr[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])
Это обеспечит единообразное масштабирование для всех последовательностей, что может быть особенно полезно для моделей, которые требуют согласованной обработки данных (например, машинное обучение или глубокое обучение).
Интерполяция и детектирование выбросов
Как вы упомянули, если вы интерполируете данные по отдельности, то логично проводить и кодирование, а также детектирование выбросов отдельно для каждой последовательности. Логика такова:
- Интерполяция: Если данные содержат пропуски, интерполяцию следует выполнять на каждой последовательности, чтобы правильно обработать недостающие значения в контексте каждой линии времени.
- Детектирование выбросов: Для избежания некорректных выводов, выбросы также лучше детектировать отдельно, учитывая индивидуальные характеристики каждой последовательности.
Выводы
В общем, в зависимости от вашей задачи и модели, могут быть разные подходы к масштабированию:
- Если вы хотите обеспечить равномерный подход к масштабированию и у вас нет значительных различий между последовательностями, агрегированное масштабирование — это лучший выбор.
- Для специфических задач, где каждая последовательность может иметь свои уникальные особенности, может быть оправдано отдельное масштабирование.
Следовательно, в большинстве случаев правильнее будет использовать агрегацию данных для масштабирования. Управление кодировщиками (как вы отметили) также станет проще, если использовать единый скейлер для всех последовательностей.