Temporal Fusion Transformer: prognozowanie szeregów czasowych z głębokim uczeniem — kompletny samouczek

Twórz dokładne i interpretowalne prognozy

Utworzono z DALLE [1]

Według [2], Transformator fuzyjny czasowy przewyższa wszystkie popularne modele Deep Learning do prognozowania szeregów czasowych.

W tym wyróżnione Drzewo wzmacniające gradient model tabelarycznych szeregów czasowych.

Ale co to jest Tymczasowy transformator termojądrowy (TFT) [3] i dlaczego jest to takie interesujące?

W tym artykule pokrótce wyjaśniamy nowości Transformator fuzyjny czasowy i zbuduj na nim kompleksowy projekt Prognozowanie zapotrzebowania na energię. W szczególności omówimy:

  • Jak przygotować nasze dane do formatu TFT.
  • Jak zbudować, trenować i oceniać model TFT.
  • Jak uzyskać prognozy dotyczące danych walidacyjnych i prognoz poza próbą.
  • Jak obliczyć znaczenie cech, wzorce sezonowości, i odporność na zdarzenia ekstremalne korzystając z wbudowanego modelu interpretowalną uwagę mechanizm.

Nurkujmy!

Aby uzyskać dogłębną analizę architektury Temporal Fusion Transformer, sprawdź mój poprzedni artykuł.

Temporalny Fużycie Tprzestępca (TFT) to model oparty na transformatorze, który wykorzystuje samouważność do uchwycenia złożonej dynamiki czasowej wielu sekwencji czasowych.

TFT obsługuje:

  • Wiele szeregów czasowych: Możemy trenować model TFT na tysiącach jednowymiarowych lub wielowymiarowych szeregów czasowych.
  • Prognozowanie wielohoryzontalne: Model generuje wieloetapowe prognozy dotyczące jednej lub większej liczby zmiennych docelowych — łącznie z przedziałami predykcji.
  • Cechy heterogeniczne: TFT obsługuje wiele typów funkcji, w tym zmienne czasowe i statyczne zmienne egzogeniczne.
  • Interpretowalne prognozy: Prognozy można interpretować w kategoriach zmiennej ważności i sezonowości.

Jedna z tych cech jest wyjątkowa Transformator fuzyjny czasowy. Omówimy to w następnej sekcji.

Wśród godnych uwagi modeli szeregów czasowych DL (np. GłębokiAR[4]), TFT wyróżnia się tym, że obsługuje różnego rodzaju funkcje. To są:

  • Zmienne w czasie znany
  • Zmienne w czasie nieznany
  • Niezmienny czas real
  • Niezmienny czas kategoryczny

Na przykład wyobraźmy sobie, że mamy przypadek prognozowania sprzedaży:

Załóżmy, że musimy przewidzieć sprzedaż 3 produktów. The num sales jest zmienną docelową. The CPI index albo number of visitors jest zmienna w czasie nieznana funkcje, ponieważ są one znane tylko do czasu przewidywania. Jednakże, holidaysi special days jest znane zmienne w czasie wydarzenia.

Połączenia product id is kategoria niezmienna w czasie (statyczna). funkcja. Inne funkcje, które są numeryczne i niezależne od czasu, takie jak yearly_revenue można sklasyfikować jako rzeczywisty niezmienny w czasie.

Zanim przejdziemy do naszego projektu, pokażemy najpierw mini tutorial jak przekonwertować dane do formatu rozszerzony format szeregów czasowych.

Uwaga: Wszystkie obrazy i ryciny w tym artykule są autorstwa autora.

W tym samouczku używamy TemporalFusionTransformer model z Prognozowanie w PyTorch biblioteka i PyTorch Lightning:

pip zainstaluj torch pytorch-lightning pytorch_forecasting

Cały proces obejmuje 3 rzeczy:

  1. Utwórz ramkę danych pandy z naszymi danymi szeregów czasowych.
  2. Zawiń naszą ramkę danych w plik Zestaw danych TimeSeries instancja.
  3. Przekaż nasze Zestaw danych TimeSeries instancja do TemporalFusionTransformer.

