Faza 02 · lecția 15

Fundamentele seriilor temporale

Scopul lecției: Performanța din trecut poate prezice rezultatele viitoare — dacă verificați mai întâi staționaritatea.

Versiunea curentă AlexBred.com: primele 100 de lecții ale programului în limba română.

Curs
AI Engineering from Scratch
Fază
Bazele învățării automate
Lectură
27 min.
Verificat
Cuprinsul lecției
  1. Obiective de învățare
  2. Problema
  3. Conceptul
  4. Ce face ca seriile temporale să fie diferite
  5. Componentele unei serii temporale
  6. Staționaritatea
  7. Autocorelația
  8. Caracteristici decalate: transformarea seriei temporale în învățare supravegheată
  9. Validarea cu origine mobilă
  10. Intuiția ARIMA
  11. Ce abordare să folosiți și când
  12. Orizonturi și strategii de prognoză
  13. Greșeli frecvente în seriile temporale
  14. Construiți
  15. Creatorul caracteristicilor decalate
  16. Validarea încrucișată cu origine mobilă
  17. Model autoregresiv simplu
  18. Verificarea staționarității
  19. Autocorelația
  20. Folosiți
  21. TimeSeriesSplit din scikit-learn
  22. Metrici de evaluare
  23. Caracteristici mobile
  24. Livrați
  25. Repere pe care trebuie să le depășiți
  26. Sfaturi practice
  27. Exerciții
  28. Termeni-cheie
  29. Lecturi suplimentare

Performanța din trecut poate prezice rezultatele viitoare — dacă verificați mai întâi staționaritatea.

Tip: Construire Limbaj: Python Cerințe preliminare: Faza 2, lecțiile 01–09 Durată: ~90 de minute

Obiective de învățare

  • Să descompuneți o serie temporală în componente de tendință, sezonalitate și reziduu și să testați staționaritatea.
  • Să implementați caracteristici decalate și statistici mobile pentru a transforma o serie temporală într-o problemă de învățare supravegheată.
  • Să construiți un cadru de validare cu origine mobilă care împiedică scurgerea datelor viitoare în antrenare.
  • Să explicați de ce împărțirile aleatoare în seturi de antrenare și testare nu sunt valide pentru serii temporale și să demonstrați diferența de performanță față de împărțirile temporale corecte.

Problema

Aveți date ordonate în timp: vânzări zilnice, temperatură orară, utilizarea procesorului pe minut sau prețuri bursiere săptămânale. Doriți să preziceți valoarea următoare, săptămâna următoare ori trimestrul următor.

Apelați la instrumentarul ML obișnuit: împărțire aleatoare în seturi de antrenare și testare, validare încrucișată, matrice de caracteristici la intrare și predicție la ieșire. Fiecare pas este greșit.

Seriile temporale încalcă ipotezele pe care se bazează învățarea automată standard. Eșantioanele nu sunt independente — temperatura de astăzi depinde de cea de ieri. Împărțirile aleatoare lasă informații viitoare să se scurgă în trecut. Caracteristicile care par excelente la testarea retrospectivă eșuează în producție fiindcă se bazează pe tipare care se schimbă în timp.

Un model care obține o acuratețe de 95% prin validare încrucișată aleatoare ar putea obține 55% în urma unei evaluări temporale corecte. Diferența nu este un amănunt tehnic. Este diferența dintre un model care funcționează pe hârtie și unul care funcționează în producție.

Această lecție tratează fundamentele: de ce sunt diferite datele temporale, cum evaluați modelele onest și cum transformați o serie temporală în caracteristici pe care modelele ML standard le pot folosi.

Notă tehnică a traducerii: Staționaritatea nu este suficientă pentru ca trecutul să prezică viitorul, iar diferența numerică 95%–55% este doar ilustrativă. Prognozarea presupune că anumite tipare relevante persistă; rupturile structurale, variabilele omise și procesele apropiate de zgomot alb pot elimina predictibilitatea chiar și într-o serie staționară.

Conceptul

Ce face ca seriile temporale să fie diferite

