Nevrale nettverk som tilbakevendende nevrale nettverk som Long Short-Term Memory (LSTM) er i stand til nesten sømløst å modellere problemer med flere inngangsvariabler.
Dette er en stor fordel i prognoser for tidsserier, hvor klassiske lineære metoder kan være vanskelige å tilpasse til multivariate eller flere inputprognoser.
I denne veiledningen vil du oppdage hvordan du kan utvikle en LSTM-modell for multivariate tidsserieprognoser med Keras deep learning-biblioteket.
Etter å ha fullført denne opplæringen, vil du vite:
- Hvordan transformere et rått datasett til noe vi kan bruke til prognoser for tidsserier.
- Hvordan forberede data og tilpasse en LSTM for et multivariat tidsserieprognoseproblem.
- Hvordan lage en prognose og omskalere resultatet tilbake til de opprinnelige enhetene.
Start prosjektet ditt med min nye bok Deep Learning for Time Series Forecasting, inkludert trinnvise veiledninger og Python kildekode filer for alle eksemplene.
La oss komme i gang.
- Oppdater Aug / 2017: Løst en feil der yhat ble sammenlignet med obs i forrige tidstrinn ved beregning av den endelige RMSE. Takk, Songbin Xu og David Righart.
- Oppdater oktober / 2017: Lagt til et nytt eksempel som viser hvordan du kan trene på flere trinn før tid på grunn av populær etterspørsel.
- Oppdater Sep / 2018: Oppdatert lenke til datasettet.
- Oppdater juni / 2020: Fast manglende import for LSTM-data prep eksempel.
Opplæringsoversikt
Denne opplæringen er delt inn i 4 deler; de er:
- Prognoser for luftforurensning
- Grunnleggende data forberedelse
- Multivariat LSTM-prognosemodell
- Forberedelse av LSTM-data
- Definer og tilpass modell
- Evaluer modell
- Komplett eksempel
- Tren på trinn med flere forsinkelser
Python-miljø
Denne opplæringen forutsetter at du har et Python SciPy-miljø installert. Jeg anbefaler at du bruker Python 3 med denne veiledningen.
Du må ha Keras (2.0 eller høyere) installert med enten TensorFlow eller Theano backend, ideelt sett Keras 2.3 og TensorFlow 2.2, eller høyere.
Opplæringen forutsetter også at du har scikit-learning, Pandas, NumPy og Matplotlib installert.
Hvis du trenger hjelp med miljøet ditt, kan du se dette innlegget:
Trenger du hjelp med Deep Learning for Time Series?
Ta mitt gratis 7-dagers kollisjonskurs på e-post nå (med eksempelkode).
Klikk for å registrere deg og få også en gratis PDF-bokversjon av kurset.
Last ned GRATIS minikurs
1. Prognoser for luftforurensning
I denne opplæringen skal vi bruke datasettet for luftkvalitet.
Dette er et datasett som rapporterer om været og forurensningsnivået hver time i fem år ved den amerikanske ambassaden i Beijing, Kina.
Dataene inkluderer dato og klokkeslett, forurensningen kalt PM2.5-konsentrasjon, og værinformasjonen, inkludert duggpunkt, temperatur, trykk, vindretning, vindhastighet og det kumulative antall timer med snø og regn. Den komplette funksjonslisten i rådataene er som følger:
- Nei: radnummer
- år: år med data i denne raden
- måned: måned med data i denne raden
- dag: dag med data i denne raden
- time: time med data i denne raden
- pm2.5: PM2,5 konsentrasjon
- DEWP: Duggpunkt
- TEMP: Temperatur
- PRES: Press
- cbwd: Kombinert vindretning
- Iws: Kumulert vindhastighet
- Er: Kumulerte timer med snø
- Ir: Kumulerte timer med regn
Vi kan bruke disse dataene og ramme et prognoseproblem der vi, med tanke på værforholdene og forurensningen for tidligere timer, forutser forurensningen neste time.
Dette datasettet kan brukes til å ramme inn andre prognoseproblemer.
Har du gode ideer? Gi meg beskjed i kommentarene nedenfor.
Du kan laste ned datasettet fra UCI Machine Learning Repository.
Oppdater, Jeg har speilet datasettet her fordi UCI har blitt upålitelig:
Last ned datasettet og legg det i din nåværende arbeidskatalog med filnavnet “raw.csv“.
2. Forberedelse av grunnleggende data
Dataene er ikke klare til bruk. Vi må forberede det først.
Nedenfor er de første radene i det rå datasettet.
Nei, år, måned, dag, time, pm2.5, DEWP, TEMP, PRES, cbwd, Iws, Is, Ir 1,2010,1,1,0, NA, -21, -11,1021, NW, 1,79,0,0 2,2010,1,1,1, NA, -21, -12,1020, NW, 4,92,0,0 3,2010,1,1,2, NA, -21, -11,1019, NW, 6,71,0,0 4,2010,1,1,3, NA, -21, -14,1019, NW, 9,84,0,0 5,2010,1,1,4, NA, -20, -12,1018, NW, 12,97,0,0 |
Det første trinnet er å konsolidere dato-klokkeslettinformasjonen til en enkelt dato-tid slik at vi kan bruke den som en indeks i Pandas.
En rask sjekk avslører NA-verdier for pm2.5 for det første døgnet. Vi må derfor fjerne den første dataraden. Det er også noen få spredte "NA" -verdier senere i datasettet; vi kan merke dem med 0 verdier for nå.
Skriptet nedenfor laster det rå datasettet og parser informasjon om dato og klokkeslett som Pandas DataFrame-indeks. “Nei” -kolonnen slippes, og deretter spesifiseres klarere navn for hver kolonne. Til slutt erstattes NA-verdiene med "0" -verdier, og de første 24 timene fjernes.
“Nei” -kolonnen slippes, og deretter spesifiseres klarere navn for hver kolonne. Til slutt erstattes NA-verdiene med "0" -verdier, og de første 24 timene fjernes.
1 2 3 4 5 6 7 8 9 10 11 12 1. 3 14 15 16 17 18 |
fra pandaer import read_csv fra dato tid import dato tid # last data def analysere(x): komme tilbake dato tid.strptime(x, '% Y% m% d% H') datasett = read_csv('raw.csv', parse_dates = [['year', 'month', 'day', 'hour']], indeks_kol=0, date_parser=analysere) datasett.miste('Nei', akser=1, på plass=ekte) # spesifiser manuelt kolonnenavn datasett.kolonner = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain'] datasett.indeks.Navn = 'Dato' # merker alle NA-verdier med 0 datasett['pollution'].fillna(0, på plass=ekte) # slipp de første 24 timene datasett = datasett[24:] # oppsummer de første 5 radene skrive ut(datasett.hode(5)) # lagre til fil datasett.til_csv('forurensning.csv') |
Å kjøre eksemplet skriver ut de første 5 radene i det transformerte datasettet og lagrer datasettet i “forurensning.csv“.
forurensning dugg temp trykk wnd_dir wnd_spd snø regn Dato 2010-01-02 00:00:00 129,0 -16 -4,0 1020,0 SE 1,79 0 0 2010-01-02 01:00:00 148.0 -15 -4.0 1020.0 SE 2.68 0 0 2010-01-02 02:00:00 159,0 -11 -5,0 1021,0 SE 3,57 0 0 2010-01-02 03:00:00 181.0 -7 -5.0 1022.0 SE 5.36 1 0 2010-01-02 04:00:00 138.0 -7 -5.0 1022.0 SE 6.25 2 0 |
Nå som vi har dataene i en brukervennlig form, kan vi lage et raskt plot av hver serie og se hva vi har.
Koden nedenfor laster inn den nye “forurensning.csv”-Fil og plotter hver serie som en egen delplott, unntatt vindhastighet dir, som er kategorisk.
fra pandaer import read_csv fra matplotlib import pyplott # last datasett datasett = read_csv('forurensning.csv', Overskrift=0, indeks_kol=0) verdier = datasett.verdier # spesifiser kolonner som skal plottes grupper = [0, 1, 2, 3, 5, 6, 7] Jeg = 1 # plott hver kolonne pyplott.figur() til gruppe i grupper: pyplott.delplott(len(grupper), 1, Jeg) pyplott.plott(verdier[:, group]) pyplott.tittel(datasett.kolonner[group], y=0,5, lok='Ikke sant') Jeg + = 1 pyplott.vise fram() |
Når du kjører eksemplet, opprettes et plot med 7 delplotter som viser 5 års data for hver variabel.

