Prognozowanie ciągu czasowego za pomocą Vertex AI i BigQuery ML

1. Przegląd

Z tego modułu dowiesz się, jak utworzyć model prognozowania szeregów czasowych za pomocą TensorFlow, a potem wdrożyć go w Vertex AI.

Czego się nauczysz

Poznasz takie zagadnienia jak:

  • przekształcać dane, aby można było ich używać w modelu ML;
  • Wizualizowanie i przeglądanie danych
  • Tworzenie modelu prognozowania ciągów czasowych za pomocą BigQuery ML
  • Tworzenie modelu prognozowania ciągów czasowych w TensorFlow przy użyciu architektur LSTM i CNN

2. Wprowadzenie do prognozowania ciągów czasowych

Ten przewodnik skupia się na tym, jak stosować techniki prognozowania szeregów czasowych za pomocą Google Cloud Platform. Nie jest to ogólny kurs prognozowania szeregów czasowych, ale krótkie wprowadzenie do tych zagadnień może być przydatne dla naszych użytkowników.

Dane szeregów czasowych

Najpierw wyjaśnijmy, czym jest szereg czasowy. Jest to zbiór danych z informacjami rejestrowanymi w regularnych odstępach czasu. Zbiór danych szeregów czasowych zawiera zarówno czas, jak i co najmniej 1 zmienną zależną od czasu.

85af6a1ff05c69f2.png

Komponenty

Szereg czasowy można podzielić na komponenty:

  • Trend: rośnie lub maleje w dość przewidywalny sposób.
  • Sezonowe: powtarzające się w określonym czasie, np. w ciągu dnia, tygodnia, miesiąca, sezonu itp.
  • Losowe: pozostałe wahania

Może występować wiele warstw sezonowości. Na przykład centrum obsługi telefonicznej może zauważyć wzorzec w liczbie połączeń w określone dni tygodnia i miesiące. Resztę można wyjaśnić za pomocą innych zmiennych niż czas.

6e8d45bbbbc388ec.png

Stacjonarność

Aby uzyskać najlepsze wyniki prognozowania, dane szeregów czasowych powinny być stacjonarne, czyli właściwości statystyczne, takie jak średnia i wariancja, powinny być stałe w czasie. Aby dane pierwotne były bardziej stacjonarne, można zastosować techniki takie jak różnicowanie i usuwanie trendu.

Na przykład wykres stężenia CO₂ poniżej pokazuje powtarzający się roczny wzorzec z tendencją wzrostową. ( Źródło)

ab82857e2e7d0b89.png

Po usunięciu trendu liniowego dane lepiej nadają się do prognozowania, ponieważ mają teraz stałą średnią.

c936381ab1095528.png

Wykorzystanie danych szeregów czasowych w uczeniu maszynowym

Aby używać danych szeregów czasowych w problemie uczenia maszynowego, należy je przekształcić tak, aby poprzednie wartości można było wykorzystać do prognozowania przyszłych wartości. Ta tabela pokazuje przykład tworzenia zmiennych opóźnionych, które pomagają przewidywać wartość docelową.

d667a941dbd470f5.png

Omówiliśmy już podstawy, więc zacznijmy analizować dane i prognozować.

3. Konfigurowanie środowiska notatnika

Po krótkim wprowadzeniu do danych skonfigurujmy teraz środowisko programistyczne modelu.

Krok 1. Włącz interfejsy API

Oprogramowanie sprzęgające BigQuery korzysta z interfejsu BigQuery Storage API. Wyszukaj w konsoli BigQuery Storage API i włącz go, jeśli jest wyłączony.

9895a2fd3cdf8f8c.png

Krok 2. Utwórz notatnik Vertex AI Workbench

Przejdź do sekcji Vertex AI Workbench w konsoli Cloud i kliknij Nowy notatnik. Następnie wybierz najnowszy typ notatnika TensorFlow Enterprise 2.x bez procesorów graficznych:

4e7b73eabf2bc061.png

Użyj opcji domyślnych, a następnie kliknij Utwórz. Po utworzeniu instancji wybierz Otwórz JupyterLab:

18c9f3c462aafaee.png

Następnie utwórz notatnik Python 3 w JupyterLab:

58523671a252b95a.png

Krok 3. Pobierz materiały do ćwiczeń

Utwórz nowe okno terminala w interfejsie JupyterLab: Plik –> Nowy –> Terminal.

Następnie sklonuj materiał źródłowy za pomocą tego polecenia:

git clone https://github.com/GoogleCloudPlatform/training-data-analyst

4. Przeglądanie i wizualizowanie danych