Învățarea automată standard presupune date i.i.d. — independente și identic distribuite. Fiecare eșantion este extras din aceeași distribuție, independent de celelalte. Seriile temporale încalcă ambele condiții:

  • Nu sunt independente. Prețul bursier de astăzi depinde de cel de ieri. Vânzările din această săptămână se corelează cu cele din săptămâna trecută.
  • Nu sunt identic distribuite. Distribuția se schimbă în timp. Vânzările din decembrie arată altfel decât cele din martie.

Aceste încălcări nu sunt minore. Ele schimbă modul în care construiți caracteristicile, evaluați modelele și alegeți algoritmii potriviți.

Диаграмма к уроку «Fundamentele seriilor temporale»

În ML standard, eșantioanele sunt interschimbabile. Amestecarea lor nu schimbă nimic. În seriile temporale, ordinea este esențială. Amestecarea distruge semnalul.

Componentele unei serii temporale

Fiecare serie temporală este o combinație a următoarelor componente:

Диаграмма к уроку «Fundamentele seriilor temporale»

  • Tendință: direcția pe termen lung. Venituri care cresc cu 10% pe an. Temperatura globală în creștere.
  • Sezonalitate: tipare care se repetă la intervale fixe. Vânzările cu amănuntul cresc puternic în decembrie. Utilizarea aerului condiționat atinge maximul în iulie.
  • Reziduu: ceea ce rămâne după eliminarea tendinței și a sezonalității. Dacă reziduul seamănă cu zgomot alb, descompunerea a surprins semnalul.

Notă tehnică a traducerii: Nu orice serie este în mod unic sau complet suma acestor trei componente. Descompunerea depinde de modelul ales — aditiv, multiplicativ, STL etc. — și poate exista și o componentă ciclică fără perioadă fixă.

Staționaritatea

O serie temporală este staționară dacă proprietățile sale statistice — media, varianța și autocorelația — nu se schimbă în timp. Majoritatea metodelor de prognoză presupun staționaritatea.

De ce contează: o serie nestaționară are o medie care se deplasează. Un model antrenat pe datele din ianuarie a învățat o medie diferită de cea care ar putea apărea în februarie. Predicțiile sale pot fi sistematic greșite.

Cum o verificați: calculați media mobilă și abaterea standard mobilă în ferestre succesive. Dacă se deplasează, seria este nestaționară.

Cum o corectați: prin diferențiere. În loc să modelați valorile brute, modelați schimbarea dintre valori consecutive:

diff[t] = value[t] - value[t-1]

Dacă o diferențiere nu face seria staționară, aplicați-o din nou — diferențiere de ordinul al doilea. Majoritatea seriilor din lumea reală necesită cel mult două diferențieri.

Exemplu:

Seria originală: [100, 102, 106, 112, 120]

Prima diferență: [2, 4, 6, 8] — încă are tendință ascendentă

A doua diferență: [2, 2, 2] — constantă, deci staționară

Seria originală avea o tendință pătratică. Prima diferențiere a transformat-o într-o tendință liniară. A doua a făcut-o plată. În practică, rareori sunt necesare mai mult de două diferențieri.

Test formal: testul Augmented Dickey–Fuller (ADF) este testul statistic standard pentru staționaritate. Ipoteza nulă este „seria este nestaționară”. O valoare p sub 0,05 înseamnă că puteți respinge ipoteza nulă și concluziona staționaritatea. Nu implementăm ADF de la zero — necesită tabele de distribuții asimptotice — însă abordarea cu statistici mobile din codul nostru oferă o verificare vizuală practică.

Notă tehnică a traducerii: Respingerea ipotezei de rădăcină unitară nu demonstrează în sens general staționaritatea; rezultatul depinde de termenii deterministici, numărul de laguri, dimensiunea eșantionului și ipotezele testului. Statisticile mobile sunt euristici vizuale, nu un test formal. Diferențierea excesivă poate introduce autocorelație suplimentară și poate înrăutăți prognoza.

Autocorelația

Autocorelația măsoară cât de mult se corelează o valoare la momentul t cu valoarea de la momentul t-k, adică de acum k pași. Funcția de autocorelație (ACF) trasează această corelație pentru fiecare decalaj k.

