Hur man testar maskininlärningsmodeller för prognoser för tidsserier

Hur man testar maskininlärningsmodeller för prognoser för tidsserier

k-fold Cross Validation Fungerar inte för tidsseriedata och
Tekniker som du kan använda istället.

Målet med tidsserieprognoser är att göra korrekta förutsägelser om framtiden.

De snabba och kraftfulla metoderna som vi förlitar oss på vid maskininlärning, som att använda tågtestdelningar och k-korsvalidering, fungerar inte när det gäller tidsseriedata. Detta beror på att de ignorerar de temporala komponenterna som är inneboende i problemet.

I denna handledning kommer du att upptäcka hur du utvärderar maskininlärningsmodeller på tidsseriedata med Python. När det gäller prognoser för tidsserier kallas detta backtesting eller hindcasting.

Efter att ha slutfört denna handledning vet du:

  • Begränsningarna av traditionella metoder för modellutvärdering från maskininlärning och varför det krävs att utvärdera modeller utifrån exempeldata.
  • Hur man skapar tågtestdelningar och flera tågtestdelningar av tidsseriedata för modellutvärdering i Python.
  • Hur framåtriktad validering ger den mest realistiska utvärderingen av maskininlärningsmodeller på tidsseriedata.

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 börja.

  • Uppdaterad apr / 2019: Uppdaterade länken till dataset.
  • Uppdaterad augusti / 2019: Fixat litet stavfel i antalet modeller som används vid framåtvalidering (tack Eliav).
  • Uppdaterad augusti / 2019: Uppdaterad dataladdning för att använda nytt API.
Hur man testar maskininlärningsmodeller för prognoser för tidsserier

Hur man testar maskininlärningsmodeller för prognoser för tidsserier
Foto av Nasa, vissa rättigheter reserverade.

Modellutvärdering

Hur vet vi hur bra en viss modell är?

Vi kan utvärdera den på de data som används för att träna den. Detta skulle vara ogiltigt. Det kan ge insikt i hur den valda modellen fungerar och till och med hur den kan förbättras. Men varje uppskattning av prestanda på dessa data skulle vara optimistisk, och alla beslut baserade på denna prestanda skulle vara partiska.

Varför?

Det är bra att ta det ytterst:

En modell som kom ihåg tidsstämplarna och värdet för varje observation
skulle uppnå perfekt prestanda.

Alla riktiga modeller vi förbereder kommer att rapportera en blek version av detta resultat.

När vi utvärderar en modell för tidsserieprognoser är vi intresserade av prestanda för modellen på data som inte användes för att träna den. I maskininlärning kallar vi detta osynligt eller ur exempeldata.

Vi kan göra detta genom att dela upp den information som vi har tillgänglig. Vi använder några för att förbereda modellen och vi håller tillbaka lite data och ber modellen att förutsäga för den perioden. Utvärderingen av dessa förutsägelser kommer att ge en bra proxy för hur modellen kommer att fungera när vi använder den operativt.

I tillämpad maskininlärning delar vi ofta upp våra data i ett tåg och en testuppsättning: den träningsuppsättning som används för att förbereda modellen och den testuppsättning som används för att utvärdera den. Vi kan till och med använda k-korsvalidering som upprepar denna process genom att systematiskt dela upp data i k-grupper, var och en ges en chans att vara en uthållen modell.

Dessa metoder kan inte användas direkt med tidsseriedata.

Detta beror på att de antar att det inte finns något samband mellan observationerna, att varje observation är oberoende.

Detta gäller inte tidsseriedata, där tidsdimensionen för observationer innebär att vi inte slumpmässigt kan dela upp dem i grupper. Istället måste vi dela upp data och respektera den tidsmässiga ordning i vilken värden observerades.

I tidsserieprognoser kallas denna utvärdering av modeller på historisk data backtesting. I vissa tidsseriedomäner, såsom meteorologi, kallas detta hindcasting, i motsats till prognoser.

Vi kommer att titta på tre olika metoder som du kan använda för att testa dina maskininlärningsmodeller på tidsserieproblem. Dom är:

  1. Split-tågtest som respekterar den tidsmässiga observationsordningen.
  2. Flera tågtestdelningar som respekterar den tidsmässiga observationsordningen.
  3. Validering framåt där en modell kan uppdateras varje gång nya data tas emot.

