Uczenie maszynowe - inżynieria na podstawie danych daty / godziny

45

Jakie są typowe / najlepsze praktyki obsługi danych dotyczących czasu dla aplikacji uczenia maszynowego?

Na przykład jeśli w zestawie danych znajduje się kolumna ze znacznikiem czasu zdarzenia, takim jak „2014-05-05”, w jaki sposób można wyodrębnić przydatne funkcje z tej kolumny, jeśli takie istnieją?

Z góry dziękuję!

Igor Bobriakov
źródło

Odpowiedzi:

44

Zacznę od wykresu zmiennej czasowej względem innych zmiennych i szukania trendów.

Na przykład

wprowadź opis zdjęcia tutaj

W tym przypadku istnieje okresowy trend tygodniowy i długoterminowy trend wzrostowy. Więc chciałbyś zakodować dwie zmienne czasowe:

  • day_of_week
  • absolute_time

Ogólnie

Trendy występują w kilku typowych ramach czasowych:

  • absolute_time
  • day_of_year
  • day_of_week
  • month_of_year
  • hour_of_day
  • minute_of_hour

Poszukaj trendów we wszystkich.

Dziwne trendy

Szukaj też dziwnych trendów. Na przykład możesz zobaczyć rzadkie, ale trwałe trendy oparte na czasie:

  • is_easter
  • is_superbowl
  • is_national_emergency
  • etc.

Często wymagają one odniesienia danych do zewnętrznego źródła, które odwzorowuje zdarzenia na czas.

Dlaczego wykres?

Są dwa powody, dla których myślę, że grafika jest tak ważna.

  • Dziwne trendy
    Chociaż ogólne trendy można dość łatwo zautomatyzować (wystarczy je dodawać za każdym razem), dziwne trendy często wymagają ludzkiego oka i znajomości świata. To jeden z powodów, dla których wykresy są tak ważne.

  • Błędy danych
    Zbyt często w danych występują poważne błędy. Na przykład może się okazać, że daty zostały zakodowane w dwóch formatach i tylko jeden z nich został poprawnie załadowany do twojego programu. Istnieje mnóstwo takich problemów i są one zaskakująco częste. Jest to kolejny powód, dla którego myślę, że tworzenie wykresów jest ważne nie tylko dla szeregów czasowych, ale dla dowolnych danych.

Ben Haley
źródło
7

Podziel dane na okna i znajdź funkcje dla tych okien, takie jak współczynniki autokorelacji, falki itp., I użyj tych funkcji do nauki.

Na przykład, jeśli masz dane dotyczące temperatury i ciśnienia, podziel je na poszczególne parametry i oblicz funkcje, takie jak liczba lokalnych minimów w tym oknie i inne, i użyj tych funkcji dla swojego modelu.

Gurpreet Mohaar
źródło
7

Jeszcze jedna rzecz do rozważenia, ponad wszystko, co powiedział Ben Haley, to konwersja na czas lokalny użytkownika . Na przykład, jeśli próbujesz przewidzieć coś, co wydarzy się około 20:00 dla wszystkich użytkowników, jeśli spojrzysz na czas UTC, trudniej będzie przewidzieć na podstawie.

Amir
źródło
6

W kilku przypadkach dane i zdarzenia w szeregu czasowym są sezonowe. W takich przypadkach bardzo ważny jest miesiąc i rok wydarzenia. Dlatego w takich scenariuszach można używać zmiennych binarnych do reprezentowania, czy zdarzenie ma miejsce w danym miesiącu / roku, czy nie.

Mam nadzieję, że to odpowiada na twoje pytanie. Jeśli nie, proszę bardziej szczegółowo określić, co dokładnie próbujesz osiągnąć

show_stopper
źródło
4

Jak ładnie wyjaśnili Ben i Nar , rozbicie obiektu daty i godziny na segmenty części daty i godziny pomogłoby wykryć trendy sezonowe, w których kompletny (a zazwyczaj nawet gorzej - unikalny) obiekt daty

Nie wspomniałeś o żadnym konkretnym algorytmie uczenia maszynowego, który Cię interesuje, ale w przypadku, gdy interesuje Cię także klastrowanie oparte na odległości, takie jak k-średnie, uogólniłem obiekt daty i godziny na format czasu uniksowego . Umożliwiłoby to proste numeryczne porównanie odległości dla algorytmu, po prostu stwierdzając, jak daleko są 2 wartości daty.

W twoim przykładzie uogólniam wartość tylko daty 2014-05-05 na 1399248000 (czas uniksowy reprezentujący początek 5 maja 2014 r., UTC).