ACF vă indică:

  • Cât de departe își amintește seria. Dacă ACF scade la zero după decalajul 5, valorile de acum mai mult de 5 pași sunt irelevante.
  • Dacă există sezonalitate. Dacă ACF are un vârf la decalajul 12 pentru date lunare, există sezonalitate anuală.
  • Câte caracteristici decalate să creați. Folosiți decalaje până în punctul în care ACF devine neglijabilă.

PACF — funcția de autocorelație parțială — elimină corelațiile indirecte. Dacă valoarea de astăzi se corelează cu cea de acum 3 zile numai fiindcă ambele se corelează cu cea de ieri, PACF la decalajul 3 va fi zero, deși ACF nu este.

Notă tehnică a traducerii: Un ACF apropiat de zero nu dovedește că trecutul este irelevant: poate exista dependență neliniară sau incertitudine mare a estimării. Semnificația decalajelor nu este o regulă automată pentru numărul de caracteristici.

Caracteristici decalate: transformarea seriei temporale în învățare supravegheată

Modelele ML standard au nevoie de o matrice de caracteristici X și de o țintă y. O serie temporală vă oferă o singură coloană de valori. Puntea dintre ele este reprezentată de caracteristicile decalate.

Luați seria [10, 12, 14, 13, 15] și creați caracteristicile cu decalajele 1 și 2:

lag_2 lag_1 țintă
10 12 14
12 14 13
14 13 15

Acum aveți o problemă standard de regresie. Orice model ML — regresie liniară, pădure aleatoare sau gradient boosting — poate prezice ținta din valorile decalate.

Caracteristici suplimentare pe care le puteți construi:

  • Statistici mobile: medie, abatere standard, minim și maxim pentru ultimele k valori.
  • Caracteristici calendaristice: ziua săptămânii, luna, indicator de sărbătoare și indicator de weekend.
  • Valori diferențiate: schimbarea față de pasul precedent.
  • Statistici cumulative: media și suma cumulativă.
  • Caracteristici de raport: valoarea curentă împărțită la media mobilă — abaterea de la media recentă.
  • Caracteristici de interacțiune: lag_1 * day_of_week — efectul zilei săptămânii asupra impulsului.

Câte decalaje? Folosiți funcția de autocorelație. Dacă ACF este semnificativă până la decalajul 10, folosiți cel puțin 10 decalaje. Dacă există sezonalitate săptămânală, includeți decalajul 7 și, eventual, 14. Mai multe decalaje oferă modelului mai mult istoric, dar și mai multe caracteristici de ajustat, crescând riscul de supraînvățare.

Capcana alinierii țintei. La crearea caracteristicilor decalate, ținta trebuie să fie valoarea de la momentul t, iar toate caracteristicile trebuie să folosească valori de la t-1 sau mai devreme. Dacă includeți accidental valoarea de la t drept caracteristică, obțineți un predictor perfect — și un model complet inutil. Aceasta este una dintre cele mai frecvente erori în ingineria caracteristicilor pentru serii temporale.

Validarea cu origine mobilă

Acesta este cel mai important concept al lecției. Validarea încrucișată standard cu k pliuri atribuie aleatoriu eșantioanele seturilor de antrenare și testare. Pentru seriile temporale, aceasta lasă informații viitoare să se scurgă.

Notă tehnică a traducerii: În scikit-learn, KFold nu amestecă implicit observațiile, însă rămâne nepotrivit pentru prognoza temporală deoarece unele pliuri pot antrena pe observații ulterioare celor testate. Problema esențială este ordinea temporală, nu numai aleatorizarea.

Диаграмма к уроку «Fundamentele seriilor temporale»

Validarea cu origine mobilă:

  1. Antrenați pe datele disponibile până la momentul t.
  2. Preziceți la t+1 sau de la t+1 la t+k pentru mai mulți pași.
  3. Deplasați fereastra înainte.
  4. Repetați.

Fiecare pliu de testare conține numai date ulterioare tuturor datelor sale de antrenare. Nu există scurgere din viitor. Astfel obțineți o estimare onestă a performanței pe care o va avea modelul după livrare.

