Neuraaliverkot, kuten toistuvat pitkät lyhytaikaiset muistit (LSTM), pystyvät mallinnamaan ongelmat melkein saumattomasti useilla tulomuuttujilla.
Tästä on suuri etu aikasarjojen ennustamisessa, jossa klassisia lineaarisia menetelmiä voi olla vaikea mukauttaa monen muuttujan tai monen syötteen ennustamisongelmiin.
Tässä opetusohjelmassa huomaat, kuinka voit kehittää LSTM-malli monen muuttujan aikasarjojen ennustamiseen Keras-syväoppimiskirjaston kanssa.
Tämän opetusohjelman suorittamisen jälkeen tiedät:
- Kuinka muuntaa raaka aineisto sellaiseksi, jota voimme käyttää aikasarjojen ennustamiseen.
- Kuinka valmistella tietoja ja sovittaa LSTM monivaiheiseen aikasarjojen ennustusongelmaan.
- Kuinka tehdä ennuste ja skaalata tulos takaisin alkuperäisiin yksiköihin.
Käynnistä projekti uuden kirjani kanssa Deep Learning for Time Series Forecasting, mukaan lukien vaiheittaiset oppaat ja Python-lähdekoodi tiedostot kaikille esimerkeille.
Aloitetaan.
- Päivitä elokuu / 2017: Korjattu vika, jossa yhatia verrattiin obs: ään edellisessä aikavaiheessa laskettaessa lopullista RMSE: tä. Kiitos, Songbin Xu ja David Righart.
- Päivitä lokakuu / 2017: Lisätty uusi esimerkki siitä, kuinka harjoitella useilla aikaisemmilla aikavaiheilla yleisen kysynnän vuoksi.
- Päivitä syyskuu 2018: Päivitetty linkki tietojoukkoon.
- Päivitä kesäkuu / 2020: Korjattu puuttuva tuonti LSTM-tietojen valmisteluesimerkille.
Opetusohjelman yleiskatsaus
Tämä opetusohjelma on jaettu 4 osaan; he ovat:
- Ilman pilaantumisen ennuste
- Perustietojen valmistelu
- Monimuuttujainen LSTM-ennustemalli
- LSTM-tietojen valmistelu
- Määritä ja sovi malli
- Arvioi malli
- Täydellinen esimerkki
- Juna useilla viiveillä
Python-ympäristö
Tässä opetusohjelmassa oletetaan, että sinulla on asennettuna Python SciPy -ympäristö. Suosittelen, että käytät Python 3: ta tämän opetusohjelman kanssa.
Sinulla on oltava asennettuna Keras (2.0 tai uudempi) joko TensorFlow- tai Theano-taustalla, Ideally Keras 2.3 ja TensorFlow 2.2 tai uudempi.
Opetusohjelmassa oletetaan myös, että scikit-learn, Pandas, NumPy ja Matplotlib on asennettu.
Jos tarvitset apua ympäristössäsi, katso tämä viesti:
Tarvitsetko apua taidon Deep Learning for Time Series kanssa?
Suorita ilmainen 7 päivän sähköpostin kaatumiskurssini nyt (esimerkkikoodilla).
Napsauta rekisteröityäksesi ja hanki myös ilmainen PDF Ebook -versio kurssista.
Lataa ILMAINEN minikurssi
1. Ilman pilaantumisen ennustaminen
Tässä opetusohjelmassa aiomme käyttää ilmanlaadun tietojoukkoa.
Tämä on tietojoukko, joka raportoi säästä ja pilaantumistasosta joka tunti viiden vuoden ajan Yhdysvaltain suurlähetystössä Pekingissä, Kiinassa.
Tiedot sisältävät päivämäärän ja kellonajan, PM2,5-pitoisuudeksi kutsuttu saaste ja säätiedot, mukaan lukien kastepiste, lämpötila, paine, tuulen suunta, tuulen nopeus sekä lumen ja sateen kumulatiivisen tuntimäärän. Raakatietojen täydellinen ominaisuuksien luettelo on seuraava:
- Ei: rivinumero
- vuosi: tämän rivin tietojen vuosi
- kuukausi: tämän kuukauden tietojen kuukausi
- päivä: tämän rivin tietojen päivä
- tunnin: tunti tietoja tällä rivillä
- pm2.5: PM2,5-pitoisuus
- DEWP: Kastepiste
- LÄMPÖTILA: Lämpötila
- PRES: Paine
- cbwd: Yhdistetty tuulen suunta
- Iws: Kumulatiivinen tuulen nopeus
- On: Laskutunnit lunta
- Ir: Sateen tuntimäärä yhteensä
Voimme käyttää näitä tietoja ja kehittää ennusteongelman, jossa ennustamme edeltävien tuntien sääolosuhteet ja pilaantumisen seuraavaan tuntiin.
Tätä tietoaineistoa voidaan käyttää muiden ennusteongelmien muodostamiseen.
Onko sinulla hyviä ideoita? Kerro minulle alla olevissa kommenteissa.
Voit ladata tietojoukon UCI Machine Learning -tietovarastosta.
Päivittää, Olen peilannut tietojoukon täällä, koska UCI on tullut epäluotettavaksi:
Lataa tietojoukko ja aseta se nykyiseen työhakemistoon tiedostonimellä “raw.csv“.
2. Perustietojen valmistelu
Tiedot eivät ole käyttövalmiita. Meidän on valmisteltava se ensin.
Alla ovat muutamat ensimmäiset rivit raakatiedostosta.
Ei, vuosi, kuukausi, päivä, tunti, 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 |
Ensimmäinen vaihe on yhdistää päivämäärä-aika-tiedot yhdeksi päivämäärä-kelloksi, jotta voimme käyttää sitä indeksinä Pandassa.
Nopea tarkistus paljastaa pm2,5: n NA-arvot ensimmäisten 24 tunnin aikana. Siksi meidän on poistettava ensimmäinen tietorivi. Tietojoukossa on myös muutama hajallaan oleva NA-arvo; voimme merkitä ne nyt 0 arvolla.
Alla oleva komentosarja lataa raaka-aineiston ja jäsentää päivämäärä- ja aikatiedot Pandas DataFrame -hakemistona. ”Ei” -sarake pudotetaan ja kullekin sarakkeelle määritetään selkeämmät nimet. Lopuksi NA-arvot korvataan 0-arvoilla ja ensimmäiset 24 tuntia poistetaan.
”Ei” -sarake pudotetaan ja kullekin sarakkeelle määritetään selkeämmät nimet. Lopuksi NA-arvot korvataan 0-arvoilla ja ensimmäiset 24 tuntia poistetaan.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
alkaen pandat tuonti Lue_csv alkaen treffiaika tuonti treffiaika # lataa tietoja def jäsentää(x): palata treffiaika.strptime(x, '% Y% m% d% H') tietojoukko = Lue_csv("raw.csv", parse_dates = [['year', 'month', 'day', 'hour']], hakemisto_kol=0, date_parser=jäsentää) tietojoukko.pudota('Ei', akseli=1, paikallaan=Totta) # määritä sarakkeiden nimet manuaalisesti tietojoukko.sarakkeita = ['pollution', 'dew', 'temp', 'press', 'wnd_dir', 'wnd_spd', 'snow', 'rain'] tietojoukko.indeksi.nimi = 'Päivämäärä' # merkitse kaikki NA-arvot 0: lla tietojoukko['pollution'].fillna(0, paikallaan=Totta) # pudota ensimmäiset 24 tuntia tietojoukko = tietojoukko[24:] # yhteenveto viidestä ensimmäisestä rivistä Tulosta(tietojoukko.pää(5)) # tallenna tiedostoon tietojoukko.to_csv("saastuminen.csv") |
Esimerkin suorittaminen tulostaa muunnetun tietojoukon 5 ensimmäistä riviä ja tallentaa tietojoukonsaastuminen.csv“.
saaste kastepisteen painallus wnd_dir wnd_spd lumisade Päivämäärä 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 |
Nyt kun meillä on tiedot helppokäyttöisessä muodossa, voimme luoda jokaisesta sarjasta nopean kuvan ja nähdä, mitä meillä on.
Alla oleva koodi lataa uudensaastuminen.csv”Tiedosto ja piirtää jokaisen sarjan erillisenä osajohtona, paitsi tuulen nopeuden dir, joka on kategorinen.
alkaen pandat tuonti Lue_csv alkaen matplotlib tuonti pyplot # lataa tietojoukko tietojoukko = Lue_csv("saastuminen.csv", otsikko=0, hakemisto_kol=0) arvot = tietojoukko.arvot # määritä piirrettävät sarakkeet ryhmät = [0, 1, 2, 3, 5, 6, 7] i = 1 # piirrä kukin sarake pyplot.kuva() varten ryhmä sisään ryhmät: pyplot.sivujuoni(len(ryhmät), 1, i) pyplot.juoni(arvot[:, group]) pyplot.otsikko(tietojoukko.sarakkeita[group], y=0.5, Loc="oikea") i + = 1 pyplot.näytä() |
Esimerkin suorittaminen luo kaavion, jossa on 7 alakäyrää, jotka näyttävät kunkin muuttujan 5 vuoden tiedot.

