Nachiketa Hebbar

Follow

Sep 18, 2020 – 8 min read

Prognozowanie szeregów czasowych jest jedną z najbardziej pożądanych technik nauki o danych, czy to w handlu akcjami, przewidywaniu sprzedaży w biznesie czy prognozowaniu pogody. Jest to bardzo przydatna umiejętność i zamierzam wyposażyć cię w nią pod koniec tego artykułu.

W tym poradniku zbudujemy model ARIMA (nie martw się, jeśli nie wiesz dokładnie, jak to działa), aby przewidzieć przyszłe wartości temperatury w danym mieście przy użyciu Pythona. Link GitHub dla kodu i zestawu danych można znaleźć na końcu tego bloga. Załączyłem również mój film na YouTube na końcu, na wypadek gdybyś był zainteresowany wyjaśnieniem wideo. Więc nie tracąc czasu zacznijmy.

Pierwszym krokiem w każdej serii czasowej jest odczytanie danych i zobaczenie, jak to wygląda. Poniższy fragment kodu demonstruje jak to zrobić.

Kod jest całkiem prosty. Wczytujemy dane używając pd.read_csv i pisząc parse_date=True, upewniamy się, że pandas rozumie, że ma do czynienia z wartościami daty, a nie wartościami łańcuchowymi.

Następnie usuwamy wszelkie brakujące wartości i drukujemy kształt danych. df.head() drukuje pierwsze 5 wierszy zbioru danych. Oto dane wyjściowe, które powinieneś zobaczyć:

Wykreśl swoje dane

Następnie wykreślamy swoje dane. To daje ci pojęcie, czy dane są stacjonarne, czy nie. Dla tych, którzy nie wiedzą, co oznacza stacjonarność, pozwól mi dać ci sedno tego. Chociaż zrobiłem kilka filmów na ten temat, to wszystko sprowadza się do tego:

Każde dane szeregu czasowego, które mają być modelowane muszą być stacjonarne. Stacjonarny oznacza, że jego właściwości statystyczne są mniej więcej stałe w czasie. Ma to sens, prawda? Jak inaczej masz dokonać przewidywań, jeśli właściwości statystyczne zmieniają się w czasie? To są następujące właściwości, które każdy model stacjonarności będzie miał:

  1. Stała średnia
  2. Stała wariancja (mogą być zmiany, ale zmiany nie powinny być nieregularne)
  3. Brak sezonowości (Brak powtarzających się wzorców w zestawie danych)

Więc pierwszym krokiem jest sprawdzenie stacjonarności. Jeśli twój zestaw danych nie jest stacjonarny, będziesz musiał przekonwertować go na serię stacjonarną. Teraz, zanim zaczniesz się martwić o to wszystko, zrelaksuj się! Mamy stały łatwy test do sprawdzenia stacjonarności o nazwie ADF (Augmented Dickey Fuller Test). Ale zanim to pokażemy, najpierw wykreślmy dane.

Ponieważ interesuje mnie tylko przewidywanie średniej temperatury, to jest jedyna kolumna, którą będę wykreślał.

df.plot(figsize=(12,5))

Sprawdzanie Stacjonarności

Od razu widzimy, że wydaje się, że średnia jest stała i wynosi około 45. I fluktuacje również wydają się być mniej więcej takie same. Aby jednak upewnić się, czy dane są stacjonarne czy nie, wykonujemy stały test statystyczny za pomocą następującego kodu:

Wynik będzie następujący:

Nie musisz się martwić o wszystkie skomplikowane statystyki. Aby zinterpretować wyniki testu, wystarczy spojrzeć na wartość p. I używasz następującej prostej metody:

If p< 0.05 ; Dane są stacjonarne

if p>0.05; Dane nie są stacjonarne

Nie jest to twarda i szybka reguła, ale stacjonarne dane powinny mieć małą wartość p. Większa wartość p może wskazywać na obecność pewnych trendów (zmienna średnia) lub sezonowość, jak również.