O fereastră în expansiune folosește toate datele istorice pentru antrenare, iar fereastra crește. O fereastră glisantă folosește o fereastră de antrenare cu dimensiune fixă, care se deplasează. Folosiți fereastra în expansiune când considerați că datele vechi sunt încă relevante. Folosiți-o pe cea glisantă când mediul se schimbă și datele vechi dăunează.

Intuiția ARIMA

ARIMA este modelul clasic pentru serii temporale. Are trei componente:

  • AR — autoregresivă: prezice din valori trecute. AR(p) folosește ultimele p valori.
  • I — integrată: diferențiază pentru a obține staționaritatea. I(d) aplică d diferențieri.
  • MA — medie mobilă: prezice folosind erorile de prognoză trecute. MA(q) folosește ultimele q erori.

ARIMA(p, d, q) le combină pe toate trei. Alegeți p, d și q pe baza analizei ACF/PACF sau prin căutare automatizată — auto-ARIMA.

Nu vom implementa ARIMA de la zero — necesită optimizare numerică, în afara domeniului acestei lecții. Ideea esențială este să înțelegeți rolul fiecărei componente, ca să puteți interpreta rezultatele ARIMA și să știți când să folosiți modelul.

Ce abordare să folosiți și când

Abordare Potrivită în special pentru Tratează sezonalitatea Tratează caracteristici externe
Caracteristici decalate + ML Date tabelare cu multe caracteristici externe Prin caracteristici calendaristice Da
ARIMA O singură serie univariată, termen scurt Prin varianta SARIMA Nu — ARIMAX oferă regresori externi într-un cadru limitat
Netezire exponențială Tendință și sezonalitate simple Da, prin Holt–Winters Nu
Prophet Prognoze de afaceri și sărbători Da, prin termeni Fourier Limitat
Rețele neurale — LSTM, Transformer Secvențe lungi și multe serii Învățată Da

Pentru majoritatea problemelor practice, caracteristicile decalate împreună cu gradient boosting reprezintă cel mai puternic punct de pornire. Abordarea tratează natural caracteristicile externe, nu necesită staționaritate și este ușor de depanat.

Notă tehnică a traducerii: Nu există un punct de pornire universal superior. Alegerea depinde de volumul datelor, orizont, sezonalitate, costul erorilor și necesitatea intervalelor probabilistice. Modelele bazate pe arbori nu devin automat robuste la extrapolarea unei tendințe în afara intervalului văzut la antrenare.

Orizonturi și strategii de prognoză

Prognoza cu un singur pas prezice următorul moment. Prognoza cu mai mulți pași prezice mai multe momente. Există trei strategii:

Recursivă — iterativă: preziceți cu un pas înainte, apoi folosiți predicția drept intrare pentru pasul următor. Este simplă, dar erorile se acumulează, deoarece fiecare predicție o folosește pe cea precedentă.

Directă: antrenați un model separat pentru fiecare orizont. Modelul 1 prezice t+1, modelul 5 prezice t+5. Nu există propagarea recursivă a erorilor, însă fiecare model poate avea mai puține exemple aliniate și modelele nu partajează informații.

Cu ieșiri multiple: antrenați un singur model care emite simultan toate orizonturile. Partajează informații între orizonturi, dar necesită un model care acceptă mai multe ieșiri sau o funcție de pierdere personalizată.

Pentru majoritatea problemelor practice, începeți cu strategia recursivă pentru orizonturi scurte — 1–5 pași — și cu cea directă pentru orizonturi mai lungi.

Greșeli frecvente în seriile temporale

Greșeală De ce apare Cum o remediați
Împărțire aleatoare în antrenare și testare Obișnuință din ML standard Folosiți validare cu origine mobilă sau împărțire temporală
Folosirea caracteristicilor viitoare Caracteristica de la t este inclusă din greșeală Auditați alinierea temporală a fiecărei caracteristici
Supraajustarea la sezonalitate Modelul memorează tipare calendaristice Rezervați în testare un ciclu sezonier complet
Ignorarea schimbărilor de scară Veniturile se dublează, dar tiparele rămân Modelați schimbarea procentuală în locul valorii absolute, dacă este potrivit
Prea multe caracteristici decalate „Mai mult istoric este mai bun” Folosiți ACF și validarea temporală pentru a determina decalajele relevante
Lipsa diferențierii „Modelul își va da seama” Modelele cu arbori gestionează tendințele; modelele liniare necesită staționaritate