[Można argumentować, że można to osiągnąć, dzieląc datę i godzinę na każdą możliwą część daty i godziny .. ale to znacznie zwiększyłoby wymiary zestawu danych. Sugeruję więc połączenie czasu uniksowego do pomiaru odległości i niektórych segmentów daty i czasu]

Mork
źródło
3

Ben mówi o cechach statycznych i korzysta z funkcji znaczników czasu.

Jako rozszerzenie przedstawię funkcje opóźnień , nie mówię o surowych szeregach czasowych, ale o agregacjach na nim.

Najbardziej mistyczne jest to, że przyszła wartość jest dla nas niewidoczna. Jak możemy wykorzystać te zagregowane cechy w danych szkoleniowych?

Mały przykład: istnieją roczne dane dotyczące zużycia energii elektrycznej w latach 1991–2015, chcę przewidzieć zużycie energii elektrycznej w przyszłych 5 latach, 2016–2020. Obliczę średnią ruchomą ostatnich 5 lat jako wartości funkcji na 2020 r., Ale lata 2016-2020 są dla nas nieznane, więc prowadząc (w przeciwieństwie do opóźnień) szereg czasowy 5 lat, dokonujemy średniej ruchomej w latach 2010-2015, a następnie wykorzystujemy tę wartość jako wartości funkcji 2020. Możemy więc zbudować dane dotyczące przyszłych 5 lat.

Następnym krokiem jest użycie funkcji przenoszenia (count \ mean \ median \ min \ max.etc) i wypróbowanie różnych okien, a następnie zbudujesz wiele funkcji!

wolfe
źródło
2

W zależności od tego, czym jesteś zainteresowany informacjami o dacie / godzinie, możesz po prostu chcieć je binować. Na przykład, jeśli interesuje Cię odległość od punktu początkowego (np. 1 stycznia 2015 r.) I chcesz zmierzyć ją w miesiącach, po prostu kodowałbym ją jako miesiąc 1 (dla 1-31 stycznia 2015 r.), 2 (1-28 lutego 2015 r.), 3, 4, 5, 6 itd. Ponieważ odległość między datami rozpoczęcia jest w przybliżeniu taka sama, oznacza to odległość czasową w prostym formacie ciągłym. Mówię w sposób ciągły, ponieważ można powiedzieć miesiąc 6.5 i wiedzieć, że jest już w połowie czerwca 2015 r. Wówczas nie musisz się martwić o faktyczne kodowanie daty i możesz użyć wszystkich typowych metod klasyfikacji.

Jeśli chcesz mierzyć w dniach, wiem, że MySql ma funkcję „to_days”, jeśli zdarzy się, że użyjesz jej do pobrania danych przed klasyfikacją. Python prawdopodobnie ma coś podobnego lub używa formatu czasu uniksowego sugerowanego przez Morka.

Mam nadzieję że to pomoże!

pmp
źródło
1

Wykreśl wykresy z różnymi zmianami czasu w zależności od zmiennej wynikowej, aby zobaczyć jej wpływ. Możesz użyć miesiąca, dnia, roku jako osobnych funkcji, a ponieważ month jest zmienną kategoryczną, możesz wypróbować wykres pudełka / wąsów i sprawdzić, czy są jakieś wzorce. W przypadku zmiennych numerycznych można użyć wykresu punktowego.

Baran
źródło
1

Nie wiem, czy jest to powszechna / najlepsza praktyka, ale jest to inny punkt widzenia tej sprawy.

Jeśli masz, powiedzmy, datę, możesz traktować każde pole jako „zmienną kategorii” zamiast „zmiennej ciągłej”. Dzień miałby wartość z zestawu {1, 2 ..., 31}, miesiąc miałby wartość z {1, ..., 12}, a dla roku wybrałeś wartość minimalną i maksymalną i zbuduj zestaw.

Następnie, ponieważ określone wartości liczbowe dni, miesięcy i lat mogą nie być przydatne do znajdowania trendów w danych, użyj reprezentacji binarnej, aby zakodować wartości liczbowe, z których każda jest funkcją. Na przykład miesiącem 5 będzie 0 0 0 0 1 0 0 0 0 0 0 0(11 0 to 1 na 5 pozycji, każdy bit jest cechą).

Tak więc, mając na przykład 10 lat w „zestawie roku”, data zostałaby przekształcona w wektor 43 cech (= 31 + 12 + 10). Przy użyciu „rzadkich wektorów” ilość funkcji nie powinna stanowić problemu.

Coś podobnego można zrobić dla danych dotyczących czasu, dnia tygodnia, dnia miesiąca ...

Wszystko zależy od pytania, na które ma odpowiedzieć model uczenia maszynowego.

