Cel czytelnika: wiarygodne prognozy szeregów czasowych
Intencją osoby budującej model czasowy jest uzyskanie prognoz, które nie tylko dobrze wyglądają na wykresie historycznym, ale przede wszystkim są wiarygodne po wdrożeniu. Oznacza to poprawną obsługę zależności czasowych, sensowną walidację, brak look ahead bias oraz proces, który da się powtórzyć w rzeczywistym środowisku produkcyjnym.
Czym różni się model czasowy od zwykłego modelu ML
Dane niezależne vs sekwencyjne
Klasyczne modele machine learning zakładają, że próbki są i.i.d. (independent and identically distributed) – każda obserwacja jest niezależna od pozostałych i pochodzi z tego samego rozkładu. W praktyce oznacza to, że kolejność wierszy w tabeli nie ma znaczenia. Można wykonać losowy shuffle, podzielić dane na zbiór treningowy i testowy w proporcji 80/20 i trenować model bez patrzenia na czas.
W prognozowaniu szeregów czasowych sytuacja jest zupełnie inna. Każda obserwacja jest powiązana z przeszłością, a kolejność próbek jest kluczowa. Wartość w chwili t często jest silnie uzależniona od wartości w chwilach t-1, t-2, …. Dane są sekwencyjne, a ich struktura w czasie niesie informację, której nie wolno zignorować. Założenie niezależności obserwacji zwykle jest tutaj błędne.
Konsekwencją tej różnicy jest sposób traktowania osi czasu. W klasycznym ML czas bywa po prostu kolejną kolumną z datą, często nawet usuwaną jako „nieistotną”. W modelu czasowym czas jest głównym szkieletem danych – po nim sortujemy, względem niego dzielimy dane i na jego podstawie konstruujemy cechy.
Zależności czasowe i kontekst
Model czasowy zwykle nie tylko patrzy na ostatnią obserwację, ale wykorzystuje historię. Zależności mogą mieć różną naturę:
- krótkoterminową (np. autoregresja – wartość dzisiaj zależy od wartości wczoraj i przedwczoraj),
- długoterminową (trend – stopniowy wzrost lub spadek w czasie),
- sezonową (powtarzalne wzorce: dni tygodnia, miesiące, pory roku),
- epizodyczną (nagłe skoki, promocje, awarie).
Model ML budowany na klasycznych danych tabelarycznych może ignorować kolejność, ponieważ zależności są najczęściej między cechami w jednym wierszu. W modelu czasowym kontekst to sekwencja – bez niej prognozowanie staje się losowaniem.
Przykład: prognoza zużycia energii elektrycznej w budynku. Znacznie lepszą informacją dla modelu jest „średnie zużycie z ostatnich 24 godzin” niż jedynie wartość z poprzedniej minuty. Bez świadomego wykorzystania kontekstu czasowego model nie złapie rytmu dnia i nocy.
Konsekwencje dla podziału danych
Klasyczny podział danych na zbiory treningowy, walidacyjny i testowy opiera się na losowym wyborze wierszy. Przy szeregach czasowych takie podejście przeczy logice problemu. Jeśli do zbioru treningowego trafi obserwacja z 2024 roku, a do testowego z 2020 roku, to model w praktyce widzi przyszłość, ucząc się na późniejszych stanach systemu niż te, które ma prognozować.
Dlatego w prognozowaniu szeregów czasowych stosuje się zasadę: train in the past, test in the future. Dane muszą być posortowane po czasie, a wszystkie operacje podziału powinny respektować tę kolejność. Losowe mieszanie danych, typowe dla zwykłych problemów ML, w prognozowaniu czasu generuje natychmiastowy look ahead bias.
Z tego wynikają kolejne ograniczenia:
- walidacja krzyżowa wymaga specjalnych schematów (np. time series cross-validation, walk-forward validation),
- nie można swobodnie mieszać obserwacji pomiędzy zbiorami,
- transformacje danych (np. normalizacja) muszą być uczone wyłącznie na przeszłości.
Typowe zadania w modelach czasowych
Prognozowanie szeregów czasowych nie ogranicza się tylko do przewidywania pojedynczej liczby w przyszłości. Najczęściej spotykane zadania to:
- Prognoza punktowa jednokrokowa – przewidywanie wartości w t+1 na podstawie historii do czasu t (np. przewidywanie ceny zamknięcia na kolejną godzinę).
- Prognoza wielokrokowa – przewidywanie całej ścieżki w przyszłość, np. prognoza popytu na kolejne 7 dni, często z inną metodyką niż jednokrokowa.
- Prognoza przedziałowa – szacowanie przedziału ufności dla prognozy, nie tylko wartości oczekiwanej.
- Klasyfikacja zdarzeń w czasie – wykrywanie, czy w najbliższym oknie czasu wystąpi określone zjawisko (np. awaria, skok obciążenia, sygnał tradingowy), czyli klasyfikacja, ale z zachowaniem struktury czasowej.
Różnica między tymi zadaniami wpływa zarówno na architekturę modelu, jak i na sposób weryfikacji jakości oraz unikanie look ahead bias.