W tej sekcji:

  • Tworzenie zapytania, które grupuje dane w serię czasową
  • Uzupełnianie brakujących wartości
  • Wizualizacja danych
  • Rozkładanie szeregów czasowych na komponenty trendu i sezonowości

Krok 1

W Vertex AI Workbench kliknij training-data-analyst/courses/ai-for-time-series/notebooks i otwórz 01-explore.ipynb.

Krok 2

Wyczyść wszystkie komórki w notatniku (Edytuj > Wyczyść wszystkie dane wyjściowe), zmień ustawienia regionu, projektu i zasobnika w jednej z pierwszych komórek, a następnie uruchamiaj komórki pojedynczo.

Krok 3

W tej sekcji zaimportowano dane i wizualizowano różne ich wymiary. Teraz, gdy masz już jaśniejszy obraz danych, możesz przejść do modelowania uczenia maszynowego z ich użyciem.

55839e7bc0427915.png

5. Tworzenie modelu za pomocą prognozowania ciągów czasowych w BigQuery

W tej sekcji:

  • Importowanie danych wejściowych szeregów czasowych do tabeli BigQuery
  • Tworzenie modelu ciągu czasowego za pomocą składni BQML
  • Dowiedz się, jak ocenić parametry i dokładność modelu.
  • Prognozowanie za pomocą modelu

Krok 1

Utworzymy tabelę BigQuery z danymi pierwotnymi z pliku CSV, który właśnie sprawdziliśmy. Zacznijmy od pobrania pliku CSV ze środowiska notatnika.

W katalogu training-data-analyst/courses/ai-for-time-series/notebooks/data kliknij prawym przyciskiem myszy plik cta_ridership.csvpobierz go do środowiska lokalnego.

Krok 2

Następnie prześlemy te dane do tabeli BigQuery.

Otwórz BigQuery w konsoli (wyszukując lub korzystając z tego linku):

649e7ab1c44b75e8.png

Możesz dodać tabelę do nowego lub istniejącego zbioru danych, który grupuje powiązane tabele. Jeśli nie masz jeszcze utworzonego zbioru danych, możesz kliknąć projekt w lewym dolnym rogu, a następnie w prawym dolnym rogu wybrać Utwórz zbiór danych.

281b97020cd52f29.png

Wybierz dowolną nazwę, np. demo, zaakceptuj ustawienia domyślne i kontynuuj.

Po wybraniu tego zbioru danych kliknij Utwórz tabelę w prawym dolnym rogu, aby utworzyć nową tabelę.

ad47810d44cfb289.png

W przypadku opcji tworzenia tabeli wybierz:

  • Utwórz tabelę z: Prześlij
  • Wybierz plik: cta_ridership.csv
  • Nazwa tabeli: cta_ridership
  • Schemat: zaznacz pole, aby automatycznie wykrywać schemat i parametry wejściowe.

213e4177e9e79544.png

Krok 3

Czas utworzyć model. BigQuery ML udostępnia prostą składnię podobną do SQL, która umożliwia tworzenie wielu różnych typów modeli.

W edytorze zapytań wklej lub wpisz to zapytanie, zastępując w razie potrzeby ciąg demo nazwą zbioru danych w obu miejscach:

CREATE OR REPLACE MODEL
  `demo.cta_ridership_model` OPTIONS(MODEL_TYPE='ARIMA',
    TIME_SERIES_TIMESTAMP_COL='service_date',
    TIME_SERIES_DATA_COL='total_rides',
    HOLIDAY_REGION='us') AS
SELECT
  service_date, total_rides
FROM
  `demo.cta_ridership`

Przyjrzyjmy się kluczowym elementom składni, aby ją zrozumieć:

CREATE OR REPLACE MODEL
demo.cta_ridership_model

Ta instrukcja tworzy model. Istnieją warianty tej instrukcji, np. CREATE MODEL, ale w tym przypadku zdecydowaliśmy się zastąpić istniejący model o tej samej nazwie.

