(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.
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 PJM1 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 ggplot2
să 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.