O primă privire la TimeGPT folosind Nixtlar

URMĂREȘTE-NE
16,065FaniÎmi place
1,142CititoriConectați-vă

(Acest articol a fost publicat pentru prima dată pe R funcționeazăși a contribuit cu drag la R-Bloggers). (Puteți raporta problema despre conținutul de pe această pagină aici)


Doriți să vă împărtășiți conținutul pe R-Bloggers? Faceți clic aici dacă aveți un blog sau aici dacă nu.

Această postare este o primă privire asupra lui Nixtla TimeGPT Transformator generativ, pre-instruit pentru previziuni ale seriilor de timp folosind nixtlar Pachet R.

Așa cum este descris în Garza și colab. (2021), TimeGPT este un model de serie de timp bazat pe transformatoare cu mecanisme de auto-atenție. Arhitectura cuprinde o structură de decodificator cu mai multe straturi, fiecare cu conexiuni reziduale și normalizare a straturilor. Codificatorul, o grămadă de straturi de auto-atenție cu mai multe capete, urmată de o rețea neuronală de avans, procesează seria de timp de intrare. Decodorul, care este similar cu codificatorul, generează prognoza. Decodorul include un strat suplimentar de atenție cu mai multe capete care ia ieșirea codificatorului ca intrare. Modelul este instruit folosind o strategie de alimentare a profesorilor, unde decodificatorul primește valorile adevărului la sol în timpul antrenamentului. Modelul este apoi utilizat pentru prognoză prin hrănirea predicțiilor modelului înapoi ca intrare în timpul inferenței.

Arhitectură TimeGPT

Site -ul NIXTLA oferă o cantitate considerabilă de materiale explicative, documentație și exemple de cod în Python. nixtlar Pachetul înfășoară codul Python pentru a furniza o interfață R. Documentația pachetului pentru versiunea 0.6.2 nu este pe deplin funcțiile R, dar vinietele oferă exemple de cod suficiente pentru a începe.

Înainte de a începe cu TimeGPT, va trebui să vă înregistrați pentru o cheie API. Procesul este destul de ușor și este descris în această vinie.

Afișați codul
library(tidyverse)
library(forecast)
library(xts)
library(prophet)
library(nixtlar)

Datele

Setul de date privind energia electrică inclus în nixtlar Pachetul conține observații pe oră ale consumului de energie electrică generată provenită de la PJM Interconection LLC, o organizație regională de transmisie care face parte din rețeaua de interconectare estică din Statele Unite. Există cinci serii de timp diferite, cu date luate din 2012 până în 2018. O privire asupra cadrului de date arată că diversele serii nu acoperă aceleași perioade de timp.

Afișați codul
df <- nixtlar::electricity

df_wide <- df |>
  pivot_wider(names_from = unique_id, values_from = y)

head(df_wide)
# A tibble: 6 × 6
  ds                     BE    DE    FR    NP   PJM
                     
1 2016-10-22 00:00:00  70      NA  54.7    NA    NA
2 2016-10-22 01:00:00  37.1    NA  51.2    NA    NA
3 2016-10-22 02:00:00  37.1    NA  48.9    NA    NA
4 2016-10-22 03:00:00  44.8    NA  45.9    NA    NA
5 2016-10-22 04:00:00  37.1    NA  41.2    NA    NA
6 2016-10-22 05:00:00  35.6    NA  41.4    NA    NA

Parcele indică faptul că toate seriile prezintă perioade de volatilitate considerabilă. Seria Be, DE și FR pare a fi staționară. NP tendințe în sus, iar seria PJM pare a fi neliniară.

Afișați codul
df2 <- df |> mutate(time = as.POSIXct(ds, format = "%Y-%m-%d %H:%M:%S")) |>
  group_by(unique_id)

p <- df2 |> ggplot(aes(x = time, y = y, color = unique_id)) +
  geom_line() + facet_wrap( ~ unique_id, scales = "free")

