Прогнозирование LSTM с одной категориальной функцией

Я новичок во временных рядах.
Это набор данных, над которым я работаю:

           Date   Price               Location
0    2012-01-01  1771.0                 Marche
1    2012-01-01  1039.0               Calabria
2    2012-01-01  2193.0               Campania
3    2012-01-01  2015.0         Emilia-Romagna
4    2012-01-01  1483.0  Friuli-Venezia Giulia
...         ...     ...                    ...
2475 2022-04-01  1963.0                  Lazio
2476 2022-04-01  1362.0  Friuli-Venezia Giulia
2477 2022-04-01  1674.0         Emilia-Romagna
2478 2022-04-01  1388.0                 Marche
2479 2022-04-01  1103.0                Abruzzo

Я пытаюсь создать LSTM для прогнозирования цен, но я не знаю, как управлять категориальной функцией Место нахождения: нужно ли мне использовать однократное кодирование или групповое? То, что я хочу предсказать, это цена, основанная на местоположении.
Как я могу этого добиться? Решение Python особенно ценится.

Заранее спасибо.

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

Salvatore Daniele Bianco 09.05.2022 09:48

@SalvatoreDanieleBianco, а как насчет разделения? Я думаю, что я не могу использовать классический 70-30, верно?

Salvatore Danilo Palumbo 09.05.2022 09:54

У вас есть только один временной ряд? или больше? Как насчет длины? 2480?

Salvatore Daniele Bianco 09.05.2022 10:14

Для каждого региона у меня есть месяцы с 2012 по настоящее время (исключая май), так что-то вроде: <br> 2020-01-01 - цена - Сицилия <br> 2020-02-01 - цена - Сицилия И так далее

Salvatore Danilo Palumbo 09.05.2022 10:20

Хорошо понял. В этом случае мой совет состоит в том, чтобы рассматривать цены разных регионов как разные характеристики, чтобы получить набор данных формы (T, 20), где T — количество временных данных, а 20 — количество регионов. Для разделения на поезд-тест вы можете использовать 80-20, где тестовые 20% — это самая последняя часть временного ряда.

Salvatore Daniele Bianco 09.05.2022 10:31

@SalvatoreDanieleBianco, ты можешь мне помочь? Судя по имени, ты тоже итальянец ;)

Salvatore Danilo Palumbo 09.05.2022 12:30

да, я тоже итальянец :D Предоставьте в тексте воспроизводимый пример (например, 15 временных точек всего для 5 регионов), и я буду рад вам помочь. Если вы предпочитаете, вы можете указать случайные цены.

Salvatore Daniele Bianco 09.05.2022 13:40

Давайте продолжить обсуждение в чате.

Salvatore Danilo Palumbo 09.05.2022 14:30
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
2
8
33
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Предположим, мой набор данных (df) аналогичен вашему:

          Date       Price  Location
0   2021-01-01  791.076890  Campania
1   2021-01-01  705.702464  Lombardia
2   2021-01-01  719.991382  Sicilia
3   2021-02-01  825.760917  Lombardia
4   2021-02-01  747.734309  Sicilia
...        ...         ...        ...
31  2021-11-01  886.874348  Lombardia
32  2021-11-01  935.040583  Campania
33  2021-12-01  771.165378  Sicilia
34  2021-12-01  952.255227  Campania
35  2021-12-01  939.754515  Lombardia

В моем случае у меня есть запись Price для 3 регионов (Кампания, Ломбардия, Сицилия) каждый месяц. Моя идея состоит в том, чтобы рассматривать разные регионы как разные функции, поэтому я бы преобразовал df как:

df = df.set_index(["Date", "Location"]).Price.unstack()

Теперь мой набор данных выглядит так:

Location    Campania    Lombardia   Sicilia
Date            
2021-01-01  791.076890  705.702464  719.991382
2021-02-01  758.872755  825.760917  747.734309
2021-03-01  880.038005  803.165998  837.738419
       ...         ...         ...         ...
2021-10-01  908.402345  805.081193  792.369610
2021-11-01  935.040583  886.874348  736.862025
2021-12-01  952.255227  939.754515  771.165378

Пожалуйста, после этого убедитесь, что нет значений NaN (df.isna().sum()).

Теперь вы можете передать эти данные в многофункциональную RNN (или LSTM), как это сделано в этот пример, или в многоканальную 1D-CNN (выбрав соответствующий размер ядра). Единственной проблемой в обоих случаях может быть небольшой размер набора данных, поэтому постарайтесь не перепараметрировать модель (например, уменьшить количество нейронов и слоев), иначе переобучение будет неизбежным. Об этом вы можете протестировать модель на последних 20% вашего временного ряда:

from sklearn.model_selection import train_test_split
df_train, df_test = train_test_split(df, shuffle=False, test_size=.2)

Последняя часть — построить соответствие (X, Y) для контролируемого обучения, но это зависит от того, какую модель вы используете и какова ваша задача прогнозирования. Другой пример здесь.

Другие вопросы по теме