Grundläggande funktionsteknik med tidsseriedata i Python

Grundläggande funktionsteknik med tidsseriedata i Python

Tidsseriedata måste omramas som en övervakad inlärningsdataset innan vi kan börja använda maskininlärningsalgoritmer.

Det finns inget begrepp med in- och utgångsfunktioner i tidsserier. Istället måste vi välja variabeln som ska förutses och använda funktionsteknik för att konstruera alla ingångar som kommer att användas för att göra förutsägelser för framtida tidssteg.

I denna handledning kommer du att upptäcka hur du utför funktionsteknik på tidsseriedata med Python för att modellera ditt tidsserieproblem med maskininlärningsalgoritmer.

Efter att ha slutfört denna handledning vet du:

  • Motivet och målen för funktionsteknik tidsseriedata.
  • Hur man utvecklar grundläggande datumbaserade inmatningsfunktioner.
  • Hur man utvecklar mer sofistikerade statistikfunktioner för fördröjning och skjutfönster.

Starta ditt projekt med min nya bok Time Series Forecasting With Python, inklusive steg-för-steg-självstudier och den Python-källkod filer för alla exempel.

Låt oss dyka in.

  • Uppdaterad juni / 2017: Fixade ett stavfel i det expanderande fönstrets kodexempel.
  • Uppdaterad apr / 2019: Uppdaterade länken till dataset.
  • Uppdaterad augusti / 2019: Uppdaterad dataladdning för att använda nytt API.
  • Uppdaterad Sep / 2019: Fixat fel i datainläsning.
Grundläggande funktionsteknik med tidsseriedata i Python

Grundläggande funktionsteknik med tidsseriedata i Python
Foto av José Morcillo Valenciano, vissa rättigheter förbehållna.

Funktionsteknik för tidsserier

En tidsserieuppsättning måste omvandlas för att modelleras som ett övervakat inlärningsproblem.

Det är något som ser ut som:

Till något som ser ut som:

Så att vi kan träna en övervakad inlärningsalgoritm.

Inputvariabler kallas också för funktioner inom maskininlärning, och uppgiften framför oss är att skapa eller uppfinna nya inmatningsfunktioner från vår tidsserieuppsättning. Helst vill vi bara ha inmatningsfunktioner som bäst hjälper inlärningsmetoderna att modellera förhållandet mellan ingångarna (X) och utgångarna (y) som vi vill förutsäga.

I denna handledning kommer vi att titta på tre klasser av funktioner som vi kan skapa från vår tidsserieuppsättning:

  1. Datum Tid Funktioner: dessa är komponenter i själva tidssteget för varje observation.
  2. Fördröjningsfunktioner: dessa är värden vid tidigare tidsteg.
  3. Fönsterfunktioner: dessa är en sammanfattning av värden över ett fast fönster med tidigare tidsteg.

Innan vi dyker in i metoder för att skapa inmatningsfunktioner från vår tidsseriedata, låt oss först granska målet med funktionsteknik.

Sluta lära sig tidsserieprognoser långsam väg!

Ta min gratis 7-dagars e-postkurs och upptäck hur du kommer igång (med exempelkod).

Klicka för att registrera dig och få en gratis PDF-e-bokversion av kursen.

Starta din GRATIS minikurs nu!

Mål för Feature Engineering

Målet med funktionsteknik är att tillhandahålla starka och idealt enkla relationer mellan nya inmatningsfunktioner och utdatafunktionen för den övervakade inlärningsalgoritmen att modellera.

I själva verket är vi rörliga komplexitet.

Komplexitet finns i förhållandena mellan in- och utdata. När det gäller tidsserier finns det inget begrepp med input- och output-variabler. vi måste uppfinna dessa också och inrama det övervakade inlärningsproblemet från grunden.

Vi kan luta oss till förmågan hos sofistikerade modeller för att dechiffrera problemets komplexitet. Vi kan göra jobbet för dessa modeller enklare (och till och med använda enklare modeller) om vi bättre kan avslöja det inneboende förhållandet mellan ingångar och utgångar i data.

Svårigheten är att vi inte känner till det underliggande funktionella förhållandet mellan ingångar och utgångar som vi försöker exponera. Om vi ​​visste skulle vi förmodligen inte behöva maskininlärning.

Istället är den enda återkopplingen vi har prestanda för modeller som utvecklats på de övervakade inlärningsdataset eller "vyer" av problemet vi skapar. I själva verket är den bästa standardstrategin att använda all tillgänglig kunskap för att skapa många bra datamängder från din tidsserieuppsättning och använda modellprestanda (och andra projektkrav) för att avgöra vilka bra funktioner och bra syn på ditt problem som råkar vara.

För tydlighetens skull kommer vi att fokusera på en univariat (en variabel) tidsserieuppsättning i exemplen, men dessa metoder är lika användbara för multivariata tidsserieproblem. Låt oss sedan ta en titt på datamängden vi kommer att använda i den här handledningen.

Minsta dagliga temperaturuppsättning