Paco Barter
źródło
Nie uchwyca to relacji, które prawdopodobnie istnieją, np. Że 14 i 15 miesiąca są „podobne”. Jeśli wierzysz, że każdy dzień jest dosłownie inny, wierzysz również, że przewidywanie jutra nie jest możliwe. Nie jest też konieczne jednoznaczne kodowanie kategorii, niekoniecznie.
Sean Owen
Nie rozumiem, dlaczego nie udaje się uchwycić „bliskości” bliskich dat. Jeśli, na przykład, podasz wektor binarny do NN, sam go obliczy po odpowiednim treningu. Używanie wektorów binarnych to tylko jeden sposób reprezentowania kategorii.
Paco Barter
W tym przypadku efektywnie masz kolumny takie jak „is_12th” i „is_13th”, które w przestrzeni wejściowej są niepowiązane i niezwiązane z „is_1st” itd. Jako ciągłą cechą poprawnie wychwytuje, że 12. i 13. są w pewnym sensie bliżej niż 1. i 12. są. Odwołujesz się do tego, co może wywnioskować model, ale mówię o tym, co kodują funkcje wejściowe.
Sean Owen
Dobra, widzę. Masz rację, funkcja Continuos lepiej oddaje jakość „bliskości” dat. Chodzi mi o to, że mogą występować trendy w danych, dla których wartości liczbowe dat są nieistotne (na przykład pewien wzorzec zakupów przez klientów tylko w soboty). Dlatego oferuje inny punkt widzenia do radzenia sobie z datami.
Paco Barter
Faktycznie, jak powiedział @PacoBarter, kodowanie w trybie „na gorąco” ignoruje różną odległość między kategoriami. Nie jest to tak łatwe do rozwiązania, ponieważ funkcje te są wewnętrznie informacjami o fazie, podczas gdy większość modeli uczenia maszynowego nie ma danych wejściowych typu fazy. Jednak niektóre pomiary odległości mogą się przydać.
plpopk
0

Kontekst mojej odpowiedzi : Dotychczas pojawiły się świetne odpowiedzi. Ale chcę przedłużyć rozmowę, zakładając, że mówisz o aplikacji do uczenia maszynowego do przewidywania przyszłych wartości tego konkretnego szeregu czasowego. Mając to na uwadze, moja rada jest poniżej.

Rada : Najpierw przyjrzyj się tradycyjnym strategiom prognozowania statystycznego (tj. Wygładzaniu wykładniczemu, SARIMAX lub regresji dynamicznej) jako linii bazowej dla wyników prognozowania. Chociaż uczenie maszynowe okazało się bardzo obiecujące dla różnych aplikacji, dla szeregów czasowych istnieją wypróbowane i prawdziwe metody statystyczne, które mogą lepiej służyć Twojej aplikacji. Chciałbym zwrócić uwagę na dwa ostatnie artykuły:

  1. Metody prognozowania statystycznego i uczenia maszynowego: obawy i sposoby przekazywania przez Spyros Makridakis i in. W artykule wskazano, że w wielu szeregach czasowych tradycyjna analiza szeregów czasowych przewyższa modele uczenia maszynowego (ML). Zasadniczo ML ma tendencję do przeładowywania się i wszelkie założenia modelu ML dotyczące niezależnych wpisów są naruszane.
  2. Prognozy proste kontra złożone: dowody Kesten C Green i in. Artykuł porównuje i analizuje dane wyjściowe szeregów czasowych recenzowanych artykułów z czasopism, przedstawiające analizę szeregów czasowych z porównaniami różnych modeli i bez nich. Podsumowując, naukowcy nadmiernie komplikują swoją analizę modelami, które są trudniejsze do interpretacji i mają gorsze wyniki. Zwykle dzieje się tak z powodu złych struktur motywacyjnych.

Jeśli szukasz dobrej wydajności, wybierz miernik do porównania z kilkoma modelami (np. MASE) i przejrzyj kilka modeli statystycznych (odniesienia poniżej) i uczenia maszynowego (ze wspomnianymi powyżej strategiami rozwoju funkcji).

Twoje zdrowie,

Materiały do ​​nauki prognozowania statystycznego : Zacznę od przejrzenia darmowego podręcznika Rob J Hyndmana tutaj: https://otexts.org/fpp2/ . Tekst oparty jest na pakiecie R, który możesz łatwo włączyć do swojej analizy: https://otexts.org/fpp2/appendix-using-r.html . Na koniec należy pamiętać o różnicy między walidacją przekrojową a walidacją krzyżową szeregów czasowych, jak wyjaśniono tutaj: https://robjhyndman.com/hyndsight/tscv/ .

Jranisau
źródło