Notă tehnică a traducerii: Ultima regulă din tabel este o simplificare. Modelele liniare pot include termeni de tendință sau alte structuri explicite, iar modelele cu arbori pot avea dificultăți la extrapolarea unei tendințe dincolo de domeniul observat.

Construiți

Codul din code/time_series.py implementează de la zero elementele de bază.

Creatorul caracteristicilor decalate

def make_lag_features(series, n_lags):
    n = len(series)
    X = np.full((n, n_lags), np.nan)
    for lag in range(1, n_lags + 1):
        X[lag:, lag - 1] = series[:-lag]
    valid = ~np.isnan(X).any(axis=1)
    return X[valid], series[valid]

Această funcție transformă o serie unidimensională într-o matrice de caracteristici în care fiecare rând conține ultimele n_lags valori drept caracteristici, iar valoarea curentă drept țintă.

Validarea încrucișată cu origine mobilă

def walk_forward_split(n_samples, n_splits=5, min_train=50):
    assert min_train < n_samples, "min_train must be less than n_samples"
    step = max(1, (n_samples - min_train) // n_splits)
    for i in range(n_splits):
        train_end = min_train + i * step
        test_end = min(train_end + step, n_samples)
        if train_end >= n_samples:
            break
        yield slice(0, train_end), slice(train_end, test_end)

Fiecare împărțire asigură că datele de antrenare preced strict datele de testare. Fereastra de antrenare se extinde cu fiecare pliu.

Notă tehnică a traducerii: Dacă (n_samples - min_train) nu este divizibil cu n_splits, implementarea poate lăsa nefolosite ultimele observații. De asemenea, assert poate fi dezactivat când Python rulează cu optimizări; codul de producție ar trebui să valideze explicit parametrii și pliurile vide.

Model autoregresiv simplu

Un model AR pur este pur și simplu o regresie liniară pe caracteristici decalate:

class SimpleAR:
    def __init__(self, n_lags=5):
        self.n_lags = n_lags
        self.weights = None
        self.bias = None

    def fit(self, series):
        X, y = make_lag_features(series, self.n_lags)
        # Solve via normal equations
        X_b = np.column_stack([np.ones(len(X)), X])
        theta = np.linalg.lstsq(X_b, y, rcond=None)[0]
        self.bias = theta[0]
        self.weights = theta[1:]
        return self

Conceptual, acesta este identic cu regresia liniară din lecția 02, dar aplicat unor versiuni decalate temporal ale aceleiași variabile.

Verificarea staționarității

Codul calculează statistici mobile pentru a evalua vizual și numeric staționaritatea:

def check_stationarity(series, window=50):
    rolling_mean = np.array([
        series[max(0, i - window):i].mean()
        for i in range(1, len(series) + 1)
    ])
    rolling_std = np.array([
        series[max(0, i - window):i].std()
        for i in range(1, len(series) + 1)
    ])
    return rolling_mean, rolling_std

Dacă media mobilă se deplasează sau abaterea standard mobilă se schimbă, seria este nestaționară. Aplicați diferențierea și verificați din nou.

Codul verifică staționaritatea și prin compararea primei jumătăți cu a celei de-a doua. Dacă mediile diferă cu mai mult de jumătate de abatere standard sau raportul varianțelor depășește 2, seria este marcată drept nestaționară.

Notă tehnică a traducerii: Pragurile de jumătate de abatere standard și raport 2 sunt euristici ale exemplului, nu criterii statistice generale. O medie și o varianță aparent stabile nu verifică întreaga structură de autocovarianță cerută de staționaritatea slabă.

Autocorelația

def autocorrelation(series, max_lag=20):
    n = len(series)
    mean = series.mean()
    var = series.var()
    acf = np.zeros(max_lag + 1)
    for k in range(max_lag + 1):
        cov = np.mean((series[:n-k] - mean) * (series[k:] - mean))
        acf[k] = cov / var if var > 0 else 0
    return acf

Folosiți

Cu scikit-learn, folosiți caracteristicile decalate direct cu orice regresor:

from sklearn.linear_model import Ridge
from sklearn.ensemble import GradientBoostingRegressor

X, y = make_lag_features(series, n_lags=10)

for train_idx, test_idx in walk_forward_split(len(X)):
    model = Ridge(alpha=1.0)
    model.fit(X[train_idx], y[train_idx])
    predictions = model.predict(X[test_idx])

Pentru ARIMA, folosiți statsmodels:

from statsmodels.tsa.arima.model import ARIMA

model = ARIMA(train_series, order=(5, 1, 2))
fitted = model.fit()
forecast = fitted.forecast(steps=30)

Fișierul time_series.py demonstrează propriul model SimpleAR. Fragmentele ARIMA și TimeSeriesSplit ilustrează extensii posibile, însă această revizie a fișierului nu le implementează și nu compară strategiile prin validare cu origine mobilă.

Notă tehnică a traducerii: afirmația sursei despre conținutul fișierului este mai largă decât codul fixat. Pentru comparația reală a strategiilor, implementați ambele modele și evaluați-le cu împărțiri temporale identice.

TimeSeriesSplit din scikit-learn

scikit-learn oferă TimeSeriesSplit, care implementează împărțiri temporale cu ferestre de antrenare succesive:

from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
for train_index, test_index in tscv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)