Finally, Decide your ARIMA Model

Teraz, chociaż zrobiłem kilka filmów na YouTube na ten temat, jeśli nie w pełni rozumiesz, co to jest model ARIMA, pozwól mi przedstawić łatwy przegląd:

ARIMA składa się z 3 terminów(Auto-Regression + Integrated+Moving-Average)

  1. Auto-Regression:

To w zasadzie oznacza, że używasz poprzednich wartości szeregu czasowego, aby przewidzieć przyszłość. Jak wiele poprzednich wartości używasz, określić kolejność modelu AR. Oto jak wygląda model AR(1):

Y(t)= Some_Constant*Y(t-1)+ Another_Constant +Error(t)

Wystarczająco prosty, prawda?

2. Zintegrowany:

Więc, pamiętasz nasz wykład na temat stacjonarności, i jak to jest niezwykle ważne? Cóż, jeśli zestaw danych nie jest stacjonarny, najczęściej trzeba wykonać jakąś operację różnicy, aby uczynić go stacjonarnym. Jeśli różnicujesz z poprzednią wartością, to jest to rząd 1 i tak dalej. Oto przykład:

Wybacz mój zły rysunek. Ale jak widać szereg Y(t) nie był stacjonarny, ponieważ miał tendencję rosnącą, co skutkowało zmieniającą się średnią. Po prostu odejmujemy ją od poprzednich wartości i voila! Staje się on stacjonarny. W zależności od danych, być może trzeba będzie powtórzyć różnicowanie, aby uzyskać różnicowanie drugiego rzędu, trzeciego rzędu i tak dalej..

3. Średnia ruchoma:

To w zasadzie oznacza, że używasz poprzednich błędów, aby dokonać przyszłych przewidywań. Również ma sens, prawda? Widząc, jak bardzo myliłeś się w swoich przewidywaniach, bierzesz to pod uwagę, aby dokonać lepszych przewidywań. I tak jak w modelu AR, liczba poprzednich błędów (zwana również liczbą opóźnień), których używasz, określa kolejność modelu.

Oto jak wygląda równanie kolejności MA(1):
Y(t)= Mean + Some_Constant*Error(t-1) +Error(t)

Więc naszym głównym zadaniem jest zdecydować o kolejności części AR, I, MA, które są przekazywane odpowiednio przez(p,d,q).

I zanim zaczniesz się martwić, pozwól mi powiedzieć, że wszystko będzie zrobione automatycznie. Biblioteka pmdarima przychodzi nam na ratunek! Wykonuje ona pracę związaną z ustaleniem kolejności ARIMA. Oto jak wygląda fragment kodu:

from pmdarima import auto_arima
stepwise_fit = auto_arima(df, trace=True,
suppress_warnings=True)

(Upewnij się, że najpierw zainstalujesz bibliotekę pmdarima używając pip install pmdarima)

Kod jest dość oczywisty. Po prostu dostarczamy nasze dane do funkcji auto_arima. Funkcja ta w zasadzie używa czegoś, co nazywa się wynikiem AIC, aby ocenić, jak dobry jest dany model zamówienia. Po prostu próbuje zminimalizować wynik AIC, a oto jak wygląda wyjście:

Wydajność modelu dla różnych kombinacji zamówień

Widzimy, że najlepszym modelem ARIMA wydaje się być model rzędu (1,0,5) z minimalnym wynikiem AIC=8294.785. Z tą wiedzą możemy w końcu przystąpić do trenowania i dopasowania modelu, aby rozpocząć przewidywanie!

Split Your Dataset

Przed faktycznym trenowaniem modelu, musimy podzielić zbiór danych na część treningową i testową. Robimy to, ponieważ najpierw trenujemy model na danych i trzymamy sekcję testową ukrytą przed modelem. Gdy model jest już gotowy, prosimy go o dokonanie przewidywań na danych testowych i sprawdzenie, jak dobrze sobie radzi.

