Вопрос или проблема
Вопрос 1:
У меня есть многомерный набор временных рядов. Для каждого временного шага есть 11 признаков и 1 выходное значение. Я собираюсь использовать контролируемое машинное обучение для прогнозирования выходного значения. Я понимаю, что в одновариантных случаях, если я собираюсь использовать данные за последние 3 дня для прогнозирования t-го дня, набор данных будет иметь формат
x(t-3) | x(t-2) | x(t-1) | x(t)
, где x(t) — это выходное значение, которое нужно предсказать.
Как мне отформатировать набор данных, когда это многомерная задача?
Я видел, что в некоторых ядрах задача оформляется как
x12(t-3) | x12(t-2) | x12(t-1) | x1(t), x2(t), ..., x12(t)
, где x12(t) — это выходное значение, которое нужно предсказать.
В этом случае переменные x1 до x11 за последние 3 дня игнорируются.
Тем не менее, эти переменные могут быть важны в моем случае. Могу ли я оформить задачу так:
x1(t-3),...,x12(t-3) | x1(t-2), ..., x12(t-2) | x1(t-1),..., x12(t-1) | x1(t), x2(t), ..., x12(t)
?
(некоторые из признаков — это просто день, месяц, день недели и т. д., созданные на основе индекса времени)
Вопрос 2:
С только 11 признаками, необходимо ли проводить отбор признаков?
Что касается того, как справиться с задачей многомерного временного ряда, я считаю, что ссылка на GitHub Timeseries multivariate будет полезной.
Вам нужно изменить n_inputs и n_outputs на 12 и 1 соответственно.
Я напишу более обобщенный ответ, и надеюсь, что он вам будет полезен.
Мы начинаем с набора данных $X$ с $N$ образцами, где каждый образец $F_x$ признаков, назовем $x_i \in \mathbb{R}^F$ и $i\in[0,N-1]$. Обратите внимание, что форма $X$ — $(N,F_x)$. У нас также есть $N$ целей, каждая из которых также может быть многомерной. Мы называем эти цели $Y$, с формой $(N,F_y)$. (обычно $F_y=1$)
Чтобы правильно отобрать признаки и цели из $X,Y$, сначала необходимо определить размер исторического образца и размер предсказания. Пусть $H$ обозначает размер истории, а $P$ — размер предсказания. Кортеж признаков и целей — это кортеж $(x,y)$, такой что форма $x$ — $(B,H,F_x)$, а форма $y$ — $(B,P,F_y)$.
Мы можем рассматривать $x$ как случайно отобранную партию из $H$ входных данных, каждая из которых имеет размер $F_x$, а $y$ как случайно отобранную партию из $P$ целей, каждая из которых имеет размер $F_y$
Используя PyTorch, можно реализовать пользовательский набор данных с помощью следующего (полу-псевдокода) метода __getitem__
:
def __getitem__(self, idx: int) -> Tuple[torch.Tensor, torch.Tensor]:
n_windows = N - H - P + 1
win_idx = idx // n_windows
features_window = features[win_idx: win_idx + H]
target_window = targets[win_idx + H: win_idx + H + p]
return features_window, target_window
Что касается вашего второго вопроса, количество признаков само по себе не решает вопрос о необходимости их отбора. Более подходящий вопрос — это взаимосвязь между этими признаками и есть ли корреляция, в результате которой возникает избыточность. Конечно, всегда можно попробовать и посмотреть результаты с разными наборами признаков.
Ответ или решение
Создание наборов данных с супервизией для прогнозирования многомерных временных рядов является важным шагом в разработке эффективных моделей машинного обучения. В следующем ответе я подробно объясню, как подготовить ваши данные в соответствии с вашими потребностями.
Q1: Форматирование данных для многомерного временного ряда
Когда вы работаете с многомерными временными рядами, важно учитывать все доступные функции из предыдущих временных шагов, чтобы взвешенные конфигурации могли вовлечь как текущую, так и предшествующую информацию для прогнозирования.
Форматирование данных
Допустим, у вас есть матрица данных, где каждая временная метка имеет 11 функций (x1, x2, …, x11) и 1 целевую переменную (y):
- Функции (Features): x1(t), x2(t), …, x11(t)
- Целевая переменная (Target): y(t)
Чтобы создать набор данных для модели машинного обучения, можно использовать следующие шаги:
-
Определите размер исторического окна (H): Например, мы хотим использовать данные за последние 3 дня (или 3 временных шага).
-
Формирование выборок: Вы можете сформировать данные в виде:
x1(t-3), x2(t-3), ..., x11(t-3) |
x1(t-2), x2(t-2), ..., x11(t-2) |
x1(t-1), x2(t-1), ..., x11(t-1) |
y(t)
Это означает, что для прогнозирования значения y(t) вы будете использовать функции из 3 предыдущих временных шагов. Таким образом, каждая строка в вашем новом наборе данных будет представлять информацию за последние 3 временных шага, и ваша модель получит доступ ко всем функциям за каждый временной шаг.
Пример кода на Python
Вот пример, как можно реализовать формирование данных с использованием библиотеки Pandas:
import pandas as pd
def create_supervised_data(df, n_steps):
X, y = [], []
for i in range(len(df) - n_steps):
X.append(df.iloc[i:i+n_steps].values) # Берем функции за последние n_steps
y.append(df.iloc[i+n_steps].values[-1]) # Берем значение цели
return np.array(X), np.array(y)
# Поход за набором данных с 11 функциями и 1 выходом
df = pd.DataFrame(data) # Ваши данные как DataFrame
X, y = create_supervised_data(df, 3) # Используем 3 временных шага
Q2: Необходимость выбора признаков
С учетом вашего вопроса о количестве функций. Всего 11 признаков не обязательно говорит о том, что выбор функций является лишним. Главное — это отношение между функциями. Если некоторые функции коррелируют друг с другом, вы можете столкнуться с избыточностью, которая может ухудшить производительность модели.
Рекомендации:
- Проведите анализ корреляции: Посмотрите, есть ли высоко коррелированные признаки и соответствует ли это вашим целям.
- Проверка с и без признаков: Попробуйте построить модели как с полным набором функций, так и с уменьшенной версией, исключая наиболее избыточные функции. Сравните метрики производительности.
- Используйте методы понижения размерности: Такие как PCA (метод главных компонент), чтобы уменьшить количество признаков, сохраняя при этом значимую информацию.
Итак, подход к формированию вашего датасета и выбор признаков может существенно повлиять на эффективность вашей модели. Удачи в ваших дальнейших разработках!