Acesta este echivalent cu funcția noastră walk_forward_split implementată de la zero, dar este integrat în cadrul de validare încrucișată al scikit-learn. Îl puteți folosi cu cross_val_score:

from sklearn.model_selection import cross_val_score

scores = cross_val_score(model, X, y, cv=TimeSeriesSplit(n_splits=5))
print(f"Mean score: {scores.mean():.4f} +/- {scores.std():.4f}")

Notă tehnică a traducerii: TimeSeriesSplit nu este identic cu implementarea didactică: dimensiunea implicită a seturilor de testare și începutul ferestrelor diferă, iar clasa oferă test_size, max_train_size și gap. Pentru metrici comparabile între pliuri, documentația presupune eșantioane echidistante. cross_val_score folosește implicit metoda .score() a estimatorului — pentru regresori, de regulă R² — dacă nu specificați scoring.

Metrici de evaluare

Prognoza seriilor temporale folosește metrici de regresie, dar într-un context temporal:

  • MAE — eroarea absolută medie: media valorii |y_true - y_pred|. Este ușor de interpretat în unitățile originale: „în medie, predicțiile diferă cu 3,2 grade”.
  • RMSE — rădăcina erorii pătratice medii: penalizează erorile mari mai mult decât MAE. Folosiți-o când erorile mari sunt mai costisitoare decât multe erori mici.
  • MAPE — eroarea procentuală absolută medie: media valorii |error / true_value| * 100. Nu depinde de scară și este utilă pentru compararea seriilor diferite, dar este nedefinită când valorile reale sunt zero.
  • Comparație cu un reper naiv: comparați întotdeauna cu repere simple. Reperul sezonier naiv prezice valoarea de acum o perioadă — ieri sau săptămâna trecută. Dacă modelul nu poate depăși reperul naiv, ceva este în neregulă.

Notă tehnică a traducerii: Implementarea MAPE din scikit-learn întoarce o valoare foarte mare în loc de infinit când y_true este zero. Pentru serii cu zerouri sau valori foarte mici, luați în calcul MAE, MASE, RMSSE ori o metrică adaptată costului problemei.

Caracteristici mobile

Statisticile mobile — medie, abatere standard, minim și maxim în ferestre de 7 și 14 zile — pot fi adăugate la caracteristicile decalate pentru a oferi modelului informații despre tendința și volatilitatea recente. Codul acestei revizii nu include un constructor de caracteristici pentru ferestrele 7 și 14 sau pentru minim/maxim; el folosește numai media și abaterea standard mobile în diagnosticul staționarității.

