Темпоральний термоядерний трансформатор: Прогнозування часових рядів за допомогою глибокого навчання — Повний посібник

Створюйте точні прогнози, які можна інтерпретувати

Created with DALLE [1]

Відповідно до [2], Тимчасовий термоядерний трансформатор перевершує всі відомі моделі глибокого навчання для прогнозування часових рядів.

У тому числі представлений Дерево посилення градієнта модель для табличних даних часового ряду.

Але що є Тимчасовий термоядерний трансформатор (TFT)[3] і чому це так цікаво?

У цій статті ми коротко пояснюємо новинки Тимчасовий термоядерний трансформатор і створити наскрізний проект Прогнозування попиту на енергію. Зокрема, ми розглянемо:

  • Як підготувати наші дані для формату TFT.
  • Як побудувати, навчити та оцінити модель TFT.
  • Як отримати прогнози на основі даних перевірки та прогнозів поза вибіркою.
  • Як розрахувати важливість функцій, моделі сезонності, та стійкість до екстремальних подій за допомогою вбудованої моделі інтерпретована увага механізм.

Давай пірнути!

Для поглибленого аналізу архітектури Temporal Fusion Transformer перегляньте мій попередній стаття.

Tемпоральний Fusion Tтрансформер (TFT) — це модель на основі Transformer, яка використовує самоувагу, щоб охопити складну часову динаміку кількох часових послідовностей.

TFT підтримує:

  • Кілька часових рядів: Ми можемо навчити модель TFT на тисячах однофакторних або багатофакторних часових рядів.
  • Багатогоризонтне прогнозування: Модель виводить багатокрокові прогнози однієї або кількох цільових змінних, включаючи інтервали прогнозування.
  • Неоднорідні особливості: TFT підтримує багато типів функцій, включаючи змінні в часі та статичні екзогенні змінні.
  • Інтерпретовані передбачення: Прогнози можна інтерпретувати з точки зору змінної важливості та сезонності.

Одна з цих рис унікальна Тимчасовий термоядерний трансформатор. Ми розглянемо це в наступному розділі.

Серед відомих моделей часових рядів DL (наприклад, DeepAR[4]), TFT виділяється тим, що підтримує різні типи функцій. Це:

  • Змінний у часі відомий
  • Змінний у часі невідомий
  • Інваріантний у часі реальний
  • Інваріантний у часі категоричний

Наприклад, уявіть, що ми маємо a кейс прогнозування продажів:

Припустимо, ми повинні передбачити продажі 3 продуктів. The num sales є цільовою змінною. The CPI index або number of visitors він має невідомий, що змінюється в часі функції, оскільки вони відомі лише до часу передбачення. однак, holidaysта special days він має змінні в часі відомі події

Команда product id is незмінний у часі (статичний) категоричний функція. Інші функції, які є чисельними і не залежать від часу, наприклад yearly_revenue можна класифікувати як незмінні в часі дійсні.

Перш ніж перейти до нашого проекту, ми спочатку покажемо міні-підручник про те, як конвертувати ваші дані в розширений формат часових рядів.

Примітка: Усі зображення та малюнки в цій статті створені автором.

Для цього підручника ми використовуємо TemporalFusionTransformer модель від Прогнозування PyTorch бібліотека та PyTorch Lightning:

pip встановити факел pytorch-блискавка pytorch_forecasting

Весь процес включає 3 речі:

  1. Створіть фрейм даних pandas із нашими даними часового ряду.
  2. Загорніть наш фрейм даних у a TimeSeriesDataset екземпляр
  3. Передайте наші TimeSeriesDataset екземпляр до TemporalFusionTransformer.

Команда TimeSeriesDataset дуже корисний, оскільки він допомагає нам визначити, чи є функції змінними в часі чи статичними. Крім того, це єдиний формат, який TemporalFusionTransformer приймає.

Давайте створимо мінімальний навчальний набір даних, щоб показати, як це зробити TimeSeriesDataset робіт:

Ми повинні відформатувати наші дані таким чином: кожен кольоровий квадрат представляє різні часові ряди, представлені його group value.

Фігура 1: Фрейм даних sample_data pandas

Найважливішим стовпцем нашого фрейму даних є time_idx — визначає послідовність вибірок. Якщо немає пропущених спостережень, значення мають збільшитися на +1 для кожного часового ряду.

Далі ми обертаємо наш фрейм даних у a TimeSeriesDataset примірник:

Усі аргументи зрозумілі самі за себе: The max_encoder_length визначає період огляду та max_prediction_length визначає, скільки точок даних буде передбачено. У нашому випадку ми переглядаємо 3 часові кроки в минулому, щоб вивести 2 передбачення.

Команда TimeSeriesDataset екземпляр тепер служить завантажувачем даних. Давайте надрукуємо пакет і перевіримо, як наші дані будуть передані на TFT:

Цей пакет містить навчальні значення [0,1] з першого часового ряду (group 0) і тестові значення[2,3,4]. Якщо ви повторно запустите цей код, ви отримаєте інші значення, оскільки дані перемішуються за замовчуванням.

Наш проект буде використовувати Діаграми навантажень електроенергії20112014 [5] набір даних від UCI. Блокнот для цього прикладу можна завантажити з тут:

Цей набір даних містить споживання електроенергії (у кВт) 370 клієнтами/споживачами з частотою 15 хвилин. Дані охоплюють 4 роки (2011–2014).

Деякі споживачі були створені після 2011 року, тому їх споживання електроенергії спочатку дорівнює нулю.

Ми проводимо попередню обробку даних відповідно до [3]:

  • Агрегувати нашу цільову змінну power_usage по годинах.
  • Знайдіть найранішу дату для кожного часового ряду, де потужність відмінна від нуля.
  • Створіть нові функції: month, day, hour та day_of_week.
  • Виберіть усі дні між ними 2014–01–01 та 2014–09–07.

Давайте розпочнемо:

Завантажити дані

Wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!розпакувати
LD2011_2014.txt.zip

Попередня обробка даних

Кожен стовпець представляє споживача. Самий початковий power_usage значення 0.

Далі ми збираємо дані за годину. Через розмір і складність моделі ми тренуємо нашу модель лише на 5 споживачах (для тих із ненульовими значеннями).

Тепер ми готуємо наш набір даних для TimeSeriesDataset формат. Зверніть увагу, що кожен стовпець представляє різний часовий ряд. Тому ми «плавимо» наш фрейм даних, щоб усі часові ряди складалися вертикально, а не горизонтально. У процесі ми створюємо наші нові функції.

Викликається остаточний попередньо оброблений кадр даних time_df. Роздрукуємо його вміст:

Команда time_df зараз у відповідному форматі для TimeSeriesDataset. Як ви вже здогадалися, оскільки деталізація погодинна, то hours_from_start змінна буде покажчик часу.

Дослідницький аналіз даних

Вибір 5 споживачів/часовий ряд не є випадковим. The power usage кожного часового ряду має різні властивості, такі як середнє значення:

time_df[['consumer_id','power_usage']].groupby('consumer_id').mean()

Давайте побудуємо перший місяць кожного часового ряду:

Малюнок 2: Перший місяць усіх 5 часових рядів/споживачів.

Помітної тенденції немає, але кожен часовий ряд має дещо іншу сезонність і амплітуду. Ми можемо далі експериментувати та перевіряти стаціонарність, розкладання сигналу тощо, але в нашому випадку ми зосереджуємось лише на аспекті побудови моделі.

Також зауважте, що інші методи прогнозування часових рядів, як АРІМА має задовольняти декілька вимог (наприклад, часовий ряд повинен спочатку стати стаціонарним). За допомогою TFT ми можемо залишити наші дані як є.

Створення DataLoaders