p

Furne de timp

Voi începe prin a arăta nixtlar Funcția de prognoză, care poate gestiona mai multe serii de timp, prognozând cu opt ore înainte folosind toate datele. Parametrul h specifică numărul de pași înainte de prognoză și level Specifică nivelul de încredere pentru prognoză.

Aici este încorporat nixtlar Funcția de complot.

Afișați codul
nixtla_client_plot(df, nixtla_client_fcst, max_insample_length = 200)

Acest complot folosește ggplot2să se concentreze asupra prognozelor.

Afișați codul
# nixtla_client_fcst <- nixtla_client_forecast(df, h = 8, level = c(80,95))
# saveRDS(nixtla_client_fcst, "nixtla_client_fcst.rds")

nixtla_client_fcst <- readRDS("nixtla_client_fcst.rds")

ncf_df <-  nixtla_client_fcst |> mutate(time = as.POSIXct(ds, format = "%Y-%m-%d %H:%M:%S")) |> group_by(unique_id)

names(ncf_df) <- c("unique_id", "ds", "TimeGPT", "lon", "loe", "hie", "hin")

pf <- ncf_df |> ggplot(aes(x = ds, y = TimeGPT, color = unique_id)) +
  geom_line() +
  geom_ribbon(aes(ymin = lon, ymax = hin),
              linetype = 2,
              alpha = 0.1) +
  facet_wrap( ~ unique_id, scales = "free")

pf

Pentru restul acestei postări, voi lucra doar cu datele Be și voi face câteva testări simple înapoi. Voi împărți datele într -un set de instruire și un set de teste care conține 24 de ore în valoare de observații. Apoi, mă voi potrivi cu modelele de prognoză a seriilor de timp și voi compara cât de bine se descurcă față de datele reale și unul cu celălalt. Rețineți, nu voi încerca nicio reglare a acestor modele. Acest lucru va face o comparație corectă, „în afara casei”.

Afișați codul
NF <- 24

BE_df_wide <- df |> pivot_wider(names_from = unique_id, values_from = y) |>
  select(ds, BE) |> drop_na()

BE_train_df <- BE_df_wide %>% filter(row_number() <= n() - NF)
BE_test_df <- tail(BE_df_wide, NF)
BE_train_df <- BE_train_df |> rename(y = BE) |> mutate(unique_id = "BE")
BE_test_df <- BE_test_df |> rename(y = BE)

nixtla_client_forecast() Funcția este principala nixtlar Funcție de prognoză. (Am rulat deja această funcție și am salvat fișierul RDS Rezultate pentru a nu efectua un apel API de fiecare dată când codul este rulat în timpul procesului de construire a blogului.)

Afișați codul
# nixtla_fcst <- nixtla_client_forecast(BE_train_df, h = NF, level = 95)
# saveRDS(nixtla_fcst, "nixtla_fcst.rds")
nixtla_fcst <- readRDS("nixtla_fcst.rds")
names(nixtla_fcst) <- c("unique_id", "ds", "TimeGPT", "lo95", "up95")

Aici, creez un cadru de date pentru a deține valorile reale și prognozate.

Afișați codul
fcst_df <- tail(nixtla_fcst, NF) |> select(ds, TimeGPT) |>
  rename(time = ds, tgpt_fcst = TimeGPT) |>
  mutate(elec_actual = BE_test_df$y)

head(fcst_df)
                 time tgpt_fcst elec_actual
1 2016-12-30 00:00:00  38.82010       44.30
2 2016-12-30 01:00:00  36.29234       44.30
3 2016-12-30 02:00:00  34.97838       41.26
4 2016-12-30 03:00:00  32.99565       40.62
5 2016-12-30 04:00:00  31.58322       40.07
6 2016-12-30 05:00:00  33.27422       41.02

Unele prognoze comparative

Prognoza Arima cu auto.arima()