Następujący fragment kodu ilustruje, jak to zrobić:

print(df.shape)
train=df.iloc
test=df.iloc
print(train.shape,test.shape)

Więc, jak zapewne możesz powiedzieć, rezerwujemy ostatnie 30 dni danych jako sekcję testową. Można zobaczyć kształty rzeczywistych danych oraz sekcji testowej i treningowej w danych wyjściowych.

Kształt sekcji treningowej i testowej

W końcu dochodzimy do soczystych rzeczy!

Zaskakująco, tworzenie modelu ARIMA jest w rzeczywistości jednym z najłatwiejszych kroków po wykonaniu wszystkich czynności wstępnych. Jest to tak proste, jak pokazano w poniższym wycinku kodu:

from statsmodels.tsa.arima_model import ARIMA
model=ARIMA(train,order=(1,0,5))
model=model.fit()
model.summary()

Jak widać, po prostu wywołujemy funkcję ARIMA, dostarczamy jej nasz zestaw danych i wymieniamy kolejność modelu ARIMA, którą chcemy. Będziesz mógł zobaczyć podsumowanie modelu w swoim wyjściu, jak również.

Podsumowanie modelu

Możesz zobaczyć całą masę informacji o swoim modelu tutaj. Będziesz mógł również zobaczyć współczynniki każdego z członów AR i MA. Są to nic innego jak wartości zmiennych, które widziałeś w poprzednim równaniu modelu AR/MA, które były oznaczone jako „Some_Constant”. Generalnie wyższa wielkość tej zmiennej oznacza, że ma ona większy wpływ na wynik.

Sprawdź jak dobry jest twój model

Tutaj pojawiają się nasze dane testowe. Najpierw dokonujemy predykcji dla temperatury na danych testowych. Następnie tworzymy wykres, aby zobaczyć jak nasze przewidywania mają się do rzeczywistych danych.

Aby faktycznie dokonać przewidywań, musimy użyć funkcji model.predict i podać indeks początkowy i końcowy, w którym chcemy dokonać przewidywań.

Ponieważ chcemy zacząć dokonywać przewidywań tam, gdzie kończą się dane treningowe, to jest to, co napisałem w zmiennej start. Chcemy przestać robić prognozy, gdy zestaw danych się kończy, co wyjaśnia zmienną end. Jeśli chcesz również dokonywać przyszłych przewidywań, możesz po prostu zmienić to odpowiednio w zmiennej startowej i końcowej na indeksy, które chcesz. Twoja działka wyjściowa powinna wyglądać tak:

Wartości testowe vs Działka przewidywań

Jak widać przewidywania wykonują całkiem dobrą robotę dopasowując się do rzeczywistego trendu, chociaż istnieje pewne akceptowalne opóźnienie.

Sprawdź swoją metrykę dokładności

Aby faktycznie stwierdzić jak dobry lub zły jest twój model, znajdziemy dla niego błąd średniokwadratowy. Poniższy fragment kodu pokazuje, że:

Po pierwsze sprawdzamy średnią wartość zestawu danych, która wynosi 45. I root mean squared error dla tego konkretnego modelu powinien wynosić około 2.3. Należy również zwrócić uwagę na to, że błąd średniokwadratowy powinien być mniejszy niż średnia wartość zestawu testowego. W tym przypadku widzimy, że średni błąd będzie wynosił około 2.3/45 *100=5.1% rzeczywistej wartości.

Tak więc z tym twój model ARIMA jest gotowy do pracy! W przyszłych blogach będę mówił o różnych modelach i jak można zwiększyć dokładność modelu dalej.

Jeśli jesteś zainteresowany wyjaśnieniem wideo tego samego, przejdź do mojego kanału YouTube, aby uzyskać więcej takich treści! Możesz znaleźć link GitHub dla kodu i zestawu danych tutaj: https://github.com/nachi-hebbar/ARIMA-Temperature_Forecasting

Nie krępuj się również połączyć się ze mną na LinkedIn!

.