I det här inlägget kommer vi att använda datamängden Minsta dagliga temperatur.

Denna dataset beskriver de lägsta dagliga temperaturerna över 10 år (1981-1990) i Melbourne, Australien.

Enheterna är i grader Celsius och det finns 3650 observationer. Källan till uppgifterna krediteras som Australian Bureau of Meteorology.

Nedan följer ett exempel på de fem första raderna med data, inklusive rubrikraden.

Nedan följer en plot av hela datasetet.

Lägsta dagliga temperaturer

Lägsta dagliga temperaturer

Datauppsättningen visar en ökande trend och möjligen vissa säsongskomponenter.

Datum Tid Funktioner

Låt oss börja med några av de enklaste funktionerna som vi kan använda.

Dessa är funktioner från datum / tid för varje observation. Faktum är att dessa kan börja enkelt och gå in i ganska komplexa domänspecifika områden.

Två funktioner som vi kan börja med är heltal månad och dag för varje observation. Vi kan föreställa oss att övervakade inlärningsalgoritmer kanske kan använda dessa ingångar för att reta ut säsongsinformation från årstiden eller månaden.

Det övervakade inlärningsproblemet vi föreslår är att förutsäga den dagliga minimitemperaturen angiven månad och dag enligt följande:

Vi kan göra detta med Pandas. Först laddas tidsserien som en Panda Serier. Vi skapar sedan en ny panda DataFrame för den transformerade dataset.

Därefter läggs varje kolumn till en i taget där månads- och daginformation extraheras från tidsstämpelinformationen för varje observation i serien.

Nedan finns Python-koden för att göra detta.

Genom att köra det här exemplet skrivs de första 5 raderna i den transformerade datasetet ut.

Att bara använda informationen om månad och dag för att förutsäga temperatur är inte sofistikerad och kommer sannolikt att resultera i en dålig modell. Ändå kan denna information i kombination med ytterligare konstruerade funktioner i slutändan resultera i en bättre modell.

Du kan räkna upp alla egenskaper för en tidsstämpel och överväga vad som kan vara användbart för ditt problem, till exempel:

  • Protokoll har gått för dagen.
  • Timme på dagen.
  • Öppettider eller inte.
  • Helg eller inte.
  • Årets säsong.
  • Årets kvartal.
  • Sommartid eller inte.
  • Helgdag eller inte.
  • Skottår eller inte.

Från dessa exempel kan du se att du inte är begränsad till de råa heltalsvärdena. Du kan också använda binära flaggfunktioner, som om observationen registrerades på en helgdag eller inte.

När det gäller minsta temperaturuppsättning kanske säsongen skulle vara mer relevant. Det skapar domänspecifika funktioner som detta som är mer benägna att ge mervärde till din modell.

Datum-tidsbaserade funktioner är en bra start, men det är ofta mycket mer användbart att inkludera värdena vid tidigare tidsteg. Dessa kallas fördröjda värden och vi kommer att titta på att lägga till dessa funktioner i nästa avsnitt.

Fördröjningsfunktioner

Fördröjningsfunktioner är det klassiska sättet att tidsserieprognosproblem förvandlas till övervakade inlärningsproblem.

Det enklaste tillvägagångssättet är att förutsäga värdet vid nästa gång (t + 1) givet värdet vid föregående tid (t-1). Det övervakade inlärningsproblemet med förskjutna värden ser ut som följer:

Pandas-biblioteket tillhandahåller shift () -funktionen för att skapa dessa skiftade eller fördröjda funktioner från en tidsserieuppsättning. Om du flyttar datamängden med 1 skapas t-1-kolumnen och lägger till ett NaN-värde (okänt) för den första raden. Tidsserieuppsättningen utan skift representerar t + 1.

Låt oss göra detta konkret med ett exempel. De första 3 värdena i temperaturdatasetet är 20,7, 17,9 och 18,8. De skiftade och oförskjutna temperaturlistorna för de tre första observationerna är därför:

Vi kan sammanfoga de förskjutna kolumnerna till en ny DataFrame med funktionen concat () längs kolumnaxeln (axel = 1).

Sammanfatta allt nedan är ett exempel på att skapa en lagfunktion för vår dagliga temperaturuppsättning. Värdena extraheras från den laddade serien och en förskjuten och oförskjuten lista med dessa värden skapas. Varje kolumn heter också i DataFrame för tydlighets skull.

Genom att köra exemplet skrivs de fem första raderna i den nya datasetet ut med den lagrade funktionen.

Du kan se att vi måste kasta den första raden för att använda datamängden för att träna en övervakad inlärningsmodell, eftersom den inte innehåller tillräckligt med data att arbeta med.

Tillägget av fördröjningsfunktioner kallas metoden för skjutfönster, i det här fallet med en fönsterbredd på 1. Det är som om vi skjuter vårt fokus längs tidsserierna för varje observation med intresse för bara vad som ligger inom fönsterbredden.

Vi kan utöka fönstrets bredd och inkludera mer eftersläpna funktioner. Till exempel nedan ...

Du kan också vara intresserad av