Låt oss först ta en titt på små, univariata tidsseriedata som vi kommer att använda som sammanhang för att förstå dessa tre backtestmetoder: Sunspot-datasetet.

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ånadlig Sunspot-datauppsättning

Denna dataset beskriver en månatlig räkning av antalet observerade solfläckar i drygt 230 år (1749-1983).

Enheterna är ett antal och det finns 2.820 observationer. Källan till datasetet krediteras som Andrews & Herzberg (1985).

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

Nedan följer en plot av hela datasetet.

Månadlig Sunspot-datauppsättning

Månadlig Sunspot-datauppsättning

Datauppsättningen visar säsongsmässighet med stora skillnader mellan säsonger.

Ladda ner datamängden och spara den i din nuvarande arbetskatalog med filnamnet “sunspots.csv“.

Ladda Sunspot Dataset

Vi kan ladda Sunspot-datasetet med Pandas.

Att köra exemplet skriver ut de första 5 raderna med data.

Datauppsättningen plottas också.

Plot av Sunspot Dataset

Plot av Sunspot Dataset

Tågtest Split

Du kan dela din dataset i utbildning och testa delmängder.

Din modell kan förberedas på träningsdatasetet och förutsägelser kan göras och utvärderas för testdataset.

Detta kan göras genom att välja en godtycklig delningspunkt i den beställda observationslistan och skapa två nya datamängder. Beroende på mängden data du har tillgänglig och mängden data som krävs kan du använda delningar på 50-50, 70-30 och 90-10.

Det är enkelt att dela data i Python.

Efter att ha laddat datauppsättningen som en Pandas-serie kan vi extrahera NumPy-matrisen med datavärden. Delningspunkten kan beräknas som ett specifikt index i matrisen. Alla poster fram till delningspunkten tas som träningsdataset och alla poster från delningspunkten till slutet av observationslistan tas som testuppsättningen.

Nedan följer ett exempel på detta i Python med en split på 66-34.

Genom att köra exemplet skrivs ut storleken på den laddade datauppsättningen och storleken på tåget och testuppsättningar som skapats från delningen.

Vi kan göra detta visuellt genom att planera tränings- och testuppsättningarna i olika färger.

Genom att köra exemplet ritas träningsdatasetet som blått och testdatasetet som grönt.

Sunspot Dataset Train-Test Split

Sunspot Dataset Train-Test Split

Att använda en tågtestdelningsmetod för att utvärdera maskininlärningsmodeller är snabb. Att förbereda data är enkelt och intuitivt och endast en modell skapas och utvärderas.

Det är användbart när du har en stor mängd data så att både träning och testuppsättningar är representativa för det ursprungliga problemet.

Därefter ser vi på att upprepa denna process flera gånger.

Flera tågtestdelningar

Vi kan upprepa processen att dela upp tidsserien i tåg och testuppsättningar flera gånger.

Detta kommer att kräva att flera modeller tränas och utvärderas, men denna ytterligare beräkningskostnad ger en mer robust uppskattning av den förväntade prestandan för den valda metoden och konfigurationen på osedda data.

Vi kan göra detta manuellt genom att upprepa processen som beskrivs i föregående avsnitt med olika splitpunkter.

Alternativt ger scikit-learning-biblioteket denna möjlighet för oss i TimeSeriesSplit objekt.

Du måste ange antalet delningar som ska skapas och TimeSeriesSplit att returnera tågens index och testa observationer för varje begärd delning.

Det totala antalet tränings- och testobservationer beräknas varje delad iteration (i) som följer:

Var n_prover är det totala antalet observationer och n_splits är det totala antalet delningar.

Låt oss göra detta konkret med ett exempel. Antag att vi har 100 observationer och att vi vill skapa två delningar.

För den första delningen beräknas tåg- och teststorlekarna enligt följande:

Eller de första 33 posterna används för träning och de nästa 33 posterna används för testning.

Den andra delningen beräknas enligt följande:

Du kan också vara intresserad av