На цьому кроці ми передаємо наші time_df до TimeSeriesDataSet формат, який є надзвичайно корисним, оскільки:

  • Це позбавляє нас від написання власного Dataloader.
  • Ми можемо вказати, як TFT оброблятиме функції набору даних.
  • Ми можемо легко нормалізувати наш набір даних. У нашому випадку нормалізація є обов'язковою, оскільки всі часові послідовності відрізняються за величиною. Таким чином, ми використовуємо Нормалізатор груп нормалізувати кожен часовий ряд окремо.

Наша модель використовує ретроспективне вікно в один тиждень (7*24), щоб передбачити енергоспоживання протягом наступних 24 годин.

Також зауважте, що hours_from_start є як індексом часу, так і ознакою, що змінюється в часі. The power_usage це наша цільова змінна. Для демонстрації, наш набір перевірки останній день:

Базова модель

Далі крок, про який майже всі забувають: базова модель. Особливо в прогнозуванні часових рядів, ви будете здивовані тим, як часто наївний прогноз перевершує навіть більш химерну модель!

Як базову лінію ми прогнозуємо криву енергоспоживання за попередній день:

Навчання моделі тимчасового термоядерного трансформатора

Ми можемо навчити нашу модель TFT за допомогою знайомої тренер інтерфейс від PyTorch Lightning.

Зверніть увагу на такі речі:

  • Ми використовуємо Рання зупинка зворотний виклик для моніторингу втрати підтвердження.
  • Ми використовуємо Тензорна дошка для реєстрації наших показників навчання та перевірки.
  • Наша модель використовує Квантильна втрата — особливий тип втрат, який допомагає нам виводити інтервали передбачення. Щоб дізнатися більше про функцію Quantile Loss, перевірте цю статтю.
  • Ми використовуємо 4 увагу голів, як оригінальний папір.

Тепер ми готові створити та навчити нашу модель:

Це воно! Після 6 епох EarlyStopping запускається та зупиняє тренування.

Завантажте та збережіть найкращу модель

Не забудьте зберегти свою модель. Хоча ми можемо його замаринувати, найбезпечнішим варіантом є збереження найкращої епохи безпосередньо:

!zip -r model.zip lightning_logs/lightning_logs/version_1/*

Щоб знову завантажити модель, розархівуйте model.zip і виконайте наступне — просто запам’ятайте найкращий шлях моделі:

Перевірте Tensorboard

Подивіться ближче на криві навчання та перевірки за допомогою Tensorboard:

Оцінка моделі

Отримайте прогнози щодо набору перевірки та обчисліть середнє значення P50 (медіана квантиля) від:

Останні 2 часові ряди мають дещо вищі втрати, оскільки їх відносна величина також висока.

Побудуйте прогнози на основі даних перевірки

Якщо ми пройдемо mode=raw на передбачити() ми отримуємо більше інформації, включаючи прогнози для всіх семи квантилів. Ми також маємо доступ до значень уваги (про це пізніше).

Подивіться уважніше на raw_predictions змінна:

Ми використовуємо plot_prediction() для створення наших ділянок. Звичайно, ви можете створити свій власний сюжет — plot_prediction() має додаткову перевагу додавання значень уваги.

Примітка: Наша модель передбачає наступні 24 точки даних за один раз. Це не постійний сценарій прогнозування, коли модель передбачає a один цінує кожен раз і «зшиває» всі передбачення разом.

Для кожного споживача створюємо одну ділянку (всього 5).

Малюнок 3: Прогнози щодо даних перевірки для MT_002
Малюнок 4: Прогнози щодо даних перевірки для MT_004
Малюнок 5: Прогнози щодо даних перевірки для MT_005
Малюнок 6: Прогнози щодо даних перевірки для MT_006
Малюнок 7: Прогнози щодо даних перевірки для MT_008

Результати досить вражаючі.

наш Тимчасовий термоядерний трансформатор модель змогла охопити поведінку всіх 5 часових рядів, як з точки зору сезонності, так і величини!

Також зауважте, що:

  • Ми не виконували жодного налаштування гіперпараметрів.
  • Ми не впроваджували жодних хитромудрих технологій розробки функцій.

У наступному розділі ми покажемо, як покращити нашу модель за допомогою оптимізації гіперпараметрів.

Побудуйте прогнози для конкретного часового ряду

Раніше ми будували прогнози на основі даних перевірки за допомогою idx аргумент, який повторює всі часові ряди в нашому наборі даних. Ми можемо бути більш конкретними та виводити прогнози для конкретного часового ряду:

Малюнок 7: Прогноз на день вперед для MT_004 на навчальному майданчику

In Малюнок 7, ми плануємо день наперед MT_004 споживач для часового індексу=26512.

Пам'ятайте, наша колонка індексування часу hours_from_start починається з 26304, і ми можемо отримати прогнози з 26388 і далі (оскільки ми встановили раніше min_encoder_length=max_encoder_length // 2 що дорівнює 26304 + 168//2=26388

Прогнози поза вибіркою

Давайте створимо прогнози поза вибіркою, за межами кінцевої точки даних перевірки — що є 2014–09–07 23:00:00

Все, що нам потрібно зробити, це створити новий фрейм даних, який містить:

  • Кількість N=max_encoder_length минулі дати, які діють як вікно огляду — the дані кодера у термінології TFT.
  • Майбутні дати розміру max_prediction_length для якого ми хочемо обчислити наші прогнози — дані декодера.

Ми можемо створити прогнози для всіх 5 наших часових рядів або лише для одного. малюнок 7 показує прогнози для споживача поза вибіркою MT_002:

Малюнок 7: Прогноз на день вперед для MT_002

Точне прогнозування - це одне, але пояснюваність також має велике значення в наш час.

І ще гірше для моделей глибокого навчання, які вважаються чорними ящиками. Методи, такі як LIME та ФОРМА може забезпечити пояснення (певною мірою), але погано працює для часових рядів. Крім того, вони є зовнішніми post-hoc методами і не прив’язані до конкретної моделі.

Тимчасовий термоядерний трансформатор забезпечує три типи інтерпретації:

  • Сезонність: TFT використовує його новаторство Інтерпретована багатоголова увага механізм розрахунку важливості минулих кроків у часі.
  • Щодо функцій: TFT використовує його Мережа вибору змінних модуль для обчислення важливості кожної функції.
  • Стійкість до екстремальних подій: Ми можемо дослідити, як поводяться часові ряди під час рідкісних подій

Якщо ви хочете глибше дізнатися про внутрішню роботу Інтерпретована багатоголова увага та Мережа вибору змінних, перегляньте мою попередню статтю.

Інтерпретація з урахуванням сезонності

TFT досліджує вагові коефіцієнти уваги, щоб зрозуміти часові закономірності протягом минулих часових кроків.

Сірі лінії на всіх попередніх графіках представляють бали уваги. Подивіться ще раз на ці сюжети — ви щось помітили? малюнок 8 показує висновки малюнок 7 а також враховує бали уваги:

Малюнок 8: Прогноз на день вперед для MT_001 із відображенням сезонних змін

Показники уваги показують, наскільки впливовими є ті часові кроки, коли модель виводить свій прогноз. Невеликі піки відображають добову сезонність, тоді як вищий пік до кінця, ймовірно, означає тижневу сезонність.

Якщо ми усереднимо криві уваги за всіма часовими кроками та часовими рядами (а не лише за 5, які ми використовували в цьому посібнику), ми отримаємо симетричну форму в малюнок 9 з TFT паперу:

Малюнок 9: Часові шаблони для набору даних електроенергії (Source)

Питання: Що в цьому хорошого? Хіба ми не можемо просто оцінити моделі сезонності за допомогою таких методів, як графіки ACF, декомпозиція сигналу часу тощо?

Відповідь: правда Однак вивчення ваги уваги TFT має додаткові переваги:

  1. Ми можемо підтвердити, що наша модель фіксує явну сезонну динаміку наших послідовностей.
  2. Наша модель також може виявити приховані шаблони, оскільки ваги уваги поточних вікон введення враховують усі минулі введення.
  3. Діаграма вагових коефіцієнтів уваги – це не те саме, що графік автокореляції: графік автокореляції відноситься до певної послідовності, тоді як ваги уваги тут зосереджуються на впливі кожного кроку в часі, розглядаючи всі коваріати та часові ряди.

Функціональна інтерпретація

Команда Мережа вибору змінних компонент TFT можна легко оцінити важливі функції:

Малюнок 10: Особливості важливості даних перевірки

In малюнок 10, помічаємо наступне:

  • Команда hour та day_of_week мають сильні бали, як минулі спостереження, так і майбутні коваріати. Тест в оригінальній статті поділяє той самий висновок.
  • Команда power_usage очевидно, є найбільш впливовою спостережуваною коваріантою.
  • Команда consumer_id тут не дуже важливий, оскільки ми використовуємо лише 5 споживачів. У TFT-папері, де автори використовують усі 370 споживачів, ця змінна більш значуща.

Примітка: Якщо ваша статична змінна групування не важлива, дуже ймовірно, що ваш набір даних також можна змоделювати однаково добре за допомогою єдиної моделі розподілу (наприклад, ARIMA).

Виявлення екстремальних подій

Часові ряди сумно відомі тим, що вони чутливі до раптових змін своїх властивостей під час рідкісних подій (також відомих як шоки).

Що ще гірше, ці події дуже невловимі. Уявіть, що ваша цільова змінна стає нестабільною на короткий період через те, що коваріата мовчки змінює поведінку:

Це якийсь випадковий шум чи прихований постійний шаблон, який вислизає від нашої моделі?

За допомогою TFT ми можемо аналізувати надійність кожної окремої функції в діапазоні значень. На жаль, поточний набір даних не демонструє нестабільності чи рідкісних подій — вони, швидше за все, можна знайти у фінансових даних, даних про продажі тощо. І все ж ми покажемо, як їх розрахувати:

Деякі функції не мають усіх своїх значень у наборі даних перевірки, тому ми показуємо лише hour та consumer_id:

Малюнок 11: Прогнози проти фактичних (нормализованих середніх) на годину
Малюнок 12: Прогнози та фактичні значення (нормализовані середні значення) для consumer_id

На обох рисунках результати надихають. в малюнок 12, помічаємо, що споживач MT_004 трохи поступається порівняно з іншими споживачами. Ми могли б перевірити це, якщо нормалізувати втрати P50 кожного споживача з їхнім середнім енергоспоживанням, яке ми розрахували раніше.

Сірі смуги позначають розподіл кожної змінної. Одне, що я завжди роблю, це знаходжу значення, які мають низьку частоту. Потім я перевіряю, як модель працює в цих областях. Таким чином, ви можете легко визначити, чи ваша модель фіксує поведінку рідкісних подій.

Загалом, ви можете використовувати цю функцію TFT, щоб перевірити вашу модель на слабкі місця та перейти до подальшого дослідження.

Ми можемо безперешкодно використовувати Тимчасовий термоядерний трансформатор з Оптуна щоб виконати налаштування гіперпараметрів:

Проблема полягає в тому, що оскільки TFT є моделлю на основі Transformer, вам знадобляться значні апаратні ресурси!

Тимчасовий термоядерний трансформатор безсумнівно, є важливою віхою для спільноти Time-Series.

Модель не тільки забезпечує результати SOTA, але й забезпечує основу для інтерпретації прогнозів. Модель також доступна в Дартс бібліотека python, яка базується на бібліотеці прогнозування PyTorch.

Нарешті, якщо вам цікаво дізнатися про архітектуру с Тимчасовий термоядерний трансформатор детально перевірте супутня стаття на оригінальному папері.

Temporal Fusion Transformer: Time Series Forecasting with Deep Learning — Повний навчальний посібник перепубліковано з джерела https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—7f60cf5620c9—4 через https://towardsdatascience.com/feed

<!–

->

Часова мітка:

Більше від Консультанти з блокчейнів