auto.arima() Funcție din forecast Pachetul se potrivește cu un model ARIMA (2,1,1). Aceasta înseamnă doi termeni autoregresivi, o diferență și un termen mediu în mișcare.

Afișați codul
arima_train <- BE_train_df |> select(-unique_id) |>
  mutate(time = as.POSIXct(ds, format = "%Y-%m-%d %H:%M:%S"))

arima_train <- arima_train |> select(-ds)

elec_ts <- as.xts(arima_train)

arima_fcst <- elec_ts |>
  auto.arima() |>
  # number of periods to forecast
  forecast(h = NF , level = 95)

Prognoză exponențială de netezire cu ets()

Pentru că nu am oferit nicio îndrumare, ets() Funcție din forecast Pachetul se potrivește unui model ETS (A, A, N) cu o eroare aditivă, o tendință aditivă și fără sezonalitate. Toți parametrii sunt estimați din date.

Afișați codul
ets_fcst <- elec_ts |>
  ets() |>
  # number of periods to forecast
  forecast(h = NF)

Profetul Profet

Îl întreb și pe prophet() Funcție din prophet Pachet pentru o potrivire automată folosind parametrii impliciti. Printre altele, acest lucru înseamnă o curbă de creștere liniară, cu sezonalitate aditivă și estimări automate pentru sezonalitatea zilnică. Ca mai sus, modelul este potrivit pentru datele din BE_train_df cadru de date, dar aici, make_future_dataframe() funcția creează un cadru de date cu aceeași structură ca BE_train_df Dar cu ds coloană extinsă de NF perioade.

Afișați codul
prophet_fit <- prophet(BE_train_df)

future <- make_future_dataframe(
  prophet_fit,
  periods = NF,
  freq = 3600,
  include_history = FALSE
)

prophet_fcst <- predict(prophet_fit, future)

Rezultate și discuții

Înainte de a complota, să aruncăm o privire asupra cadrului de date larg care deține prognozele.

Afișați codul
fcst_df2 <- fcst_df |>
  mutate(
    arima_fcst = as.vector(arima_fcst$mean),
    ets_fcst = as.vector(ets_fcst$mean),
    prophet_fcst = prophet_fcst$yhat
  )

head(fcst_df2)
                 time tgpt_fcst elec_actual arima_fcst ets_fcst prophet_fcst
1 2016-12-30 00:00:00  38.82010       44.30   46.60606 43.10791     32.09818
2 2016-12-30 01:00:00  36.29234       44.30   47.83980 42.33006     29.78621
3 2016-12-30 02:00:00  34.97838       41.26   48.52490 41.70778     22.70913
4 2016-12-30 03:00:00  32.99565       40.62   48.90180 41.20996     15.90205
5 2016-12-30 04:00:00  31.58322       40.07   49.10927 40.81171     15.67207
6 2016-12-30 05:00:00  33.27422       41.02   49.22347 40.49310     23.59276

Apoi, modelați datele în format lung și complot.

Afișați codul
fcst_dft2_long <- fcst_df2 %>%
  pivot_longer(!time, names_to = "method", values_to = "mean")

q <- fcst_dft2_long |>
  ggplot(aes(
    x = time,
    y = mean,
    group = method,
    color = method
  )) +
  geom_line() +
  geom_point() +
  ggtitle("TimeGPT vs ARIMA vs ETS vs Prophet vs actual data")

q

Este evident că prognoza de timp arată destul de bine. Nu cred că aceasta este o mare surpriză, având în vedere că oamenii din Nixtla au ales setul de date de energie electrică pentru a -și arăta transformatorul. Cu toate acestea, este curios, că, cu excepția unui punct, prognoza TimeGPT este mai mică decât datele reale. De asemenea, este interesant faptul că unele dintre prognozele care sunt mai departe sunt o potrivire mai bună cu datele reale decât prognozele pentru punctele inițiale de prognoză.