Rodzaje szeregów czasowych i ich wpływ na modelowanie
Stacjonarne vs niestacjonarne szeregi czasowe
Szereg stacjonarny to taki, w którym własności statystyczne (średnia, wariancja, autokorelacja) są w przybliżeniu stałe w czasie. W praktyce oznacza to brak wyraźnego trendu i stabilne wahania. Wiele klasycznych modeli, jak ARIMA, zakłada stacjonarność lub wymaga przekształcenia serii do postaci stacjonarnej (np. przez różnicowanie).
Szereg niestacjonarny to ten, który ma trend, zmienne w czasie wariancje lub zmieniającą się sezonowość. Przykład: rosnący ruch na stronie WWW w miarę popularyzacji marki, sezonowe skoki sprzedaży przed świętami, niestabilne serie finansowe.
Dla stacjonarnych szeregów czasowych często wystarczają proste, interpretowalne modele liniowe (AR, ARMA, ARIMA), które skupiają się na modelowaniu autokorelacji. Dla serii niestacjonarnych można pójść dwiema drogami:
- przekształcić szereg do stacjonarnego (różnicowanie, transformacje logarytmiczne, usuwanie trendu),
- wybrać modele, które lepiej radzą sobie z niestacjonarnością i obfitą ilością cech wejściowych (drzewa, boosting, sieci neuronowe).
W praktyce często łączy się oba podejścia: podstawowy trend i sezonowość usuwa się za pomocą prostych transformacji, a resztę struktury pozostawia do uchwycenia modelowi ML.
Jednowymiarowe vs wielowymiarowe szeregi czasowe
Jednowymiarowy (univariate) szereg czasowy to pojedyncza zmienna obserwowana w czasie – np. dzienna liczba zamówień w sklepie. Model przewiduje tę samą zmienną na przyszłość, bazując jedynie na jej historii. To podejście bywa zaskakująco skuteczne, gdy główna informacja leży w samej przeszłości, a wpływ innych czynników jest trudny do zmierzenia lub słaby.
Wielowymiarowy (multivariate) szereg czasowy zawiera wiele zmiennych obserwowanych jednocześnie – np. sprzedaż, ceny konkurencji, temperatura, kampanie marketingowe, wszystko w funkcji czasu. Model korzysta z całego wektora cech w każdej chwili, dzięki czemu może uchwycić bardziej złożone korelacje.
Kiedy wystarczy model univariate?
- Gdy seria jest silnie autokorelacyjna,
- gdy brakuje wiarygodnych dodatkowych cech,
- gdy liczba obserwacji jest mała i nie chcemy przeuczyć modelu nadmiarem zmiennych.
Kiedy opłaca się model wielowymiarowy?
- Gdy istnieją silne, mierzalne czynniki zewnętrzne (np. cena paliwa, pogoda),
- gdy prognoza ma służyć działaniom biznesowym zależnym od wielu parametrów (np. logistyczne planowanie zasobów),
- gdy dysponujemy długimi seriami i dobrą jakością danych dla wielu zmiennych.
Modele autoregresyjne (ARIMA, ETS) dominują przy szeregach jednowymiarowych, natomiast algorytmy ML i głębokie sieci zwykle pokazują przewagę w środowisku wielowymiarowym.
Charakterystyka szeregu: trend, sezonowość, skoki
Trzy elementy mają ogromne znaczenie dla wyboru podejścia modelowania:
- Trend – systematyczny wzrost lub spadek poziomu serii w czasie.
- Sezonowość – powtarzalny wzór w równych odstępach (dzień tygodnia, pora dnia, miesiąc).
- Skoki/epizody – rzadkie, często duże odchylenia od normalnego poziomu (awarie, promocje, anomalie).
Modele takie jak ETS (Exponential Smoothing) i niektóre warianty ARIMA dobrze radzą sobie z trendem i sezonowością, gdy są one w miarę regularne. Natomiast algorytmy ML lub sieci neuronowe pozwalają włączyć dodatkowe informacje (np. promocje, ceny, zdarzenia binarne), dzięki czemu mogą lepiej odtwarzać wpływ „skoków”.
Przy bardzo nieregularnych skokach logi systemowe czy dane z IoT potrafią zachowywać się kompletnie inaczej niż np. sprzedaż detaliczna. Często wymagają modeli skoncentrowanych na wykrywaniu anomalii, a nie na klasycznych prognozach punktowych. W takich przypadkach istotniejsza jest ocena ryzyka przekroczenia progu niż dokładna wartość predykcji.
Różnice między domenami: finanse, IoT, logi systemowe
Ta sama technika prognozowania nie zawsze sprawdzi się tak samo w różnych domenach:
- Serie finansowe – zwykle niestacjonarne, z dużym szumem, trudne do modelowania, często bliskie błądowi losowemu w krótkim horyzoncie. Kluczowe jest rygorystyczne unikanie look ahead bias, ponieważ każda przeciekająca informacja może dać iluzoryczną przewagę.
- Dane IoT (np. sensory w maszynach) – częsta wysoka częstotliwość, w miarę stabilne wzorce, ale wrażliwe na awarie i braki danych. Sprawdza się podejście z oknami kroczącymi i wykrywaniem odchyleń od typowego zachowania.
- Logi systemowe – nieregularne zdarzenia w czasie, często modelowane raczej jako proces punktowy niż klasyczny równomiernie próbkowany szereg. Tu lepiej działają modele sekwencyjne uczące się odstępów między zdarzeniami lub przekształcenie do równych bucketów czasowych.
Dobór modelu czasowego jest więc ściśle związany z naturą szeregów: ich stacjonarnością, liczbą zmiennych, regularnością próbkowania i typowymi wzorcami zachowania.
Przygotowanie danych czasowych: od surowego loga do uporządkowanego szeregu
Indeks czasu i częstotliwość próbkowania
Fundamentem poprawnego prognozowania jest jednoznaczny indeks czasu. Każda obserwacja powinna mieć przypisany czas w dobrze zdefiniowanej strefie (UTC lub jasno określonej lokalnej). Mieszanie stref czasowych, zmiany czasu letni/zimowy oraz brak jednoznacznego znacznika to prosta droga do mylących wyników.
Następny krok to określenie docelowej częstotliwości próbkowania:
- sekundowa, minutowa, godzinowa, dzienna, tygodniowa itd.,
- spójna z naturą zjawiska oraz z horyzontem prognozy.
Dla modeli czasowych zwykle wygodniej jest mieć serię próbkowaną równomiernie. W tym celu stosuje się resampling – agregowanie surowych zdarzeń do regularnych interwałów. Przykład: z logów transakcji e-commerce można zbudować szereg dzienny, sumując liczbę zamówień każdego dnia lub licząc średnią wartość koszyka.
Braki danych i nieregularne odstępy
W danych czasowych braki są normą, a nie wyjątkiem. Sensor mógł nie zadziałać, system nie zapisał logu, dane nie spłynęły z zewnętrznego API. Sposób, w jaki zostaną uzupełnione lub pozostawione, wpływa bezpośrednio na jakość prognoz.
Najpopularniejsze strategie:
- Forward fill (ffill) – wypełnianie braków ostatnią znaną wartością. Dobre przy powolnie zmieniających się procesach, gorsze przy nagłych skokach.
- Interpolacja – szacowanie brakujących punktów na podstawie sąsiednich obserwacji (liniowa, spline, inna). Działa rozsądnie przy płynnych procesach.
- Usuwanie obserwacji – czasem bezpieczniejsze, jeśli braki są sporadyczne i nie tworzą długich ciągów, ale trzeba uważać, by nie wprowadzić przesunięć w sekwencjach.
- Dedykowane modele – uczenie osobnego modelu do imputacji w bardziej złożonych przypadkach.
Przy nieregularnych odstępach między pomiarami można pójść dwiema drogami:
- resamplować do regularnej siatki czasowej (z imputacją braków),
Agregacja, pivotowanie i łączenie wielu strumieni danych
Surowe dane często napływają z wielu źródeł: logi aplikacji, system płatności, CRM, sensory. Żeby zbudować spójny szereg, trzeba je sprowadzić do wspólnej osi czasu i jednolitej granularności.
Najczęstsze operacje to:
- Agregacja w dół – z poziomu zdarzeń (eventów) do interwałów czasowych: liczba logowań na minutę, suma sprzedaży dziennie, średnia temperatura czujnika godzinowo.
- Pivotowanie – zamiana „długiej” tabeli (czas, id_sensora, wartość) na szeroką macierz, gdzie każdy sensor jest osobną kolumną, a wiersz odpowiada chwili czasu.
- Joiny czasowe – łączenie tabel po czasie (czasem z tolerancją), np. dopięcie kursu walut z NBP do lokalnych transakcji, przypięcie logów błędów do statystyk ruchu.
Agregacja w dół wygładza szum i upraszcza model, ale traci się informację o kolejności zdarzeń w ramach interwału. Przy logach bezpieczeństwa to duża strata, przy dziennej sprzedaży – zwykle akceptowalny kompromis. Pivotowanie ułatwia stosowanie klasycznych algorytmów ML, choć zwiększa liczbę kolumn i wymagania pamięciowe. Joiny czasowe są krytyczne dla unikania look ahead bias – łączy się dane tylko do czasu, który faktycznie był znany w chwili podejmowania decyzji.
Filtracja outlierów i zdarzeń jednorazowych
Nagłe skoki potrafią zdominować proces uczenia. W jednym przypadku trzeba je zachować (bo będą wracać), w innym – zneutralizować.
Dwa typowe scenariusze:
- Outliery „prawdziwe” – np. akcja promocyjna Black Friday, awaria serwera, gwałtowna zmiana taryfy cenowej. Modele służące do planowania operacyjnego powinny znać takie epizody, bo wpływają na przyszłe ryzyko i decyzje.
- Outliery techniczne – błędne odczyty sensorów, zdublowane logi, błędy integracji. Tu lepszym ruchem jest oczyszczenie lub obcięcie wartości do rozsądnego zakresu.
Proste procedury (obcinanie percentyli, transformacja logarytmiczna, winsoryzacja) często wystarczą, by model przestał „gonić” ekstremalne epizody. Dla serii, gdzie epizody są tematem samym w sobie (np. detekcja ataków DDoS), zamiast je wygładzać, buduje się osobny model klasyfikacyjny wykrywający te zdarzenia.
Kontekst kalendarzowy i zdarzenia zewnętrzne
W szeregach dziennych i godzinowych ogromny ciężar niesie kalendarz: dzień tygodnia, godzina, święta, długie weekendy, sezon wakacyjny. Bez ich uwzględnienia model „widzi” tylko liczby, nie rozumiejąc, że poniedziałek rano zachowuje się inaczej niż sobota wieczorem.
Najczęściej dodaje się:
- cechy kalendarzowe – dzień tygodnia, miesiąc, kwartał, numer tygodnia, godzina, pora dnia,
- flagi świąt i dni specjalnych – święta ustawowe, wyprzedaże sezonowe, planowane przestoje,
- wskaźniki sezonu – okres urlopowy, rok szkolny, sezon grzewczy.
W prognozowaniu sprzedaży flagowanie świąt powoduje zwykle większy skok jakości niż dołożenie kolejnego wyrafinowanego modelu. W finansach czy IoT waga kalendarza bywa mniejsza, ale i tam rozróżnienie trybu dziennego/nocnego czy weekendów potrafi pomóc.