OPTIONS(MODEL_TYPE=‘ARIMA' ... )

Tutaj definiujemy opcje modelu, przy czym pierwszą opcją jest typ modelu. Wybranie opcji ARIMA spowoduje utworzenie modelu prognozowania ciągów czasowych.

TIME_SERIES_TIMESTAMP_COL=‘service_date'

Kolumna z informacjami o dacie i godzinie

TIME_SERIES_DATA_COL=‘total_rides'

Kolumna danych

HOLIDAY_REGION=‘us'

Ten opcjonalny parametr umożliwia uwzględnienie w modelu świąt. W ramach eksploracji danych w poprzednim kroku zauważyliśmy, że w dni świąteczne liczba przejazdów była mniejsza. Dane pochodzą z Chicago w stanie Illinois w USA, więc uwzględniamy w modelu amerykańskie święta.

AS SELECT ... FROM ...

W tej sekcji wybieramy dane wejściowe, których użyjemy do trenowania modelu.

Do zapytania możesz dodać wiele innych opcji, np. zdefiniować kolumnę, jeśli masz wiele szeregów czasowych, lub wybrać, czy parametry modelu ARIMA mają być wykrywane automatycznie. Więcej informacji znajdziesz w dokumentacji składni instrukcji CREATE MODEL w przypadku modeli szeregów czasowych.

Krok 4

Dowiedzmy się więcej o naszym modelu. Po zakończeniu trenowania uruchommy kolejne zapytanie, ponownie zastępując w razie potrzeby słowo demo:

SELECT
  *
FROM
  ML.EVALUATE(MODEL `demo.cta_ridership_model`)

Zinterpretujmy wyniki. W każdym wierszu zobaczysz model kandydujący wraz z jego parametrami i statystykami oceny. Wyniki są zwracane w kolejności rosnącej według kryterium informacyjnego Akaike (AIC), które jest względnym wskaźnikiem jakości modelu. Model w pierwszym wierszu ma najniższą wartość AIC i jest uważany za najlepszy.

Zobaczysz parametry p, d i q modelu ARIMA, a także sezonowość wykrytą w modelu. W tym przypadku najlepszy model uwzględnia sezonowość tygodniową i roczną.

5b5b1e129c70a340.png

Krok 5

Teraz możemy prognozować za pomocą funkcji ML.FORECAST.

Wklej lub wpisz poniższy tekst (w razie potrzeby zastąp demo):

SELECT
  *
FROM
  ML.FORECAST(MODEL `demo.cta_ridership_model`,
    STRUCT(7 AS horizon))

To zapytanie po prostu prognozuje dane na 7 dni do przodu przy użyciu naszego modelu. Poniżej widzimy 7 zwróconych wierszy. Prognoza zawiera też przedział ufności, który domyślnie wynosi 0,95, ale można go skonfigurować w zapytaniu.

b8a7f22657dc2d27.png

Świetna robota: utworzyliśmy model szeregów czasowych za pomocą zaledwie kilku zapytań BQML.

6. Tworzenie niestandardowego modelu prognozowania

W tej sekcji:

  • Usuwanie wartości odstających z danych
  • Przeprowadzanie prognoz wieloetapowych
  • Uwzględnianie dodatkowych cech w modelu szeregów czasowych
  • Informacje o architekturach sieci neuronowych do prognozowania szeregów czasowych: LSTM i CNN
  • Więcej informacji o modelach statystycznych, w tym o wygładzaniu wykładniczym Holt-Winters
  • Modele zespołowe

Krok 1

W Vertex AI Workbench kliknij training-data-analyst/courses/ai-for-time-series/notebooks i otwórz 02-model.ipynb.

Krok 2

Wyczyść wszystkie komórki w notatniku (Edytuj > Wyczyść wszystkie dane wyjściowe), zmień ustawienia regionu, projektu i zasobnika w jednej z pierwszych komórek, a następnie uruchamiaj komórki pojedynczo.

Krok 3

W notatniku zapoznaliśmy się z kilkoma architekturami modeli: LSTM, CNN i modelami statystycznymi. W przypadku każdego modelu możesz sprawdzić jego skuteczność w porównaniu z danymi testowymi:

a528df58f4e6d372.png

7. Trenowanie i prognozowanie w chmurze

W tej sekcji:

  • Przygotowywanie danych i modeli do trenowania w chmurze
  • Trenowanie modelu i monitorowanie postępów zadania za pomocą AI Platform Training
  • Prognozowanie przy użyciu modelu za pomocą AI Platform Prediction

Krok 1

W Vertex AI Workbench kliknij training-data-analyst/courses/ai-for-time-series/notebooks i otwórz 03-cloud-training.ipynb.

Krok 2

Wyczyść wszystkie komórki w notatniku (Edytuj > Wyczyść wszystkie dane wyjściowe), zmień ustawienia regionu, projektu i zasobnika w jednej z pierwszych komórek, a następnie uruchamiaj komórki pojedynczo.

Krok 3

W poprzedniej sekcji wytrenowaliśmy model i wykonaliśmy za jego pomocą prognozę, a wszystko to w notatniku Workbench. W tej sekcji pokazaliśmy, jak używać pakietu Python SDK do Vertex AI w notatniku, aby korzystać z usług Vertex AI do trenowania i wdrażania.

a3f6b5dc895a24fb.png

8. Wyzwanie

W tej sekcji spróbujesz zastosować poznane koncepcje do nowego zbioru danych.

Nie podamy szczegółowych instrukcji, tylko kilka wskazówek (jeśli chcesz!).

Celem jest przewidywanie zgłoszeń do numeru 311 z Nowego Jorku. Te zgłoszenia nie dotyczące sytuacji awaryjnych obejmują skargi na hałas, problemy z oświetleniem ulicznym itp.

Krok 1

Zacznijmy od zrozumienia zbioru danych.

Najpierw otwórz zbiór danych City of New York 311 Service Requests.

Aby lepiej poznać dane, wypróbuj kilka przykładowych zapytań wymienionych w opisie zbioru danych:

  • Ile zgłoszeń do numeru 311 dotyczyło furgonetek z lodami?
  • W które dni jest najwięcej zgłoszeń do numeru 311 dotyczących imprez?

W interfejsie BigQuery kliknij Utwórz zapytanie, aby dowiedzieć się, jak uzyskać dostęp do zbioru danych. Zwróć uwagę, że instrukcja select wysyła zapytanie z bigquery-public-data.new_york_311.311_service_requests.

Krok 2

Możemy zaczynać. W tej sekcji zmodyfikuj notatnik Explore and Visualize, aby pracować z tymi danymi.

Wskazówki

  • Zduplikuj 01-explore.ipynb notatnik i zacznij z niego korzystać.
  • Aby zbadać dane, wypróbuj to zapytanie:
from google.cloud import bigquery as bq

sql = """
SELECT * FROM `bigquery-public-data.new_york_311.311_service_requests` LIMIT 5
"""

client = bq.Client(project=PROJECT)
df = client.query(sql).to_dataframe()

df.head()
  • Aby uzyskać liczbę incydentów według miesiąca, użyj tego zapytania:
SELECT
  COUNT(unique_key) as y,
  DATE_TRUNC(DATE(created_date), month) as ds  
FROM `bigquery-public-data.new_york_311.311_service_requests`
GROUP by ds ORDER BY ds asc
  • Zaktualizuj zmienne kolumn w sekcji stałych. W powyższej kwerendzie kolumna docelowa to y, a kolumna daty to ds. Brak dodatkowych funkcji.
  • W kolejnym module możesz zmienić nazwę pliku, do którego eksportujesz dane.
  • Wyeksportuj dane za pomocą: df.to_csv(YOUR-EXPORT-FILENAME, index=False)

Krok 3

Teraz utwórzmy model szeregu czasowego z danymi miesięcznymi.

Wskazówki:

  • Zduplikuj 02-model.ipynb notatnik i zacznij z niego korzystać.
  • Zaktualizuj parametry zbioru danych:
  • Zaktualizuj parametry target_colts_col, aby pasowały do nowego zbioru danych.
  • Zaktualizuj parametry modelu:
  • Częstotliwość miesięczna (kod początku miesiąca to „MS”)
  • Kroki wejściowe: 12 (okres wsteczny to 12 miesięcy)
  • Kroki wyjściowe: 3 (prognoza na 3 miesiące)
  • Sezony: 12 (sezonowość wynosi 12 miesięcy)
  • Jeśli nazwa pliku wejściowego została zmieniona w poprzednim notatniku, zmień ją.
  • Jeśli zapytanie zostanie uruchomione w połowie miesiąca, miesięczna suma za ostatni miesiąc będzie znacznie niższa od oczekiwanej. Dlatego na potrzeby tego modułu usuńmy z zbioru danych ostatni miesiąc, używając tego kodu: df = df[:-1]
  • W danych nie ma żadnych oczywistych wartości odstających, więc pomiń te komórki lub dodaj do nich komentarz.
  • Dostosuj jednostki LSTM oraz filtry i rozmiar jądra CNN w tym nowym modelu.

9. Czyszczenie

Jeśli chcesz nadal korzystać z tego notebooka, zalecamy wyłączanie go, gdy nie jest używany. W interfejsie Workbench w konsoli Cloud wybierz notatnik, a następnie kliknij Zatrzymaj:

57213ef2edad9257.png

Jeśli chcesz usunąć wszystkie zasoby utworzone w tym module, po prostu usuń notatnik platformy roboczej zamiast go zatrzymywać.

W menu nawigacyjnym w konsoli Cloud przejdź do sekcji Pamięć i usuń oba utworzone zasobniki do przechowywania zasobów modelu (OSTRZEŻENIE: zrób to tylko wtedy, gdy utworzono nowe zasobniki specjalnie na potrzeby tego modułu).