Modelul Profetului „fără gând” face o treabă destul de bună, dar se pare că a depășit tendințele descendente la începutul și sfârșitul perioadei de prognoză. Presupunerea mea este că, cu un mic profet de reglare ar putea face mult mai bine.

Modelul ARIMA este o dezamăgire. M -aș fi așteptat să urmeze unele dintre răsuciri și viraje. La prima vedere, prognoza exponențială de netezire pare a fi excepțională! Urmărește datele efective destul de îndeaproape pentru primele șase puncte de prognoză. S -ar putea ca prognoza seriei de timp să fie atinsă în 1956? Dacă vă jucați puțin cu datele, cred că veți constata că, în acest caz, potrivirea strânsă a modelului de netezire exponențială este o combinație de aleatoriu și fenomenul unui ceas oprit fiind chiar de două ori pe zi.

Se pare, de asemenea, ca și cum modelele exponențiale de netezire și ARIMA ar fi aruncat o monedă la începutul prognozei pentru a decide cine ia drumul înalt și cine primește drumul scăzut, dar apoi s -a urmărit reciproc până la capăt. Cu toate acestea, dacă cereți modelelor să prognozeze doar ultimele opt puncte de date, veți vedea că modelul ARIMA este pe drumul mare.

De asemenea, este demn de remarcat faptul că alegerea celei mai bune prognoze depinde și de obiectivele efortului de modelare. De exemplu, se poate interesa mai mult o prognoză care arată tipare sezoniere, mai degrabă decât o precizie generală pe un număr de perioade de prognoză. Următorul tabel arată eroarea pătrată medie a rădăcinii (RMS) pentru cele patru modele diferite calculate pe 8, 16 și 24 de perioade de prognoză, împreună cu mijloacele lor generale.

Vedem că TimeGPT face cel mai bine atât la precizie, cât și la urmărirea datelor, dar că atât ARIMA, cât și ETS arată o precizie mai bună decât Profetul.

Afișați codul
rms <- read.csv("rms.csv")
rms
  fcst_periods     tpgt    arima       ets  prophet
1            8 3.342365 7.741460  5.256222 15.97618
2           16 4.545948 9.129550  7.199374 13.15787
3           24 6.601751 7.123968 13.636910 14.94871
4         mean 4.830021 7.998326  8.697502 14.69425

Câteva gânduri finale

Este clar că modelul TimeGPT a crescut jocul pentru previziunile seriilor de timp Black-Box. Este sigur că va deveni un instrument puternic pentru a face lucrări exploratorii cu serii de timp mari și pentru a compara și contrasta mai multe serii de timp și poate deveni instrumentul de prognoză de bază „merge-la” pentru o gamă largă de serii de timp. Mai mult, mă aștept ca experții din seria de timp care pot regla profetul și modelele mai tradiționale de serii de timp vor putea dezvolta o oarecare intuiție cu privire la ceea ce face TimeGPT prin evaluarea comportamentului său în raport cu aceste modele.

Sunt conștient de faptul că această mică postare ar fi putut ridica mai multe întrebări decât a răspuns. Dacă da, vă rugăm să încercați mâna la elaborarea unor probleme ridicate. Am fi foarte fericiți să luăm în considerare postările din seria de timp pentru publicarea pe lucrările R.

În cele din urmă, pentru o analiză mai sofisticată a acestor serii, care se ocupă de aspectele lor multisasonalii, consultați tutorialul privind prognoza de încărcare a energiei electrice. Și, pentru câteva idei despre cum să valorificăm LLM -urile „obișnuite” pentru prognoza seriei de timp, aruncați o privire la a doua jumătate a discuției pe care Bryan Lewis a oferit -o lui Nyhackr în aprilie 2024.

Dominic Botezariu
Dominic Botezariuhttps://www.noobz.ro/
Creator de site și redactor-șef.

Cele mai noi știri

Pe același subiect

LĂSAȚI UN MESAJ

Vă rugăm să introduceți comentariul dvs.!
Introduceți aici numele dvs.