Tworzenie cech dla modelu czasowego (feature engineering w czasie)
Opóźnienia (lag features) i okna kroczące
Podstawą większości modeli czasowych w formie ML-owej są cechy opisujące przeszłość:
- lagi – wartości zmiennej docelowej (i wybranych cech) z poprzednich kroków czasowych: t–1, t–2, t–7 itd.,
- cechy okienkowe – agregaty z ruchomego okna: średnia z ostatnich 7 dni, maksimum z 24 godzin, odchylenie standardowe z 30 punktów.
Lagi lepiej sprawdzają się przy krótkiej pamięci procesu, zaś okna kroczące kondensują dłuższą historię w kilka liczb. W prognozowaniu popytu typowy zestaw to: wartość sprzed 1, 7, 14 dni plus średnie i maksima z tygodnia i miesiąca. W danych o obciążeniu infrastruktury dobiera się raczej krótsze okna, od kilku do kilkudziesięciu ostatnich odczytów.
Więcej lagów nie znaczy automatycznie lepiej. Każdy nowy lag to kolejna kolumna, ryzyko przeuczenia i większy koszt trenowania. Dobrą praktyką jest wybór lagów wsparty analizą autokorelacji (ACF, PACF) albo testami na walidacji czasowej.
Features trendu i sezonowości
Zamiast oczekiwać, że model sam „odkryje” trend i sezonowość tylko z lagów, można je podać wprost jako cechy.
Typowe rozwiązania:
- czas jako zmienna – liczba dni/godzin od początku serii, która pomaga oddać liniowy lub nieliniowy trend,
- cechy harmoniczne – sinusy i cosinusy o okresie doby, tygodnia, roku (przydatne przy prognozowaniu godzinowym czy sezonowości rocznej),
- ruchome „bazowe poziomy” – np. średnia z ostatnich 30 dni jako reprezentacja długoterminowego poziomu, wokół którego oscyluje krótkoterminowa dynamika.
Porównując dwa podejścia: klasyczne modele (np. ETS) wbudowują trend i sezonowość w strukturę parametryczną, natomiast modele ML zwykle wymagają explicite dodanych cech, żeby podobny efekt osiągnąć. Zaletą pierwszych jest prostota, drugich – elastyczność w łączeniu trendu z dodatkowymi zmiennymi zewnętrznymi.
Encoding zmiennych kategorycznych w czasie
Cechy kategoryczne (typ produktu, kanał sprzedaży, kod regionu) trzeba zakodować w sposób przyjazny dla modelu, nie zaburzając struktury czasowej.
Najczęściej stosuje się:
- one-hot encoding – wygodny przy niewielu kategoriach; dla tysięcy produktów powoduje eksplozję wymiarowości,
- target / mean encoding – zamiana kategorii na historyczną średnią wartości celu (np. średnia sprzedaż danego produktu), liczona wyłącznie na podstawie przeszłości,
- embeddingi – w modelach sieciowych (RNN, Transformer, DeepAR) kategorie reprezentowane są przez gęste wektory uczone razem z modelem.
Największa różnica między klasycznym ML a modelami sekwencyjnymi leży w sposobie obsługi dużej liczby kategorii. XGBoost lub Random Forest radzą sobie gorzej przy dziesiątkach tysięcy produktów bez starannego kodowania i silnej agregacji, podczas gdy architektury z embeddingami efektywniej kompresują informację o rzadkich kategoriach.
Cechy zewnętrzne i opóźnienie informacyjne
Dane zewnętrzne (kursy walut, pogoda, indeksy makro, kalendarz kampanii marketingowych) często poprawiają jakość prognoz, ale wprowadzają ryzyko look ahead bias. Kluczowe pytanie brzmi: kiedy ta informacja staje się dostępna w rzeczywistości?
Przykłady dwóch skrajnych podejść:
- Optymistyczne (ale często błędne) – model używa kursu walut z dnia t do prognozowania sprzedaży z dnia t, mimo że raport kursu przychodzi z kilkugodzinnym opóźnieniem.
- Konserwatywne – kurs z dnia t jest dostępny do prognoz na dzień t+1, bo tylko taką informację miałby decydent w chwili podejmowania decyzji.
Różnica wpływa wprost na architekturę cech: część zmiennych zewnętrznych trzeba przeliczyć na ich „wersje opóźnione” (np. pogoda prognozowana vs pogoda rzeczywista) i pilnować, by podczas uczenia nie używać informacji z przyszłości względem chwili prognozy.
Dobór typu modelu: klasyczne modele czasowe vs ogólne algorytmy ML
Modele klasyczne: ARIMA, ETS, modele stanów
Klasyczne modele czasowe buduje się wokół autokorelacji i często jednowymiarowej natury szeregu. Typowe przykłady to ARIMA/SARIMA, ETS, modele stanów z filtrem Kalmana.
Ich mocne strony:
- interpretowalność – parametry mają konkretne znaczenie (część autoregresyjna, różnicowanie, składnik sezonowy),
- niewielka liczba parametrów – dobrze działają przy krótkich szeregach i małej liczbie cech,
- wbudowane modelowanie trendu i sezonowości – mniej ręcznego feature engineeringu.
Słabsze strony ujawniają się przy wielu zmiennych objaśniających, dużej liczbie równoległych serii i skomplikowanych nieliniowościach. Rozbudowane wersje (np. modele wielowymiarowe VAR, stanowe z wieloma obserwacjami) są trudne w strojenia i nie skalują się tak łatwo jak algorytmy ML.
Algorytmy ML: drzewa, boosting, modele liniowe
Ogólne algorytmy ML – regresja liniowa z regularizacją, lasy losowe, gradient boosting (XGBoost, LightGBM, CatBoost) – operują na macierzy cech, więc wymagają „spłaszczenia” problemu czasowego do postaci: przeszłe cechy → przyszła wartość.
Porównując je z klasycznymi podejściami:
- Plusy: lepiej radzą sobie z dużą liczbą cech (w tym nieliniowych interakcji), umożliwiają naturalne użycie wielu zmiennych zewnętrznych i heterogenicznych typów danych.
- Minusy: nie mają wbudowanej świadomości czasu – pamięć i sezonowość trzeba zakodować w cechach; przy braku ostrożności łatwo przemycić look ahead bias (np. zły podział na zbiory trening/test).
W wielu zastosowaniach biznesowych hybryda działa najlepiej: najpierw prosty model klasyczny usuwa trend i sezonowość (lub generuje rezydua), a na tych resztach trenuje się booster, który modeluje złożone efekty nieliniowe i zdarzenia epizodyczne.
Sieci neuronowe sekwencyjne: RNN, LSTM, Temporal Convolution, Transformers
Modele sekwencyjne próbują wykorzystać strukturę czasu wprost, zamiast rozbijać ją na zestaw statycznych cech.
Najpopularniejsze rodziny:
- RNN/LSTM/GRU – klasyczne sieci rekurencyjne z pamięcią; dobre przy krótkich i średnich sekwencjach, wrażliwe na bardzo długie zależności.
- Temporal Convolutional Networks (TCN) – sieci konwolucyjne z przesunięciem w czasie; łatwiejsze w równoległym trenowaniu niż RNN, często stabilniejsze.
- Transformers – architektury oparte na mechanizmie uwagi (attention), bardzo elastyczne przy długich sekwencjach i wielu równoległych zmiennych.
W porównaniu do boostingów, sieci sekwencyjne:
- lepiej modelują długie zależności i zależności między wieloma szeregami jednocześnie,
- wymagają więcej danych, staranniejszej inżynierii treningu (batching, skalowanie) i mają większe ryzyko przeuczenia przy krótkich seriach.
Przy setkach tysięcy produktów i długiej historii (np. prognozy zapasów w łańcuchu dostaw) modele pokroju DeepAR czy Transformerów często wygrywają, bo wspólnie uczą się „wzorców sezonowości” na wielu szeregach jednocześnie. Gdy dla każdego przypadku jest zaledwie kilkadziesiąt obserwacji, prosty ARIMA nadal bywa rozsądniejszym wyborem.
Modele globalne vs lokalne
Kluczowe rozróżnienie w praktyce biznesowej to: uczyć osobny model na każdy szereg (podejście lokalne) czy jeden model na wszystkie (podejście globalne).
Modele lokalne (np. osobny ARIMA na każdy produkt/sklep):
- dobrze odwzorowują specyfikę pojedynczej serii,
- sprawdzają się przy niewielkiej liczbie szeregów i długiej historii każdej serii,
- słabo skalują się na tysiące jednostek – trudne utrzymanie i strojenie.
Modele globalne (jeden booster lub sieć na wszystkie serie naraz):
- dzielą informacje między seriami – słabsze serie korzystają z danych bogatszych,
- łatwiej je wdrożyć i utrzymać w środowisku z setkami tysięcy encji,
- wymagają dobrze przemyślanych cech, które opisują charakter danej serii (np. typ produktu, średni poziom sprzedaży, region).
W praktyce częste jest połączenie obu strategii: globalny model dostarcza bazową prognozę, a lokalne korekty (np. krótkie modele AR na resztach) dopasowują się do specyfiki wybranych, kluczowych serii.
Podział danych czasowych na zbiory treningowe i testowe
Prosty podział blokowy w czasie
W odróżnieniu od klasycznego ML, gdzie swobodnie miesza się próbki, w szeregach czasowych porządek jest nienaruszalny. Najprostsza strategia to podział na „przeszłość” i „przyszłość”:
Najczęściej zadawane pytania (FAQ)
Na czym dokładnie polega look ahead bias w modelach szeregów czasowych?
Look ahead bias pojawia się wtedy, gdy model w jakikolwiek sposób korzysta z informacji z przyszłości przy uczeniu lub walidacji. Przykład: normalizujesz cały szereg (od 2018 do 2024) jednym scalerem, a potem trenujesz model na danych do 2022 i testujesz na latach 2023–2024. Parametry skalera „wiedzą”, jak wyglądają lata 2023–2024, więc w testach masz nienaturalnie dobre wyniki.
W klasycznym ML losowy podział 80/20 jest zwykle OK, w szeregach czasowych prawie zawsze generuje look ahead bias, bo do zbioru treningowego trafiają wiersze z przyszłości względem części testowej. Bez rygorystycznego rozdzielenia przeszłości i przyszłości ocena modelu jest zbyt optymistyczna i po wdrożeniu prognozy nagle się „psują”.
Jak poprawnie podzielić dane czasowe na train, validation i test?
Podstawowa zasada to: najpierw sortowanie po czasie, potem cięcie osi czasu na kolejne przedziały. Dane treningowe muszą obejmować najstarszy fragment szeregu, walidacja – późniejszy zakres, a test – najbardziej aktualny okres. Bez losowego mieszania wierszy.
Przykładowy podział dla danych dziennych 2018–2024: lata 2018–2021 jako train, 2022–2023 jako validation (dobór hiperparametrów), rok 2024 jako finalny test. Dodatkowo wszystkie transformatory (np. scaler, encoder) trzeba uczyć wyłącznie na części treningowej, a dopiero potem stosować na walidacji i teście.
Czym różni się walidacja w szeregach czasowych od klasycznej cross‑validation?
Standardowa k‑fold cross‑validation losuje próbki do foldów, przez co miesza przeszłość z przyszłością. Przy szeregach czasowych takie podejście łamie strukturę sekwencji i prowadzi do look ahead bias. Model widzi „przyszłe” stany systemu podczas uczenia na foldach i ma zbyt łatwe zadanie.
W modelach czasowych używa się walidacji dopasowanej do osi czasu: np. time series cross‑validation (rozwijające się okna) czy walk‑forward validation. Train obejmuje zawsze starszy okres, a walidacja – nowszy. Przykładowo: trenowanie na 2018–2019, walidacja na 2020; potem trenowanie na 2018–2020, walidacja na 2021 itd. Wyniki z kilku „okien” uśrednia się, co lepiej odzwierciedla zachowanie modelu w zmieniających się warunkach.
Kiedy wystarczy model univariate, a kiedy trzeba budować model wielowymiarowy?
Model univariate opiera się wyłącznie na historii jednej zmiennej, którą prognozujemy. Sprawdza się, gdy seria jest silnie autokorelacyjna (np. zużycie energii z mocną codzienną sezonowością), nie mamy wiarygodnych dodatkowych cech lub mamy mało obserwacji i boimy się przeuczenia. Proste modele ARIMA czy ETS często dają wtedy zaskakująco dobre wyniki przy minimalnym wysiłku.
Model wielowymiarowy ma sens, gdy dysponujemy długimi, dobrej jakości seriami wielu istotnych zmiennych – np. sprzedaż, ceny konkurencji, pogoda, kampanie marketingowe. Taki model (drzewa, boosting, sieci) potrafi uchwycić wpływ czynników zewnętrznych, więc bywa lepszy, gdy biznesowo kluczowe są scenariusze „co jeśli zmienimy cenę lub budżet reklamowy”. Minusem jest większa złożoność, trudniejsza interpretacja i wyższe ryzyko przeuczenia.
Jak sprawdzić, czy szereg czasowy jest stacjonarny i co z tego wynika dla modelu?
Stacjonarność oznacza w przybliżeniu stałą średnią, wariancję i strukturę autokorelacji w czasie. W praktyce patrzy się na wykres (brak trendu, wahania o podobnej amplitudzie) i stosuje testy statystyczne, np. test Dickeya‑Fullera. Jeśli szereg „ucieka” w górę/dół lub zmienia się amplituda sezonowości, najpewniej jest niestacjonarny.
Dla szeregów stacjonarnych dobrze działają proste, liniowe modele autoregresyjne (AR, ARMA, ARIMA). Przy seriach niestacjonarnych masz dwa główne kierunki: przekształcić je do postaci bliższej stacjonarnej (różnicowanie, logarytm, usunięcie trendu) lub użyć modeli, które radzą sobie z niestacjonarnością i wieloma cechami (drzewa, boosting, sieci LSTM/Transformer). W praktyce często łączy się oba podejścia: podstawowe trendy i sezonowości usuwa się transformacjami, resztę zostawia modelowi ML.
Jak unikać przecieku informacji (data leakage) przy tworzeniu cech czasowych?
Najczęstsze źródła przecieku to: użycie przyszłych wartości przy konstruowaniu feature’ów (np. średnia z okna obejmującego t+1, t+2), liczenie docelowych statystyk (target encoding, globalne agregaty) na pełnej osi czasu oraz dopasowanie transformacji (scaling, PCA) na całym zbiorze, a nie tylko na przeszłości. Wszystkie te operacje sprawiają, że model ma dostęp do informacji, których w realnym użyciu mieć nie będzie.
Bezpieczne podejście to ścisłe ograniczenie się do przeszłości: cechy typu „średnia z ostatnich 7 dni” liczone wyłącznie po datach ≤ t, kategoryczne agregaty tworzone w ramach okien czasowych (rolling, expanding), a każdy krok pipeline’u (imputacja, scaling, encoding) trenowany tylko na danych treningowych. Przy implementacji walk‑forward validation trzeba pilnować, by przy każdym kroku cechy i transformatory były liczone wyłącznie na historii dostępnej w tym momencie.
Czym różni się prognoza jednokrokowa od wielokrokowej i kiedy którą stosować?
Prognoza jednokrokowa przewiduje wartość w t+1 na podstawie historii do t. W klasycznym podejściu trenuje się model na parze (wektor cech z przeszłości → wartość w następnym kroku). Przy prognozowaniu wielu kroków do przodu można iteracyjnie „doklejać” kolejne predykcje jako wejście na następny krok, co jest proste, ale kumuluje błąd.
Prognoza wielokrokowa od razu przewiduje całą ścieżkę, np. następne 7 dni. Da się to zrobić jednym modelem przewidującym wektor (horyzont) lub osobnym modelem dla każdego kroku. Takie podejście lepiej kontroluje rozkład błędu w czasie (np. gdy najbardziej liczy się prognoza na 7. dzień, a nie na jutro), ale jest bardziej wymagające obliczeniowo i projektowo. W praktyce: gdy potrzebujesz krótkiego horyzontu (minuty, godziny naprzód) i częstego przeliczenia prognozy – zwykle wystarcza jednokrokowa; gdy planujesz zasoby na tygodnie lub miesiące – lepsza jest prognoza wielokrokowa z dedykowaną metodyką walidacji.






