Створюйте точні прогнози, які можна інтерпретувати
Відповідно до [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 речі:
- Створіть фрейм даних pandas із нашими даними часового ряду.
- Загорніть наш фрейм даних у a TimeSeriesDataset екземпляр
- Передайте наші TimeSeriesDataset екземпляр до
TemporalFusionTransformer.
Команда TimeSeriesDataset дуже корисний, оскільки він допомагає нам визначити, чи є функції змінними в часі чи статичними. Крім того, це єдиний формат, який TemporalFusionTransformer
приймає.
Давайте створимо мінімальний навчальний набір даних, щоб показати, як це зробити TimeSeriesDataset робіт:
Ми повинні відформатувати наші дані таким чином: кожен кольоровий квадрат представляє різні часові ряди, представлені його group
value.
Найважливішим стовпцем нашого фрейму даних є 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()
Давайте побудуємо перший місяць кожного часового ряду:
Помітної тенденції немає, але кожен часовий ряд має дещо іншу сезонність і амплітуду. Ми можемо далі експериментувати та перевіряти стаціонарність, розкладання сигналу тощо, але в нашому випадку ми зосереджуємось лише на аспекті побудови моделі.
Також зауважте, що інші методи прогнозування часових рядів, як АРІМА має задовольняти декілька вимог (наприклад, часовий ряд повинен спочатку стати стаціонарним). За допомогою 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).
Результати досить вражаючі.
наш Тимчасовий термоядерний трансформатор модель змогла охопити поведінку всіх 5 часових рядів, як з точки зору сезонності, так і величини!
Також зауважте, що:
- Ми не виконували жодного налаштування гіперпараметрів.
- Ми не впроваджували жодних хитромудрих технологій розробки функцій.
У наступному розділі ми покажемо, як покращити нашу модель за допомогою оптимізації гіперпараметрів.
Побудуйте прогнози для конкретного часового ряду
Раніше ми будували прогнози на основі даних перевірки за допомогою idx
аргумент, який повторює всі часові ряди в нашому наборі даних. Ми можемо бути більш конкретними та виводити прогнози для конкретного часового ряду:
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:
Точне прогнозування - це одне, але пояснюваність також має велике значення в наш час.
І ще гірше для моделей глибокого навчання, які вважаються чорними ящиками. Методи, такі як LIME та ФОРМА може забезпечити пояснення (певною мірою), але погано працює для часових рядів. Крім того, вони є зовнішніми post-hoc методами і не прив’язані до конкретної моделі.
Тимчасовий термоядерний трансформатор забезпечує три типи інтерпретації:
- Сезонність: TFT використовує його новаторство Інтерпретована багатоголова увага механізм розрахунку важливості минулих кроків у часі.
- Щодо функцій: TFT використовує його Мережа вибору змінних модуль для обчислення важливості кожної функції.
- Стійкість до екстремальних подій: Ми можемо дослідити, як поводяться часові ряди під час рідкісних подій
Якщо ви хочете глибше дізнатися про внутрішню роботу Інтерпретована багатоголова увага та Мережа вибору змінних, перегляньте мою попередню статтю.
Інтерпретація з урахуванням сезонності
TFT досліджує вагові коефіцієнти уваги, щоб зрозуміти часові закономірності протягом минулих часових кроків.
Сірі лінії на всіх попередніх графіках представляють бали уваги. Подивіться ще раз на ці сюжети — ви щось помітили? малюнок 8 показує висновки малюнок 7 а також враховує бали уваги:
Показники уваги показують, наскільки впливовими є ті часові кроки, коли модель виводить свій прогноз. Невеликі піки відображають добову сезонність, тоді як вищий пік до кінця, ймовірно, означає тижневу сезонність.
Якщо ми усереднимо криві уваги за всіма часовими кроками та часовими рядами (а не лише за 5, які ми використовували в цьому посібнику), ми отримаємо симетричну форму в малюнок 9 з TFT паперу:
Питання: Що в цьому хорошого? Хіба ми не можемо просто оцінити моделі сезонності за допомогою таких методів, як графіки ACF, декомпозиція сигналу часу тощо?
Відповідь: правда Однак вивчення ваги уваги TFT має додаткові переваги:
- Ми можемо підтвердити, що наша модель фіксує явну сезонну динаміку наших послідовностей.
- Наша модель також може виявити приховані шаблони, оскільки ваги уваги поточних вікон введення враховують усі минулі введення.
- Діаграма вагових коефіцієнтів уваги – це не те саме, що графік автокореляції: графік автокореляції відноситься до певної послідовності, тоді як ваги уваги тут зосереджуються на впливі кожного кроку в часі, розглядаючи всі коваріати та часові ряди.
Функціональна інтерпретація
Команда Мережа вибору змінних компонент TFT можна легко оцінити важливі функції:
In малюнок 10, помічаємо наступне:
- Команда
hour
таday_of_week
мають сильні бали, як минулі спостереження, так і майбутні коваріати. Тест в оригінальній статті поділяє той самий висновок. - Команда
power_usage
очевидно, є найбільш впливовою спостережуваною коваріантою. - Команда
consumer_id
тут не дуже важливий, оскільки ми використовуємо лише 5 споживачів. У TFT-папері, де автори використовують усі 370 споживачів, ця змінна більш значуща.
Примітка: Якщо ваша статична змінна групування не важлива, дуже ймовірно, що ваш набір даних також можна змоделювати однаково добре за допомогою єдиної моделі розподілу (наприклад, ARIMA).
Виявлення екстремальних подій
Часові ряди сумно відомі тим, що вони чутливі до раптових змін своїх властивостей під час рідкісних подій (також відомих як шоки).
Що ще гірше, ці події дуже невловимі. Уявіть, що ваша цільова змінна стає нестабільною на короткий період через те, що коваріата мовчки змінює поведінку:
Це якийсь випадковий шум чи прихований постійний шаблон, який вислизає від нашої моделі?
За допомогою TFT ми можемо аналізувати надійність кожної окремої функції в діапазоні значень. На жаль, поточний набір даних не демонструє нестабільності чи рідкісних подій — вони, швидше за все, можна знайти у фінансових даних, даних про продажі тощо. І все ж ми покажемо, як їх розрахувати:
Деякі функції не мають усіх своїх значень у наборі даних перевірки, тому ми показуємо лише hour
та 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
<!–
->
- Біткойн
- bizbuildermike
- blockchain
- відповідність блокчейну
- блокчейн-конференція
- Консультанти з блокчейнів
- coinbase
- coingenius
- Консенсус
- криптоконференція
- криптографічне видобування
- криптовалюта
- Децентралізований
- Defi
- Цифрові активи
- Ефіріума
- навчання за допомогою машини
- не замінний маркер
- plato
- платон ai
- Інформація про дані Платона
- Платоблокчейн
- PlatoData
- platogaming
- Багатокутник
- доказ ставки
- W3
- зефірнет