Notă tehnică a traducerii: extensia descrisă este utilă, dar nu este implementată în time_series.py fixat; adăugați explicit aceste caracteristici și verificați-le împotriva unui reper temporal.

De exemplu, creșterea mediei mobile sugerează o tendință ascendentă. Creșterea abaterii standard mobile sugerează o volatilitate mai mare. Acestea sunt tipurile de tipare pe care modelele bazate pe arbori le pot învăța, dar modelele liniare nu le pot învăța.

Notă tehnică a traducerii: Un model liniar poate folosi statistici mobile dacă ele sunt furnizate explicit drept caracteristici; diferența este că nu învață automat relații neliniare sau praguri. Toate statisticile mobile folosite pentru a prezice momentul t trebuie calculate numai din t-1 și momente anterioare, de exemplu printr-un shift(1) înaintea ferestrei. Altfel, valoarea țintă se poate scurge în caracteristici.

Livrați

Această lecție produce:

  • outputs/prompt-time-series-advisor.md — un prompt pentru formularea problemelor de serii temporale;
  • code/time_series.py — caracteristici decalate, validare cu origine mobilă, model AR și verificări ale staționarității.

Repere pe care trebuie să le depășiți

Înainte de a construi orice model, stabiliți repere:

  1. Ultima valoare — persistență. Preziceți că mâine va fi la fel ca astăzi. Pentru multe serii, acest reper este surprinzător de greu de depășit.
  2. Reper sezonier naiv. Preziceți că astăzi va fi la fel ca aceeași zi din săptămâna trecută sau din anul trecut. Dacă modelul nu îl depășește, nu a învățat un tipar util dincolo de sezonalitate.
  3. Medie mobilă. Preziceți media ultimelor k valori. Aceasta netezește zgomotul, dar nu poate surprinde schimbările bruște.

Dacă modelul ML sofisticat pierde în fața reperului sezonier naiv, aveți o eroare. Cel mai adesea este vorba despre scurgerea informațiilor viitoare în caracteristici, metoda de evaluare greșită sau faptul că seria este cu adevărat aleatoare și imprevizibilă.

Notă tehnică a traducerii: Un model mai simplu poate câștiga fără să existe o eroare de implementare; reperul poate avea o deplasare–varianță mai potrivită pentru date. Concluzia trebuie stabilită prin evaluare temporală repetată și analiza incertitudinii.

Sfaturi practice

  1. Începeți cu graficul. Înainte de modelare, reprezentați seria brută. Căutați tendințe, sezonalitate, valori aberante și rupturi structurale — schimbări bruște de comportament. O inspecție vizuală de 30 de secunde poate spune adesea mai mult decât o oră de analiză automatizată.

  2. Întâi diferențiați, apoi modelați. Dacă seria are o tendință clară, diferențiați-o înainte de a crea caracteristici decalate. Modelele bazate pe arbori pot gestiona tendințele, dar modelele liniare nu pot, iar diferențierea nu dăunează niciodată.

  3. Rezervați cel puțin un ciclu sezonier complet. Dacă aveți sezonalitate săptămânală, setul de testare trebuie să cuprindă cel puțin o săptămână completă. Pentru sezonalitate lunară, cel puțin o lună. Altfel, nu puteți evalua dacă modelul a surprins tiparul sezonier.

  4. Monitorizați în producție. Modelele pentru serii temporale se degradează pe măsură ce mediul se schimbă. Urmăriți erorile de predicție într-o fereastră mobilă. Când erorile încep să crească, reantrenați modelul pe date recente.

  5. Atenție la schimbările de regim. Un model antrenat pe date de dinaintea pandemiei nu va prezice neapărat comportamentul ulterior. Includeți indicatori ai schimbărilor de regim cunoscute sau folosiți o fereastră glisantă care uită datele vechi.

  6. Transformați logaritmic seriile asimetrice. Veniturile, prețurile și numărătorile sunt adesea asimetrice spre dreapta. Aplicarea logaritmului stabilizează varianța și transformă tiparele multiplicative în unele aditive, pe care modelele liniare le pot gestiona. Prognozați în spațiul logaritmic, apoi aplicați funcția exponențială pentru a reveni la unitățile originale.