Linjeplott av tidsserie for luftforurensning
3. Multivariat LSTM-prognosemodell
I denne delen vil vi tilpasse en LSTM til problemet.
Forberedelse av LSTM-data
Det første trinnet er å forberede forurensningsdatasettet for LSTM.
Dette innebærer å innramme datasettet som et overvåket læringsproblem og normalisere inputvariablene.
Vi vil innramme det overvåkede læringsproblemet slik at det forutsier forurensning i den aktuelle timen
Denne formuleringen er grei og bare for denne demonstrasjonen. Noen alternative formuleringer du kan utforske inkluderer:
- Forutsi forurensningen den neste timen basert på værforhold og forurensning det siste døgnet.
- Forutsi forurensningen for den neste timen som ovenfor og gitt de "forventede" værforholdene for neste time.
Vi kan transformere datasettet ved hjelp av series_to_supervised () funksjon utviklet i blogginnlegget:
Først, “forurensning.csv”Datasettet er lastet. Vindretningsfunksjonen er merket kodet (heltall kodet). Dette kan ytterligere være kodet i fremtiden hvis du er interessert i å utforske det.
Deretter normaliseres alle funksjonene, og deretter blir datasettet forvandlet til et overvåket læringsproblem. Værvariablene for timen som skal forutsies
Den komplette kodelisten er gitt nedenfor.