Viivakaaviot ilmansaasteiden aikasarjoista
3. Monimuuttujainen LSTM-ennustemalli
Tässä osassa sovitamme ongelmaan LSTM: n.
LSTM-tietojen valmistelu
Ensimmäinen vaihe on valmistaa saastumistietojoukko LSTM: ää varten.
Tähän sisältyy tietojoukon muotoilu valvotuksi oppimisongelmaksi ja syötemuuttujien normalisointi.
Kehitämme valvotun oppimisongelman ennustamalla pilaantumisen kuluvalla tunnilla
Tämä muotoilu on yksinkertainen ja vain tätä esittelyä varten. Joitakin vaihtoehtoisia formulaatioita, joita voit tutkia, ovat:
- Ennusta saaste seuraavalle tunnille sääolosuhteiden ja viimeisen 24 tunnin pilaantumisen perusteella.
- Ennusta pilaantuminen seuraavalle tunnille kuten yllä ja ottaen huomioon seuraavan tunnin "odotetut" sääolosuhteet.
Voimme muuntaa tietojoukon käyttämällä sarjan_valvottu () blogikirjoituksessa kehitetty toiminto:
Ensinnäkinsaastuminen.csv”Tietojoukko ladataan. Tuulen suuntaominaisuus on koodattu etiketillä (koodattu kokonaisluku). Tämä voi olla koodattu myös jatkossa, jos olet kiinnostunut tutkimaan sitä.
Seuraavaksi kaikki ominaisuudet normalisoidaan, sitten aineisto muutetaan valvotuksi oppimisongelmaksi. Sen jälkeen ennustettavan tunnin
Täydellinen koodiluettelo on alla.