Dlaczego modele serii czasowych potrzebują zastosowanych cech
Sieć rekurencyjna, jak LSTM, może na podstawie niestrukturyzowanej sekwencji wartości samodzielnie nauczyć się struktury temporalnej, ale model oparty na drzewach, tak jak XGBoost, lub prosta regresja nie ma wbudowanego pojęcia o „przed” i „po” — dla nich każda wiersz to niezależne zestawienie wartości cech bez pamięci o tym, co było wcześniej. Aby skorzystać z tych szybkich, dobrze zrozumianych, łatwo interpretowanych rodzin modeli na problemach serii czasowych, struktura temporalna musi być jasno wyrażona, przekształcając ją w zwykłe kolumny: wartości z minionego okresu, statystyki podsumowujące ostatnie okna, oraz kodowanie pozycji obserwacji w nawiązaniu do powtarzającego się cyklu (godzina dnia, dzień tygodnia). To co oznacza inżynieria cech dla serii czasowych: przekształcanie struktury sekwencyjnej w płaski wektor cech.
Cechy opóźnione: zapewnienie modelowi bezpośredniego dostępu do przeszłości
Cecha opóźniona jest prosto wartością docelowego (lub innej istotnej zmiennej) na pewnym wcześniejszym punkcie czasu, dodana jako nowa kolumna do bieżącej linii — na przykład kolumna o nazwie lag_1h przechowująca wartość z jednego godziny przed, a lag_24h przechowującą wartość dokładnie od dnia do dnia. Te wartości obliczane są za pomocą prostej operacji przesunięcia: df['lag_1h'] = df['value'].shift(1). Gdy dane obejmują wiele niezależnych entitetów, takich jak oddzielne czujniki lub stacje, operacja przesunięcia musi być stosowana wewnątrz każdego grupy osobno (grupując po kolumnie identyfikacyjnej przed przesunięciem), inaczej wartość opóźniona mogłaby przekroczyć granice entitetów i zamieszwać historię jednej stacji w wierszu drugiej.
Wybór, które opóźnienia należy włączyć, jest również decyzją modelującą wprowadzona na podstawie znanej okresowości danych: seria z silnymi okresowościiami dziennymi i tygodniowymi korzysta zwykle od opóźnień o jednej godzinie, dwadzieścia czterech godzin i siedem dni (osiemundsiedemdziesiąt osiem godzin), ponieważ te punkty w przeszłości są najbardziej prawdopodobne do podobieństwa do bieżącego momentu. Opóźnienia zbyt krótkie dodają niewiele ponad to, co już uchwycili opóźnienia sasiednie, a opóźnienia wybrane bez odniesienia się do rzeczywistej długości okresu danych często dodają szum zamiast sygnału.
Statystyki rollingowe: uśmiercenie szumu w trend
Gdzie cecha opóźniona zapisuje pojedynczą wartość przeszłą, statystyka rollingowa (lub okno przesuwające) sumaryzowuje całe zakresy wartości przeszłych do jednego numeru — średniego rollingowego, odchylenia standardowego, minimum lub maksimum obliczone na podstawie, np., siedmiu ostatnich dni. W pandas to jedno linijka kodu: `df['wartość'].rolling(window=168, min_periods=1).mean()` dla serii godzinowej z oknem tygodniowym. Średnie rollingowe uśmierca krótkoterminowy szum, aby odsłonić podstawowy trend, na który może się opierać model; odchylenia standardowe rollingowe rejestrują niedawną volatylizację, która sama w sobie może być prognozowalna — czujnik z rosnącym odchyleniem standardowym jest bardziej prawdopodobnie przekonany do zakończenia działania wkrótce, niezależnie od poziomu średniej jego wartości netto.
Podobnie jak dla cech opóźnionych, statystyki rollingowe obliczone na wielu entitetach muszą przestrzegać granic grup — średnia rollingowa dla jednego stanowiska nigdy nie powinna zawierać czytania innej stacji — co w pandas oznacza połączenie groupby z transform, aby obliczenia rollingowe były niezależne wewnątrz każdej grupy, jednocześnie zwracając kolumnę przyporządkowaną do pierwotnego porządku wierszy.
Kodowanie cykliczne: powiedzenie modelowi, że 23:00 jest blisko 00:00
Zdjęcia z kalendarza, takie jak godzina dnia lub miesiąc roku, są naturalnie cykliczne — godzina 23 jest następcą godziny 0, a nie 24 — ale reprezentowane jako proste liczby całkowite, model nie ma sposobu na zrozumienie, że 23 i 0 są sasiadującymi wartościami; widzi tylko duży przepustnik między nimi. Kodowanie cykliczne naprawia to mapując wartość na okrąg przy użyciu sinusów i cosinusów: `df['godzina_sin'] = np.sin(2 * np.pi * df['godzina'] / 24)` oraz pasującym kolumnie z cosinusem. Dostosowanie się do siebie kolumn sinusa i cosinusa zachowuje prawdziwą cykliczną odległość między dowolnymi dwiema godzinami — 23 i 0 okazują się blisko siebie w tym dwa-wymiarowym kodowaniu, dokładnie tak jak powinny być — coś, czego pojedyncza kolumna z naganą liczbą całkowitą nie może przedstawić, nawet jeśli drzewo decyzyjne próbuje podzielić się na nią w inny sposób.
Ta sama technika dotyczy również dnia tygodnia, dnia roku lub miesiąca, gdzie podstawowa wartość zacina się, a nie biegnie prosto. Jest to niewielka dodatek do pipeline funkcji, ale jej brak jest powszechnym, łatwym do przegapić źródłem modeli, które performują słabo wokół granic cykli — północy, końca roku — bez jasnej przyczyny, dlaczego to się dzieje.
Unikanie przepływu danych podczas inżynierii tych cech
Każda z tych typów cech zawiera rzeczywisty ryzyko przepływu danych — niewłaściwe wprowadzanie informacji o przyszłości do cechy używanej do prognozowania przeszłości, co powoduje podwyższoną wydajność walidacyjną, która nie zachowa się po zastosowaniu modelu i gdy naprawdę nie ma dostępu do przyszłości. Podstawowa dyscyplina polega na tym, aby zawsze dzielić dane według czasu przed inżynierią jakichkolwiek cech dotykających okna ruchomego okna lub statystycznego dopasowania do danych: dopasowywanie dowolnej takiej transformacji powinno odbywać się tylko na okres treningowy, a następnie zastosować ją niezmieniono do okresu walidacyjnego i testowego — nigdy w odwrotnej kolejności. Losowe podziały treningowe/testowe, które są standardowym podejściem dla większości problemów tablicowych, są szczególnie złym wyborem dla serii czasowych, ponieważ pozwalają na wprowadzenie danych przyszłych do zestawu treningowego i dalszych w zestawie testowym, co niewidzialnie przekazuje informacje wstecz w czasie.
Cechy ruchome i opóźnione wymagają szczególnej staranności przy granicy między okresami treningu a oceny: średnia ruchoma obliczona na początku okresu testowego, zgodnie z konstrukcją, będzie się odnosić do danych treningowych dla większości swojego okna, co jest zwykle w porządku, ponieważ te dane rzeczywiście były dostępne w tym momencie czasu — ryzyko przepływu informacji pochodzi z obliczania cechy na podstawie danych, które nie mogłyby jeszcze istnieć w chwili prawdziwej prognozy. Dokumentacja dokładnego znaczenia każdego inżynieryjnego cechy oraz sprawdzenie wysokiej korelacji między inżynieryjnymi cechami a docelowym są praktycznymi kontrolkami, które zauważają przepływ informacji przed tym, jak dotrze do produkcji.
Często zadawane pytania
Dlaczego nie mogę prosto wprowadzać niesprawdzonych timestampów do modelu gradient-boostowanego?
Niezobowiązane timestampy, nawet tylko liczba godzina dnia, nie prezentują w formie, która może być skutecznie podzielona przez model, tych wzorców czasowych, które potrzebuje. Wizualne opóźnienia, statystyki ruchome i kodowania cykliczne przekształcają "to się stało niedawno" i "to powtarza się w cyklu" na zwykłe kolumny numeryczne, które logika podziału modelu opartego na drzewach może skutecznie wykorzystać.
Jak wybrać odpowiednie wartości opóźnienia do uwzględnienia?
Wybór opiera się na znanej okresowości danych — jeśli istnieje jasny wzorzec dzienny i tygodniowy, naturalnymi punktami wyjściowymi są opóźnienia o jednej godzinie, jednym dniu i jednym tygodniu. Dodawanie wielu losowych opóźnień bez powiązania z rzeczywistą długością okresowości danych tendencja do dodawania szumu i nadmiernego informacji, a nie użytecznych sygnałów.
Jak najprostszym sposobem zapobiec przepływności danych z cechami ruchomymi?
Zawsze wykonaj podział na trening, walidację i testowanie według czasu jako pierwszy krok, a następnie dopasuj dowolne transformacje tylko na okres treningowy. Nie używaj do losowego podziału metod opartych na przekopiowaniu dla danych serii czasowych, ponieważ pozwala to informacjom z przyszłości na koniec zbioru treningowego.
Dlaczego używa się zarówno sinusów, jak i cosinusów do kodowania cyklicznego zamiast tylko jednego z nich?
Jednoznaczne wartości sinusoidalne lub kosinusowe nie są unikalne w pełnym okresie — różne godziny mogą wygenerować tą samą wartość sinusoidalną. Używanie sinusów i cosinusów razem daje każdemu punktowi na cyklu unikatową współrzędną (x, y), poprawnie zachowując prawdziwą odległość kringularną między dowolnymi dwoma wartościami czasowymi.
Czy statystyki ruchome muszą być obliczane inaczej dla wielu entitetów, takich jak kilka czujników?
Tak. Obliczenia ruchome i opóźnienia muszą być grupowane według entitetu (takiego jak stacja lub identyfikator czujnika) przed ich zastosowaniem, w przeciwnym razie okno ruchome lub opóźnienie mogłoby przechodzić przez dwa niezwiązane entitety i wygenerować cechę mieszającą historie obu, co jest zarówno bezsensowne, jak i formą przepływności danych.
▶ Wypróbuj na żywo
Wszystko powyżej działa bezpośrednio w Twojej przeglądarce — otwórz Lag Features, Rolling Windows & Cyclical Encoding i zmieniaj parametry podczas działania. Nic nie jest instalowane ani przesyłane na serwer, cały model działa w jednej karcie.