Połączenia Zestaw danych TimeSeries jest bardzo przydatne, ponieważ pomaga nam określić, czy cechy są zmienne w czasie, czy statyczne. Poza tym jest to jedyny format, który to umożliwia TemporalFusionTransformer akceptuje.

Utwórzmy minimalny zestaw danych szkoleniowych, aby pokazać, jak to zrobić Zestaw danych TimeSeries prace:

Powinniśmy sformatować nasze dane w następujący sposób: Każde kolorowe pole reprezentuje inny szereg czasowy, reprezentowany przez jego group wartość.

Rysunek 1: Ramka danych pandy sample_data

Najważniejszą kolumną naszej ramki danych jest time_idx — określa kolejność próbek. Jeżeli nie brakuje żadnych obserwacji, wartości należy zwiększyć o +1 dla każdego szeregu czasowego.

Następnie zawijamy naszą ramkę danych w plik a Zestaw danych TimeSeries instancja:

Wszystkie argumenty są oczywiste: The max_encoder_length określa okres ważności i max_prediction_length określa liczbę przewidywanych punktów danych. W naszym przypadku spoglądamy wstecz o 3 kroki w przeszłość, aby uzyskać 2 prognozy.

Połączenia Zestaw danych TimeSeries instancja służy teraz jako moduł ładujący dane. Wydrukujmy partię i sprawdźmy w jaki sposób nasze dane zostaną przekazane do TFT:

Ta partia zawiera wartości szkoleniowe [0,1] z pierwszego szeregu czasowego (group 0) i wartości testowe[2,3,4]. Jeśli ponownie uruchomisz ten kod, otrzymasz inne wartości, ponieważ dane są domyślnie tasowane.

Nasz projekt będzie korzystał z Schematy obciążenia energii elektrycznej20112014 [5] zbiór danych z UCI. Notatnik dla tego przykładu można pobrać ze strony tutaj:

Ten zbiór danych zawiera zużycie energii (w KW) przez 370 klientów/konsumentów z częstotliwością 15-minutową. Dane obejmują 4 lata (2011–2014).

Część odbiorników powstała po 2011 roku, zatem ich pobór prądu początkowo wynosi zero.

Przetwarzamy dane wg [3]:

  • Agreguj naszą zmienną docelową power_usage według godziny.
  • Znajdź najwcześniejszą datę dla każdego szeregu czasowego, którego potęga jest różna od zera.
  • Utwórz nowe funkcje: month, day, hour i day_of_week.
  • Wybierz wszystkie dni pomiędzy 2014–01–01 i 2014–09–07.

Zaczynajmy:

Pobierz dane

wget https://archive.ics.uci.edu/ml/machine-learning-databases/00321/LD2011_2014.txt.zip
!rozsunąć suwak
LD2011_2014.txt.zip

Wstępne przetwarzanie danych

Każda kolumna reprezentuje konsumenta. Najbardziej początkowe power_usage wartości wynoszą 0.

Następnie agregujemy do danych godzinowych. Ze względu na rozmiar i złożoność modelu uczymy nasz model tylko na 5 konsumentach (dla tych z wartościami niezerowymi).

Teraz przygotowujemy nasz zbiór danych dla Zestaw danych TimeSeries format. Zauważ, że każda kolumna reprezentuje inny szereg czasowy. Dlatego „topimy” naszą ramkę danych, tak aby wszystkie szeregi czasowe były ułożone pionowo, a nie poziomo. W trakcie tego procesu tworzymy nowe funkcje.

Nazywa się końcową, wstępnie przetworzoną ramkę danych time_df. Wydrukujmy jego zawartość:

Połączenia time_df ma teraz właściwy format dla pliku Zestaw danych TimeSeries. Jak już się domyśliłeś, ponieważ szczegółowość jest godzinowa, hours_from_start zmienna będzie indeks czasu.

