Wielowymiarowa i wielowymiarowa prognoza szeregów czasowych (RNN / LSTM) Keras

12

Próbowałem zrozumieć, w jaki sposób reprezentować i kształtować dane, aby tworzyć wielowymiarowe i wielowymiarowe prognozy szeregów czasowych za pomocą Keras (lub TensorFlow), ale nadal jestem bardzo niejasny po przeczytaniu wielu postów / samouczków / dokumentacji na blogu, w jaki sposób prezentować dane w poprawny kształt (większość przykładów jest nieco mniejsza

Mój zestaw danych:

  • kilka miast
  • dla których mam informacje o powiedzmy temperaturze, ruchu samochodowym, wilgotności
  • na przykład ostatnie 2 lata (jeden rekord na każdy dzień)

Co chcę zrobić: chciałbym przewidzieć dla każdego miasta temperatury, których mogę się spodziewać w przyszłym roku, używając prawdopodobnie opóźnionej wersji temperatury, ruchu samochodowego i wilgotności (oczywiście byłoby jeszcze kilka innych funkcji, ale to tylko przykład dla myśli).

O czym się mylę: jeśli mam 2 miasta, dla których nagrałem 3 funkcje przez 365 dni. Jak powinienem kształtować dane wejściowe, aby model mógł generować prognozę na 365 dni dla tych dwóch miast (tj. 2 szeregi czasowe temperatur na 365 dni)?

Intuicyjnie kształt tensora trwałby (?, 365, 3)365 dni i 3 funkcje. Ale nie jestem pewien, co trzymać w pierwszym wymiarze i, co najważniejsze, byłbym zaskoczony, gdyby miało to dotyczyć liczby miast. Ale jednocześnie nie mam pojęcia, jak określić w modelu, że ma poprawnie rozumieć wymiary.

Wszelkie wskazówki będą pomocne. Znam resztę problemu (tj. Jak zbudować sieć w Keras itp., Ponieważ zrobiłem to dla innych sieci neuronowych, ale dokładniej jak najlepiej zakodować sekwencję dla pożądanego wejścia).

No i wydaje mi się, że mógłbym trenować i przewidywać dla każdego miasta niezależnie, ale jestem pewien, że wszyscy zgodzą się, że prawdopodobnie należy nauczyć się rzeczy, które nie są specyficzne dla żadnego miasta, ale można to zobaczyć tylko w przypadku kilku z nich, dlatego uważam, że ważne jest zakodowanie go w modelu.

Bastien
źródło
1
Oto fajny samouczek na ten temat: tensorflow.org/beta/tutorials/text/time_series
CubeBot88

Odpowiedzi:

13

Kształt wejściowy dla LSTM musi mieć postać (num_samples, num_time_steps, num_features). W twoim przykładzie połączenie obu miast jako danych wejściowych num_featureswyniesie 2x3 = 6.

Jeśli zrzucisz wszystkie swoje 365 kroków czasowych w jedną próbkę, wówczas pierwszym wymiarem będzie 1 - jedna pojedyncza próbka! Możesz także wykonać kontrolę poprawności przy użyciu całkowitej liczby punktów danych. Masz 2 miasta, każde z 365 przedziałami czasowymi i 3 funkcjami: 2x365x3 = 2190. Jest to oczywiście to samo, co 1x365x6 (jak powiedziałem powyżej) - więc byłoby to możliwe (Keras będzie działać) - ale oczywiście nie nauczy się generalizować w ogóle, dając tylko jedną próbkę.

Spójrz na to istotne pytanie , na które niedawno odpowiedziałem. Tam mówię trochę o korzystaniu z przesuwanego okna (sprawdź komentarze odpowiedzi, aby uzyskać więcej informacji). Dzięki temu kupisz więcej próbek, jeśli ich potrzebujesz.

Jeśli chcesz trenować pojedynczy model z danymi dla obu miast jako danych wejściowych, to przewidywanie dla obu miast na każdym etapie jest tak proste, jak zdefiniowanie końcowej Densewarstwy, która daje 2 jednostki. Twoje dane walidacyjne / testowe muszą oczywiście zawierać krotkę (miasto1, miasto2).

Być może bardziej wyrafinowanym sposobem podejścia byłoby utworzenie zbiorów danych dla pojedynczego miasta, następnie szkolenie kilku podmodeli w każdym mieście indywidualnie (powiedzmy dla 5 warstw), a następnie Merge/ Concatenateich i nałożenie kilku kolejnych warstw na wierzch. Oznacza to, że łączysz wyuczone cechy każdego miasta, które z kolei są łączone na wyższy poziom abstrakcji. Oto pierwsze zdjęcie, które dostałem z wyszukiwarki , która szkicuje ten pomysł.

n1k31t4
źródło
Dziękuję bardzo za poświęcenie czasu na udzielenie tak jasnej odpowiedzi! Teraz ma to sens. Rzeczywiście obawiałem się, że wykonanie pierwszego rozwiązania, które wyjaśniłeś, zapobiegnie większemu uogólnieniu. Czy jednak podejście z przesuwanymi oknami naprawdę pozwoliłoby na wiele uogólnień w miastach?
Bastien
Nie ma za co! Sieci głębokie zawsze korzystają z większej ilości danych. Moje powyższe sugestie zawierałyby wiele parametrów - mając tylko 365 punktów, ryzykujesz nadmiernym dopasowaniem do tych miast (tj. Bez uogólnienia)! Możesz spróbować rozszerzyć dane - jak to zależy od twoich danych. Jeśli masz wystarczającą ilość danych, możesz dobrze uogólnić - wyobrażam sobie wynik typu Word2Vec (powszechny w analizie tekstu / NLP), w którym relacje między zmiennymi stają się interpretowalne. Sprawdź to, aby uzyskać informacje , a to dla większej intuicji / zabawy . Twoje wyniki mogą wykreślić mapę pogody!
n1k31t4
tak, ma to sens, więc praca w niektórych oknach mogłaby oszukać więcej danych, jeśli rozumiem, co powiedziałeś?
Bastien
Zakładając, że przewidujesz jutro na podstawie ostatnich 100 dni, stan systemu najprawdopodobniej nie zmieni się tak bardzo od wczoraj (jeśli robisz zwijane okna), w porównaniu do roku temu (nie używając zwijanych okien). Chociaż technicznie tworzy więcej próbek, nie tworzysz nowych punktów danych - raczej przewidujesz, że model może skupić się na mniejszych porcjach pojedynczo. Ta większa szczegółowość pozwoli ci na lepsze (płynniejsze) stwierdzenia statystyczne o wynikach, w porównaniu do dopasowania wszystkich danych i wykonania jednej prognozy. Zmniejszasz niepewność wyników.
n1k31t4
Zgoda! I czy przewijające się okno w ogóle nie przeszkadza komórce pamięci w nauce długich zależności?
Bastien