Notă tehnică a traducerii: Afirmația originală că „diferențierea nu dăunează niciodată” este prea categorică: diferențierea excesivă poate amplifica zgomotul și pierde informații de nivel. Logaritmul cere valori strict pozitive, iar simpla exponentiere a mediei prognozate în spațiul log produce de regulă mediana, nu media pe scara originală; pentru o prognoză medie poate fi necesară o corecție de deplasare.

Exerciții

  1. Experiment de staționaritate. Generați o serie cu tendință liniară. Verificați staționaritatea cu statistici mobile. Aplicați prima diferențiere. Verificați din nou. De câte diferențieri este nevoie pentru o tendință pătratică?

  2. Selectarea decalajelor. Calculați ACF pentru o serie sezonieră cu perioada 7. Ce decalaje au cea mai mare autocorelație? Creați caracteristici folosind numai acele decalaje, nu toate decalajele consecutive. Se îmbunătățește acuratețea față de folosirea decalajelor de la 1 la 7?

  3. Origine mobilă față de împărțire aleatoare. Antrenați o regresie Ridge pe caracteristici decalate. Evaluați-o printr-o împărțire aleatoare 80/20 și prin validare cu origine mobilă. Cu cât supraestimează împărțirea aleatoare performanța?

  4. Ingineria caracteristicilor. Adăugați la caracteristicile decalate media mobilă cu fereastra 7, abaterea standard mobilă cu fereastra 7 și caracteristici pentru ziua săptămânii. Comparați performanța cu și fără acestea prin validare cu origine mobilă.

  5. Prognoză cu mai mulți pași. Modificați modelul AR pentru a prezice cu 5 pași înainte în loc de unul. Comparați două strategii: (a) preziceți un pas și folosiți predicția drept intrare pentru pasul următor — recursivă — și (b) antrenați modele separate pentru fiecare orizont — directă. Care este mai precisă?

Termeni-cheie

Termen Ce spun oamenii Ce înseamnă de fapt
Staționaritate „Statisticile nu se schimbă în timp” O serie a cărei medie, varianță și structură de autocorelație sunt constante în timp
Diferențiere „Scădeți valorile consecutive” Calcularea lui y[t] - y[t-1] pentru a elimina tendințele și a obține staționaritatea
Autocorelație — ACF „Cum se corelează seria cu ea însăși” Corelația dintre o serie temporală și o copie decalată a sa, în funcție de decalaj
Autocorelație parțială — PACF „Numai corelația directă” Autocorelația la decalajul k după eliminarea efectului tuturor decalajelor mai scurte
Caracteristici decalate „Valori trecute drept intrări” Folosirea valorilor y[t-1], y[t-2], …, y[t-k] drept caracteristici pentru a prezice y[t]
Validare cu origine mobilă „Validare încrucișată care respectă timpul” Evaluare în care datele de antrenare preced întotdeauna cronologic datele de testare
ARIMA „Modelul clasic pentru serii temporale” AutoRegressive Integrated Moving Average: combină valori trecute — AR, diferențiere — I și erori trecute — MA
Sezonalitate „Tipare calendaristice repetitive” Cicluri regulate și previzibile ale seriei, legate de perioade precum ziua, săptămâna sau anul
Tendință „Direcția pe termen lung” O creștere sau scădere persistentă a nivelului seriei în timp
Fereastră în expansiune „Folosiți întregul istoric” Validare cu origine mobilă în care setul de antrenare crește la fiecare pliu
Fereastră glisantă „Istoric de dimensiune fixă” Validare cu origine mobilă în care setul de antrenare este o fereastră de lungime fixă ce se deplasează înainte

Lecturi suplimentare

Sursă: Originalul în limba engleză

Navigare: ← Lecția 02.14 — Naive Bayes · Faza 2 — Bazele învățării automate · Catalog complet · în continuare: 02.16 — Detectarea anomaliilor