Analiza danych rozpoznawczych

Wybór 5 konsumentów/szeregów czasowych nie jest przypadkowy. The power usage każdej serii czasowej ma inne właściwości, takie jak wartość średnia:

time_df[['identyfikator_konsumenta','wykorzystanie_mocy']].groupby('id_konsumenta').mean()

Narysujmy pierwszy miesiąc każdego szeregu czasowego:

Rysunek 2: Pierwszy miesiąc ze wszystkich 5 szeregów czasowych/konsumentów.

Nie ma zauważalnego trendu, ale każda seria czasowa charakteryzuje się nieco inną sezonowością i amplitudą. Możemy dalej eksperymentować i sprawdzać stacjonarność, dekompozycję sygnału i tak dalej, ale w naszym przypadku skupiamy się tylko na aspekcie budowania modelu.

Należy również zauważyć, że inne metody prognozowania szeregów czasowych, takie jak ARIMA musi spełniać kilka wymagań (np. szereg czasowy musi najpierw stać się stacjonarny). Dzięki TFT możemy pozostawić nasze dane bez zmian.

Utwórz moduły ładujące dane

W tym kroku przekazujemy nasze time_df do Zestaw danych serii czasowej formacie, który jest niezwykle przydatny, ponieważ:

  • Oszczędza nam to pisania własnego Dataloadera.
  • Możemy określić, w jaki sposób TFT będzie obsługiwać funkcje zbioru danych.
  • Z łatwością możemy znormalizować nasz zbiór danych. W naszym przypadku normalizacja jest obowiązkowa, ponieważ wszystkie sekwencje czasowe różnią się wielkością. Dlatego używamy Normalizator grupowy normalizować każdy szereg czasowy indywidualnie.

Nasz model wykorzystuje tygodniowy okres ważności (7*24), aby przewidzieć zużycie energii w ciągu najbliższych 24 godzin.

Zauważ też, że hours_from_start jest zarówno indeksem czasu, jak i cechą zmienną w czasie. The power_usage jest naszą zmienną docelową. W celach demonstracyjnych nasz zestaw walidacyjny to ostatni dzień:

Model podstawowy

Następnie krok, o którym prawie wszyscy zapominają: model bazowy. Szczególnie w przypadku prognozowania szeregów czasowych będziesz zaskoczony, jak często naiwny predyktor przewyższa nawet bardziej wyszukany model!

Jako naiwną linię bazową przewidujemy krzywą zużycia energii z poprzedniego dnia:

Trening modelu transformatora syntezy czasowej

Możemy wytrenować nasz model TFT, korzystając ze znanych nam rozwiązań Trener interfejs z PyTorch Lightning.

Zwróć uwagę na następujące rzeczy:

  • Używamy Wczesne zatrzymanie wywołanie zwrotne w celu monitorowania utraty walidacji.
  • Używamy pliki Tablica Tensorowa do rejestrowania naszych wskaźników szkoleniowych i walidacyjnych.
  • Nasz model wykorzystuje Strata kwantylowa — specjalny rodzaj straty, który pomaga nam wyprowadzić przedziały predykcji. Aby uzyskać więcej informacji na temat funkcji straty kwantylowej, sprawdź ten artykuł.
  • Używamy 4 uwaga, głowyjak oryginalny papier.

Jesteśmy teraz gotowi do zbudowania i trenowania naszego modelu:

Otóż ​​to! Po 6 epokach włącza się funkcja EarlyStopping i przerywa trening.

Załaduj i zapisz najlepszy model

Nie zapomnij zapisać swojego modelu. Chociaż możemy to zamarynować, najbezpieczniejszą opcją jest bezpośrednie zapisanie najlepszej epoki:

!zip -r model.zip błyskawica_logs/lightning_logs/wersja_1/*

Aby ponownie załadować model, rozpakuj model.zip i wykonaj następujące czynności — po prostu zapamiętaj najlepszą ścieżkę modelu:

Sprawdź Tensorboard

Przyjrzyj się bliżej krzywym uczenia i walidacji za pomocą Tensorboard:

Ocena modelu

Uzyskaj prognozy dotyczące zestawu walidacyjnego i oblicz średnią P50 (mediana kwantylu) od:

Ostatnie 2 szeregi czasowe mają nieco większą stratę, ponieważ ich względna wielkość jest również wysoka.

Wykreśl przewidywania na podstawie danych walidacyjnych

Jeśli przejdziemy mode=raw na przepowiadać, wywróżyć() Dzięki tej metodzie uzyskujemy więcej informacji, w tym przewidywania dla wszystkich siedmiu kwantyli. Mamy także dostęp do wartości uwagi (więcej o tym później).

Przyjrzyj się bliżej raw_predictions zmienna:

Używamy plot_prediction() do tworzenia naszych działek. Oczywiście możesz stworzyć własną, niestandardową fabułę - plot_prediction() ma dodatkową zaletę polegającą na dodawaniu wartości uwagi.

Uwaga: Nasz model przewiduje kolejne 24 punkty danych za jednym razem. To nie jest scenariusz prognozowania kroczącego, w którym model przewiduje: pojedynczy wartość za każdym razem i „zszywa” wszystkie prognozy w jedną całość.

Dla każdego konsumenta tworzymy jedną działkę (w sumie 5).

Rysunek 3: Prognozy dotyczące danych walidacyjnych dla MT_002
Rysunek 4: Prognozy dotyczące danych walidacyjnych dla MT_004
Rysunek 5: Prognozy dotyczące danych walidacyjnych dla MT_005
Rysunek 6: Prognozy dotyczące danych walidacyjnych dla MT_006
Rysunek 7: Prognozy dotyczące danych walidacyjnych dla MT_008

Wyniki są dość imponujące.

Autonomiczne Transformator fuzyjny czasowy model był w stanie uchwycić zachowanie wszystkich 5 szeregów czasowych, zarówno pod względem sezonowości, jak i wielkości!

Zauważ też, że:

  • Nie wykonaliśmy żadnego dostrajania hiperparametrów.
  • Nie wdrożyliśmy żadnej wymyślnej techniki inżynierii cech.

W kolejnej sekcji pokażemy, jak ulepszyć nasz model za pomocą optymalizacji hiperparametrów.

Wykres przewidywań dla określonego szeregu czasowego

Wcześniej sporządzaliśmy prognozy na podstawie danych walidacyjnych za pomocą metody idx argument, który iteruje po wszystkich szeregach czasowych w naszym zbiorze danych. Możemy być bardziej szczegółowymi prognozami wyjściowymi dla określonego szeregu czasowego:

Rysunek 7: Prognozy na następny dzień dla MT_004 na zestawie treningowym

In Rysunek 7, planujemy następny dzień MT_004 konsument dla indeksu czasu=26512.

Pamiętaj, nasza kolumna z indeksowaniem czasu hours_from_start zaczyna się od 26304 i możemy uzyskać prognozy od 26388 wzwyż (ponieważ wcześniej ustawiliśmy min_encoder_length=max_encoder_length // 2 co równa się 26304 + 168//2=26388

Prognozy poza próbą

Stwórzmy prognozy poza próbą, poza ostatecznym punktem danych danych walidacyjnych – tj 2014–09–07 23:00:00

Wszystko, co musimy zrobić, to utworzyć nową ramkę danych zawierającą:

  • Liczba N=max_encoder_length daty przeszłe, które pełnią rolę okna retrospektywnego – tzw dane kodera w terminologii TFT.
  • Przyszłe daty wielkości max_prediction_length dla którego chcemy obliczyć nasze przewidywania — dane dekodera.

Możemy tworzyć prognozy dla wszystkich 5 naszych szeregów czasowych lub tylko jednego. Rysunek 7 pokazuje prognozy poza próbą dla konsumenta MT_002:

Rysunek 7: Prognoza dnia następnego dla MT_002

Dokładne prognozowanie to jedno, ale obecnie duże znaczenie ma także łatwość wyjaśnienia.

Jeszcze gorzej jest w przypadku modeli Deep Learning, które uznawane są za czarne skrzynki. Metody takie jak LIME i KSZTAŁT może zapewnić wyjaśnienie (w pewnym stopniu), ale nie działa dobrze w przypadku szeregów czasowych. Ponadto są to zewnętrzne metody post-hoc i nie są powiązane z konkretnym modelem.

Transformator fuzyjny czasowy zapewnia trzy rodzaje interpretowalności:

  • Sezonowość: TFT wykorzystuje swoją powieść Interpretowalna uwaga wielogłowa mechanizm obliczania ważności przeszłych kroków czasowych.
  • Pod względem funkcji: TFT wykorzystuje swoje możliwości Sieć wyboru zmiennych moduł do obliczania znaczenia każdej cechy.
  • Odporność na ekstremalne zdarzenia: Możemy zbadać, jak zachowują się szeregi czasowe podczas rzadkich zdarzeń

Jeśli chcesz dowiedzieć się głębiej o wewnętrznym działaniu Interpretowalna uwaga wielogłowa i Sieć wyboru zmiennych, sprawdź mój poprzedni artykuł.

Interpretacja pod kątem sezonowości

TFT bada wagi uwagi, aby zrozumieć wzorce czasowe w przeszłych krokach czasowych.

Szare linie na wszystkich poprzednich wykresach przedstawiają wyniki uwagi. Przyjrzyj się jeszcze raz tym wykresom – czy coś zauważyłeś? Rysunek 8 pokazuje ustalenia Rysunek 7 a także uwzględnia wyniki uwagi:

Rysunek 8: Prognoza dnia następnego dla MT_001 z wyświetlaną sezonowością

Wyniki uwagi pokazują, jak wpływ mają te etapy czasowe, gdy model generuje swoje prognozy. Małe szczyty odzwierciedlają dzienną sezonowość, podczas gdy wyższy szczyt pod koniec prawdopodobnie oznacza sezonowość tygodniową.

Jeśli uśrednimy krzywe uwagi we wszystkich krokach czasowych i szeregach czasowych (nie tylko 5, których użyliśmy w tym samouczku), otrzymamy symetrycznie wyglądający kształt Rysunek 9 z gazety TFT:

Rysunek 9: Wzorce czasowe dla zbioru danych dotyczących energii elektrycznej (Źródło)

Pytanie: Co to jest dobrego? Czy nie możemy po prostu oszacować wzorców sezonowości za pomocą metod takich jak wykresy ACF, rozkład sygnału czasowego itp.?

Odpowiedź: PRAWDA. Jednakże badanie wag uwagi w TFT ma dodatkowe zalety:

  1. Możemy potwierdzić, że nasz model oddaje pozorną sezonową dynamikę naszych sekwencji.
  2. Nasz model może również ujawnić ukryte wzorce, ponieważ wagi uwagi bieżących okien wejściowych uwzględniają wszystkie przeszłe dane wejściowe.
  3. Wykres wag uwagi nie jest tym samym, co wykres autokorelacji: wykres autokorelacji odnosi się do określonej sekwencji, podczas gdy wagi uwagi skupiają się tutaj na wpływie każdego kroku czasowego, patrząc na wszystkie współzmienne i szeregi czasowe.

Interpretowalność pod względem funkcji

Połączenia Sieć wyboru zmiennych składnik TFT może łatwo oszacować znaczenie funkcji:

Rysunek 10: Zawiera znaczenie danych walidacyjnych

In Rysunek 10, zauważamy, co następuje:

  • Połączenia hour i day_of_week mają dobre wyniki, zarówno jako obserwacje z przeszłości, jak i przyszłe współzmienne. Benchmark w oryginalnym artykule zawiera ten sam wniosek.
  • Połączenia power_usage jest oczywiście najbardziej wpływową obserwowaną współzmienną.
  • Połączenia consumer_id nie ma tutaj większego znaczenia, ponieważ używamy tylko 5 konsumentów. W artykule TFT, gdzie autorzy wykorzystali wszystkich 370 konsumentów, zmienna ta jest bardziej znacząca.

Uwaga: Jeśli statyczna zmienna grupująca nie jest ważna, jest bardzo prawdopodobne, że zbiór danych można równie dobrze modelować za pomocą pojedynczego modelu rozkładu (takiego jak ARIMA).

Wykrywanie ekstremalnych zdarzeń

Szeregi czasowe są znane z tego, że są podatne na nagłe zmiany swoich właściwości podczas rzadkich zdarzeń (tzw wstrząsy).

Co gorsza, te wydarzenia są bardzo nieuchwytne. Wyobraź sobie, że zmienna docelowa staje się na krótki czas zmienna, ponieważ zmienna towarzysząca cicho zmienia zachowanie:

Czy to jakiś przypadkowy szum, czy ukryty, trwały wzór, który wymyka się naszemu modelowi?

Dzięki TFT możemy analizować solidność każdej indywidualnej funkcji w całym zakresie jej wartości. Niestety, obecny zbiór danych nie wykazuje zmienności ani rzadkich zdarzeń – częściej można je znaleźć w danych finansowych, sprzedażowych itp. Mimo to pokażemy, jak je obliczyć:

Niektóre funkcje nie mają wszystkich wartości w zbiorze danych walidacyjnych, dlatego pokazujemy tylko hour i consumer_id:

Rysunek 11: Prognozy a wartości rzeczywiste (średnie znormalizowane) na godzinę
Rysunek 12: Prognozy a wartości rzeczywiste (średnie znormalizowane) dla Consumer_id

Wyniki na obu wykresach są zachęcające. W Rysunek 12, zauważamy tego konsumenta MT_004 osiąga nieco słabsze wyniki w porównaniu z innymi konsumentami. Moglibyśmy to zweryfikować, normalizując stratę P50 każdego konsumenta z jego średnim zużyciem energii, które obliczyliśmy wcześniej.

Szare słupki oznaczają rozkład każdej zmiennej. Jedną rzeczą, którą zawsze robię, jest znajdowanie, które wartości mają niską częstotliwość. Następnie sprawdzam, jak model radzi sobie w tych obszarach. Dzięki temu można łatwo wykryć, czy model rejestruje zachowanie rzadkich zdarzeń.

Ogólnie rzecz biorąc, możesz użyć tej funkcji TFT, aby zbadać swój model pod kątem słabych punktów i przystąpić do dalszego badania.

Możemy bezproblemowo korzystać Transformator fuzyjny czasowy w Optować aby wykonać strojenie hiperparametrów:

Problem w tym, że ponieważ TFT jest modelem opartym na Transformatorze, będziesz potrzebować znacznych zasobów sprzętowych!

Transformator fuzyjny czasowy jest niewątpliwie kamieniem milowym dla społeczności Time-Series.

Model nie tylko osiąga wyniki SOTA, ale także zapewnia ramy dla interpretacji przewidywań. Model dostępny także w wersji Rzutki Pythona, która jest oparta na bibliotece PyTorch Forecasting.

Wreszcie, jeśli jesteś ciekawy, aby poznać architekturę Transformator fuzyjny czasowy szczegółowo, sprawdź artykuł towarzyszący na oryginalnym papierze.

Temporal Fusion Transformer: Prognozowanie szeregów czasowych za pomocą głębokiego uczenia się — kompletny samouczek ponownie opublikowany ze źródła https://towardsdatascience.com/temporal-fusion-transformer-time-series-forecasting-with-deep-learning-complete-tutorial-d32c1e51cd91?source= rss—-7f60cf5620c9—4 przez https://towardsdatascience.com/feed

<!–

->

Znak czasu:

Więcej z Konsultanci Blockchain