• No results found

Lastprediktering: Med Neuralt Nätverk och Support Vector Regression

N/A
N/A
Protected

Academic year: 2022

Share "Lastprediktering: Med Neuralt Nätverk och Support Vector Regression"

Copied!
44
0
0

Loading.... (view fulltext now)

Full text

(1)

Lastprediktering

Med Neuralt nätverk och Support Vector Regression

Examensarbete inom elektroteknik

Johan Ericson

Institutionen för ingenjörvetenskap och fysik KARLSTADS UNIVERISTET

(2)
(3)

Examensarbete 2019

Lastprediktering

Med Neuralt nätverk och Support Vector Regression

Johan Ericson

Institutionen för ingenjörvetenskap och fysik Elektroteknik

Karlstads Universitet Arvika, Sweden 2019

(4)

Lastprediktering

Med Neuralt nätverk och Support Vector Regression Johan Ericson

© Johan Ericson, 2019.

Extern handledare: Magnus Nilsson, Glava Energy Center Intern handledare: Jorge Solis, Elektroteknik

Examinator: Magnus Mossberg, Elektroteknik

Examensarbete 2019

Institutionen för ingenjörsvetenskap och fysik Elektroteknik

Karlstads Universitet

Universitetsgatan 2, 651 88 Karlstad Telefon +46 54 700 10 00

(5)

Lastprediktering

Med Neuralt nätverk och Supprt Vector Regression Johan Ericson

Institutionen för ingenjörvetenskap och fysik Karlstads Universitet

Abstrakt

Arbetet har syftat till att med ett enkelt neuralt nätverk av LSTM-typ och en enkel Support Vector Regression modell prediktera förbrukad energi en och två timmar framåt i tiden baserat på 24 timmar av föregående data. De features som använts är väderrelaterade samt en som anger producerad energi från solpaneler. Datan som använts sträcker sig över drygt två månader och innehåller medelvärden per timme för den förbrukade energin i kWh och momentan värden för väderparametrarna en gång i timmen. Resultatet visar att det neurala nätverket ger godtagbara prognoser för energiförbrukningen med MAE = 1.21 kWh och en standardavvikelse för felen på 1.8 kWh. SVR-modellen har svårare att göra bra prognoser med en MAE på 1.84 och en standardavvikelse för felen på 2.73 kWh. Givet de enkla modellerna och den minimala förbehandlingen av datan kan resultatet anses vara bra, men utrymme för fortsatt arbete och förbättring finns. Modellerna gjordes i programspråket Python med hjälp av verktygen Keras och SKlearn. Arbetet visar också att det med relativt liten insats går att göra modeller för energi-prognoser på kort sikt som ger ett bra resultat.

Nyckelord: Prediktering, energiförbrukning, AI, NN, SVM, SVR.

(6)
(7)

Innehåll

Figurer ix

Tabeller xi

1 Introduktion 1

1.1 Bakgrund . . . 1

1.2 Val av metoder . . . 1

1.3 Problemdefinition . . . 2

1.4 Rapportens uppbyggnad . . . 2

2 Teori 3 2.1 Neuralt Nätverk . . . 3

2.1.1 Noder och vikter . . . 3

2.1.2 RNN och LSTM . . . 4

2.1.3 Backpropagation . . . 5

2.2 Support Vector Regression . . . 6

2.3 Data . . . 7

2.4 GridSearchCV . . . 7

2.5 Utvärdering . . . 7

3 Metod 9 3.1 Data . . . 9

3.1.1 Val av ’features’ . . . 10

3.2 Neuralt Nätverk (NN) . . . 10

3.3 Support Vector Regression (SVR) . . . 11

3.4 Utvärdering av modeller . . . 13

4 Resultat 15 4.1 Neuralt Nätverk . . . 15

4.2 Support Vector Regression . . . 18

4.3 Jämförelse . . . 20

5 Slutsats och fortsatt abrete 21 5.1 Slutsats . . . 21

5.2 Fortsatt arbete . . . 21

Bibliography 23

(8)

Innehåll

A Neurala Nätverket I

A.1 Split . . . I A.2 to_supervised . . . I A.3 Model . . . II A.4 Predict . . . II A.5 Grid search . . . III

B Support Vector Regression V

B.1 to_supervised . . . V B.2 models . . . V B.3 GridSearchCV . . . VII

(9)

Figurer

2.1 Nod och vikter . . . 3

2.2 Ett enkelt Feed Forward neuralt nätverk med ingångsvariablerna x som ger prediktionen y, information kan endast gå från in- till utlagret. 4 2.3 RNN princip, återmatning av tidigare steg skapar ett minne". . . 5

2.4 SVR och dess -zon samt avvikande värden ξ. . . . 6

3.1 GridSearchCV tränar varje generation av modellen på 1 del och ut- värderar på k − 1 delar och itererar tills varje generation har träntas på k olika delar av datan. . . . 12

3.2 Exempel på nya värden till GridSearchCV, inringat värde visar det som gett bästa resultat. . . 13

4.1 Prediktioner och verkliga värden för NN . . . 17

4.2 Spridning av fel för prediktion ett och två, NN . . . 18

4.3 Prediktioner och verkliga värden för SVR . . . 19

4.4 Spridning av fel för prediktion ett och två, SVR . . . 20

(10)

Figurer

(11)

Tabeller

3.1 Använda Bibliotek . . . 9

3.2 Använda Features . . . 10

3.3 Användning av data för NN . . . 11

3.4 Serier av data för SVR-modell . . . 11

3.5 Data tillgänglig för de två stegen i prognosen . . . 12

4.1 Utvärdering av antal noder i de tre lagren . . . 15

4.2 Utvärdering av learning rate och epoker . . . 16

4.3 Utvärdering av värden för parametrar i SVR . . . 18

4.4 Jämförelse av de två modellerna . . . 20

(12)

Tabeller

(13)

1

Introduktion

1.1 Bakgrund

Maskinlärning, mönsterigenkänning och AI är hetare än någonsin och användnings- områdena är otaliga. Ett sådant användningsområde är prediktering, att kunna göra en kvalificerad gissning om framtiden baserat på nuvarande och/eller tidigare till- stånd hos ett system. I många system finns mycket att vinna om kommande tillstånd är mer eller mindre känt, människor kan sätta upp regler baserat på hur ett system beter sig och på så sätt förutse vad som kommer att hända i framtiden men för endel system är variablerna allt för många och sambanden mellan dom för komplexa för att människor ska kunna sätta upp regler. Detta är det område där maskinlärning kommer till sin rätt, en dator har möjlighet att analysera stora mängder data på kort tid och lägga märke till små nyanser och samband i datan som är osynliga för oss människor och på så sätt dra slutsatser om framtida tillstånd. Det har länge varit önskvärt i energisektorn att kunna förutse kommande effektbehov för att ha ett bra underlag till kort -och långsiktiga beslut. Prognoser görs idag av aktörer på energimarknaden, Singh et al [6] gjorde 2013 en utredning av vilka metoder som används för att göra prognoser på energibehov som visar att det i stor utsträckning fortfarande används mer klassiska metoder som olika typer av regression, ARMA och ARIMA men också en handfull mer futuristiska metoder som Fuzzy Logic, neu- rala nätverk och Support Vector Machines. Av naturliga skäl gör stora aktörer på marknaden prognoser på stora energibehov och på lång sikt då de ofta förser större områden med energi, men med en växande trend av hem-automation och egenpro- ducerad energi från till exempel solceller finns ett ökat behov av prognoser i mindre skala för exempelvis ett flerfamiljshus, en villa eller ett kvarter. Prediktionerna kan i dessa sammanhang användas för optimera ett energilager eller på ett smart sätt flytta laster som tillåter det till tidpunkter då förbrukningen annars är låg.

1.2 Val av metoder

Det kanske mest populära sättet att idag använda sig av maskinlärning är neurala nätverk, de används för klassificering så väl som tidsbaserade regressioner och in- tresset för dom har fullkomligt exploderat i takt med att persondatorer blivit mer kraftfulla, intresset för denna typ av modeller har möjligen gett neurala nätverk något högre status är de förtjänar men har å andra sidan lett till en kraftig ut- veckling av nya typer av neurala nätverk de senaste 20-25 åren. En utvärdering av prediktions-tekniker utförd 1996 av Liu [7] kom fram till att neurala nätverk var

(14)

1. Introduktion

en av dåtidens mest framgångsrika sätt att utföra prognoser på just elektrisk last över en kort tidshorisont. Med detta som bakgrund valdes neuralt nätverk som en metod att utvärdera i detta arbete. För att utföra regression med neurala nätverk används en typ av nätverk kallade Recurrent Neural Network, eller mer specifikt Long, Short Term Memory-nätverk. Denna typ av nätverk publicerads av Schmid- huber och Hochreiter [8] 1997 för att lösa vissa problem som traditionella Recurrent Neural Networks har. De ger även möjlighet att ge nätverket en sekvens av data som input och få en sekvens av prediktioner som output.

En annan metod som sett stor utveckling under andra hälften av 1900-talet är Support Vector Machines, metoden som grundas på en teori av Vapnik och Chervo- nenkis. Den har sedan utvecklats av Vapnik med flera i omgångar och 1997 publi- cerades ett förslag på hur teorin skulle kunna användas för regression [9]. En studie utförd av Fu, Li, Zhang och Xu 2015 [10] visade att Support Vector Regression med stor framgång användes för att prediktera elektrisk last på timbasis. En av förde- larna med denna metod är att den är lättare att implementera (inte nödvändigtvis lättare att förstå) och kräver mindre tid och processorkraft att bygga och träna, så kan goda resultat nås med denna metod kan det ha sina vinningar. Ladjici et al undersökte 2009 vilka användningsområden Support Vector Machines kan ha i elkraftssystem [11] och skriver i sin konklusion: ”De erhållna resultaten visar en bra prestanda trots modellens enkelhet och knapphändig tillgång på data.”

1.3 Problemdefinition

Arbetet syftar till att göra prognoser på energiförbrukningen två timmar framåt i tiden baserat på last -och väderdata från föregående 24 timmar med två olika metoder, ett neuralt nätverk och SVR.

1.4 Rapportens uppbyggnad

Kapitel två ger en kort beskrivning av de två modellerna och teorin bakom dom samt definitioner av de statistiska indikatorer som används för att utvärdea modellerna.

Kapitel 3, Metod, ger en beskrivning av hur metoderna implementeras i arbetet och ger en överblick över den data som använts och hur den användes. Resultatet från optimeringen av modellerna och dess prediktioner presenteras i katiptel 4, här ges även en beskrivning av hur optimeringen gjordes. Kapitel 5 ger slutsatser som dragits av arbetet. Därefter följer referenser och appendix innehållande delar av kod.

(15)

2

Teori

2.1 Neuralt Nätverk

Ett neuralt nätverk är en algoritm som är uppbyggd för att likna en biologisk hjärna, det består i sitt grundutförande av en samling sk. noder (neuroner) fördelade i olika lager. Antalet noder och lager beror av komplexiteten i sambanden i den data som används för att träna modellen, en modell med fler noder och fler lager kan således lära sig mer komplexa samband i ett större dataset, men risken finns också att ett allt för stort nätverk appliceras på data där sambanden inte är så komplexa. Noderna i ett lager förbinds med noderna i ett annat lager genom vikter, processen att dessa noder och vikter ändrar värden utgör själva lärandet för det neurala nätverket.

2.1.1 Noder och vikter

En nod är ses som en punkt där vikter och värden från noderna i föregående lager summeras och ger en nytt värde som länkas till nästa lager genom en ny vikt, figu- ren nedan visar principen för en nod och vikterna som ansluter. Noderna applicerar också en icke-linjär aktiveringsfunktion samt adderar en bias, för regressionsproblem är Rectified Linear Activation function (ReLU) den mest använda aktiveringsfunk- tionen, denna funktion definieras av ekvation 2.1.

Figur 2.1: Nod och vikter

(16)

2. Teori

y =

b +Pni=1(Xi∗ Wi), om xi∗ wi ≥ 1

0, annars (2.1)

Ett nätverk måste ha minst ett ingångslager för att ta in de parametrar som modellen ska använda för att göra prediktioer, ett dolt lager samt ett utgångslager som ger prediktionen. Beroende på vad som ska predikteras ser utgångslagret olika ut, vid regression som i detta arbete består utgångslagret av en enda nod medan antalet utgångsnoder i ett klassificeringsproblem avgörs av hur många klasser utgången delas in i.

Figur 2.2: Ett enkelt Feed Forward neuralt nätverk med

ingångsvariablerna x som ger prediktionen y, information kan endast gå från in- till utlagret.

2.1.2 RNN och LSTM

RNN står för Recurrent Neural Network, en typ av nätverk som har ett internt minne"vilket möjliggör att de kan ta tillvara på information i sekvenser av indata.

Minnet är i form av att tidigare värden för en nod matas tillbaka i noden då ett nytt värde antas och modellen kan på så sätt ”minnas” tidigare värden från sekvensen data och uppfatta mönster i tid, detta gör RNN utmärkta för att göra prediktioner på tidsbaserat data.

(17)

2. Teori

Figur 2.3: RNN princip, återmatning av tidigare steg skapar ett minne".

Ett problem som kan uppstå med den återkoppling som sker i ett RNN-nätverk är exploderande eller försvinnande noder, vilket i praktiken betyder att noder får alldeles för stor eller ingen inverkan på hur prediktionen görs vilket leder till ett dåligt resultat. För att undvika detta problem utvecklades LSTM-nätverk. LSTM står för Long, Short Term Memory, denna typ av nätverk bygger på en typ av noder kallade LSTM-enheter som innehåller fler funktioner som exempelvis en minnescell och en gate för att glömma tidigare steg som är irrelevanta. LSTM nätverket har också som namnet antyder en förmåga att minnas längre tidssekvenser.

2.1.3 Backpropagation

Ett neuralt nätverk ”lär sig” genom att göra en prediktion för att sedan jämföra denna med det verkliga värdet, detta ger upphov till ett fel som sedan används för att uppdatera vikterna och noderna i nätverket, förfarandet går under namnet Backpropagation. För att bestämma hur mycket vikterna och noderna ska ändras och i vilken riktning de ska ändras används metoden gradient descent, denna metod använder derivatan av en given loss funktion, en av de vanligaste funktionerna som används är mean squared error definierat av ekvation 2.2 där ˆy är det predikterade värdet och y är det verkliga värdet.

M SE = 1 n

n

X

i=1

(yi− yˆ i)2 (2.2)

Målet med att träna ett neuralt nätverk är att minimera resultatet av ekvation 2.2 eftersom den i någon mening beskriver hur nära modellens prediktioner är de verkliga värdena. Minimeringen görs genom att derivera funktionen med avseende på vikter och noder i nätverket beskrivet i ekvation 2.3 där θ betecknar noderna och vikterna i nätverket, α är learning rate och E(X, θ) betecknar loss-funktionen [12].

θt+1= θt− αδE(X, θt)

δθ (2.3)

Nätverket lär sig i omgångar, så kallade epoker. En epok uppdaterar alla noder och vikter en gång. För att kunna bestämma hur stor förändring som görs varje gång

(18)

2. Teori

används parametern learning rate, en liten learning rate ökar chansen att träffa ett minimum i loss-funktionen men kan också göra att det kräver fler träningsomgångar att komma dit. En hög learning rate kan däremot göra att minimi-punkten i loss- funktionen missas och resultatet blir lidande.

2.2 Support Vector Regression

Support Vector Regression (SVR) är en typ av regression utvecklad till stor del av Vladimir Vapnik i omgångar mellan 60- och 90-talet. Metoden bygger på att funktionen som ska anpassas kan ses som linjär i en högre dimension även om den är olinjär i ingångs-dimensionen. I övrigt kan SVR liknas vid regression med minsta kvadratmetoden, där en linje anpassas efter observationer och den linje som ger minsta totala avvikelsen från dessa punkter är den som passar bäst. En sak som skiljer de två metoderna åt är dock att SVR använder en så kallad -zon.

Observationerna inom denna zon bidrar inte till det totala felet, på så sätt kan SVR tillåta eller ta hänsyn till en variation i observationerna och se dessa som normala för den funktion som ska anpassas. Avvikande värde (outliers) är de värden som ligger utanför denna zon, ger upphov till fel och betecknas ξ. Då modellen ska anpassas är

 en parameter som kan varieras, en annan viktig parameter som kan varieras är C, en konstant som avgör hur stor ”bestraffning” som utdelas för punkter som ligger utanför -zonen, en hög bestraffning gör att avvikande värden får större inflytande på hur funktionen anpassas, men kan också leda till så kallad overfitting. Ekvation 2.4 ger en definition av SVR given av [15].

min1

2||w||2+ C

n

X

i=1

i∗ ξi)

krav

yi− < w, xi > −b, ≤  + ξi

< w, xi > +b − yi, ≤  + ξi ξi, ξi, ≥ 0

(2.4)

Figur 2.4: SVR och dess -zon samt avvikande värden ξ.

(19)

2. Teori

För att transformera datan till högre dimensioner använder SVR-algoritmen så kal- lade kernels [15], för att på så sätt kunna anpassa olinjära funktioner, den kernel som i regel används för regression är RBF - Radial Basis Function. Olika kernels mappar ingångsdatan till högre dimensioner på olika sätt, ekvation 2.5 beskriver RBF. [16]

K(xi, xj) = e−γ(xi−xj)2 (2.5)

2.3 Data

Då modellerna endast kan ta tal som ingångsvärden görs klockslag till en periodisk sekvens mellan -1 och 1 av tal, detta görs med hjälp av ekvation 3.2 där t är tiden som ett tal och T är klockslaget i hela timmar.

t = sin(2π ∗ T /24) (2.6)

2.4 GridSearchCV

För att bestämma den mest framgångsrika SVR-modellen användes ett verktyg från SciKitlearn kallat GridSearhCV, verktyget tar emot värden för de parametrar som ska utvärderas och testar sedan alla möjliga kombinationer av dessa (Grid search).

Dessutom delas datasetet in i k antal delar för att utföra en korsvalidering (cross validation, CV), där en av delarna används för att bygga modellen och k − 1 delar används för att testa modellen. Varje modell utvärderas sedan med ett poäng R2- score, eller determinationskoefficienten. Olika definitioner finns av denna koefficient och det framgår i SKlearns dokumentation [2] ingen matematisk beskrivning av hur den beräknas i just detta fall. Gemensamt för olika definitioner är dock att ett högt R2-värde ”är samma sak som” en låg summa av avvikelser i prediktionerna mot de verkliga värdena [5].

2.5 Utvärdering

För att utvärdera hur väl modellerna predikterar används fyra indikatorer, dessa appliceras på predikterade och verkliga värden för att få en indikation på hur bra prediktionerna faktiskt är.

MAE RMSE MAPE Standardavvikelse

MAE – Mean Absolute Error är medelvärdet av det absoluta felet för prediktionerna.

Denna indikator har fördelen att medelfelet ges i samma enhet som den storhet som predikteras. Detta gör den lätt att tolka och förstå, ett MAE på X kWh betyder således att vi kan förvänta oss att prediktionerna i medelvärde avviker från det

(20)

2. Teori

verkliga värdet med X kWh. MAE bestäms enligt ekvation 2.7, där yi är det verkliga värdet och ˆy är det predikterade värdet.

M AE = 1 n

n

X

i=1

|yi− ˆyi| (2.7)

RMSE – Root Mean Square Error ger precis som MAE felet I samma enhet som den storhet som predikteras. Skillnaden i metoderna är att RMSE använder kvadrering av differensen mellan prediktion och faktiskt värde, detta får följden att ett större fel bidrar mer till medelvärdet än för MAE. Därefter beräknas medelvärdet av dessa kvadrerade fel, för att sedan komma tillbaka till samma enhet drar man kvadratroten ur medelvärdet. Ekvation 2.8 beskriver RMSE, yi är det verkliga värdet och ˆy är det predikterade värdet.

RM SE =

v u u t

1 n

n

X

i=1

(yi− ˆyi)2 (2.8)

Genom att undersöka hur de två ovan nämnda indikatorerna ligger i relation till varandra kan man säga något om fördelningen på felen. Är RMSE högre än MAE är det en indikator på att större fel är mer frekventa[17].

MAPE - Mean Absolute Percentage Error Utrycker samma som MAE men i detta fall i procent av det faktiska värdet.

M AP E = 100%

n

n

X

i=1

|yv − ˆy

yv | (2.9)

Ekvation 2.9 beskriver MAPE, där yvär det verkliga värdet och ˆy är det predikterade värdet.

Standardavvikelsen används för att ge information om spridningen av felen i kWh.

Standardavvikelsen beskrivs av ekvation 2.10 där ¯y är medelvärdet av felen och yi är en individuellt fel.

σ =

v u u t

1 n

n

X

i=1

(yi− ¯y)2 (2.10)

(21)

3

Metod

Modellerna byggdes och utvärderas i programspråket Python med hjälp speciali- serade bibliotek för databehandling, neurala nätverk, Support Vector Regression och grafik. Alla bibliotek är open source och tillgängliga online med bra guider och dokumentation.

Tabell 3.1: Använda Bibliotek

Bibliotek Användning Pandas databehandling

Numpy databehandling

SciKitlearn SVR och databehandling Keras Neuralt Nätverk

Matplotlib Grafik

Pandas användes då det erbjuder ett smidigt sätt att använda csv-filer som lätt kan behandlas i python-miljön vilket underlättade arbetet med stora dataset. Numpy innehåller bra verktyg för behandla vektorer vilket var nödvändigt i vissa delar av koden. SciKitLearn användes för att skapa en SVR-modell, beräkna RMSE och MAE samt för att använda GridSearchCV. Keras är ett API utvecklat för att göra det enkelt att skapa och optimera neurala nätverk. Grafiken i projektet har skapats med Matplotlib.

3.1 Data

Data på energiförbrukningen består av kWh-värden från ett flerfamiljshus i Karlstad med FerroAmp EnergyHub installerad, utrustningen förser huset med energi från nät och lokalt installerade solceller. Den loggar också mätningar för effektförbrukningen en gång i minuten som sedan används för att ge värden på förbrukad kWh/timme direkt från dess web-interface. Dessa energivärden parades sedan ihop med historiska väderdata från SMHIs mätningar i Karlstad, denna data består av momentanvär- de en gång i timmen. Att väderdatan endast innehåller momentanvärden är inte optimalt, ett medelvärde hade möjligen gett ett annat resultat. Datan sträcker sig mellan 18/3-2019 och 5/5-2019. En mer ändamålsenlig datainsamling av väderpa- rametrar med högre samplingsfrekvens skulle ökat upplösningen på prediktionerna och snabbare variationer skulle möjligen kunna predikteras för att ytterligare effek- tivisera lagring och användning av lokalt producerad energi, men sådan utrustning

(22)

3. Metod

fanns ej tillgänglig. För att bygga/träna och testa modellerna delas datan in i två delar, en för att träna/bygga och en för att testa. Testdelen används endast för att göra faktiska prediktioner på då det är viktigt framför allt för det neurala nätverket att data som används för utvärdering inte tidigare visats för modellen eftersom det- ta skulle innebära att modellen redan ”vet svaret” till den specifika kombinationen av indata. För utvärdering används data från samma anläggning under perioden 11/05-2019 till 17/05-2019, detta för att säkerställa att utvärderingen görs på data modellerna aldrig kan ha sett tidigare. Datan har inte normaliserats eller skalats då alla parametrar bedömdes ha ungefär samma storleksordning och givet den korta tiden för projektet prioriterades inte detta.

3.1.1 Val av ’features’

Features är benämningen på indata till modellerna, det vill säga de parametrar som används för att göra prediktionerna på energiförbrukningen, dessa visas i tabell 3.2.

Utdata, den parameter som ska predikteras kallas Label. I detta fall finns endast en sådan, vilket är den förbrukade energin i kWh. Solproduktion i tabell 3.2 är den energi som produceras i systemets egna solceller.

Tabell 3.2: Använda Features

Parameter Enhet

Temperatur celsius Relativ Luftfuktighet %

Vindhastighet m/s

Förbrukning kWh

Solproduktion kWh

3.2 Neuralt Nätverk (NN)

Det neurala nätverket byggdes med hjälp av Keras API, programmet är i stora delar inspirerat av [14] som gjort ett LSTM-nätverk för just prediktering av elektrisk last men med annan tidshorisont. Nätverket består av fyra lager, det första är av LSTM- typ för att kunna ta in en sekvens av data och fånga trender i sekvensen, därefter används ytterligare ett LSTM-lager där varje nod ger två prediktioner som sedan ligger till grund för den faktiska prognosen. Lager tre och fyra använder informatio- nen från tidigare lager för att till slut ge ett värde på den faktiska prediktionen [14].

Parametrar som kan optimeras för nätverket är antalet noder i lagren, learning rate och träningsepoker. Detta gjordes genom skapa listor med olika värden för dessa parametrar och iterera genom listorna tills alla möjliga kombinationer av dessa har testats. Anledningen till detta framgångssätt är att det finns ingen matematisk for- mel eller definition som beskriver hur stort exempelvis antalet noder ska vara eller vilken learning rate som ger bästa resultatet då det är helt avhängigt av hur datan ser ut och hur komplexa sambanden i datat är. Därför används denna trail and error metod för att utvärdera vilka parametrar som ger bästa resultat. På grund av att

(23)

3. Metod

neurala nätverk utgår från slumpmässiga värden på sina noder och vikter vid första träningstillfället körs dessutom varje kombination av parametrarna tre gånger för att få en säkrare indikation på vilken uppsättning parametrar som gett bästa resul- tat. Då det kräver mycket beräkningskraft och därför också lång tid att träna ett neuralt nätverk utvärderades först enbart inverkan av antalet noder i de tre lagren för att fastställa den mest gynnsamma storleken på nätverket, därefter användes den mest framgångsrika storleken på nätverket för att undersöka vilken kombination av träningsepoker och learning rate som ger bästa resultatet. Träningsresultaten utvär- derades genom att varje konfiguration gjorde tre prognoser två timmar framåt, den konfiguration som åstadkom minsta MAE sett över alla tre prognoser ansågs vara den bästa.

En viktig funktion i programmet har att göra med hur datan utnyttjas vid byg- gandet av modellen, det neurala nätverket tränas på 24 timmar av historiska data, dessa 24 timmar leder till prediktion av timme 25 och 26. Efter detta tränas model- len på efterföljande 24 timmar, det vill säga timme 1-25 som leder till prediktering av timmarna 26 och 27. Tabell 3.3 visar detta förfarande, som skapar fler tillfällen att träna modellen på samma mängd data än om träning skett på data i grupper om 0-24, 24-48 och så vidare.

Tabell 3.3: Användning av data för NN

Ingångsvärden x1(t) x2(t) x3(t) Y(t) utgångsvärden Y(t+1) Y(t+2)

Timmar 0-24 0-24 0-24 0-24 25 26

Timmar 1-25 1-25 1-25 1-25 26 27

Timmar 2-26 2-26 2-26 2-26 27 28

3.3 Support Vector Regression (SVR)

I kontrast till det neurala nätverket som är svårt att optimera önskades en modell som är lättare att få en känsla för och implementera men som ändå har goda möj- ligheter att göra meningsfulla prediktioner. Även SVR använde 24 timmar för att prediktera två timmar fram, för att åstadkomma detta skapas ett dataset där varje rad är en sekvens av värden 23 timmar innan den aktuella tidpunkten, två timmar efter den aktuella tiden samt värden för den aktuella tidpunkten. Tabell 3.4 visar ett exempel på ett sådant dataset.

Tabell 3.4: Serier av data för SVR-modell

variabel x1(t-1) x2(t-1) x1(t) x2(t) Y(t) Y(t+1) Y(t+2)

Timme 1 1 A 2 B a b c

Timme 2 2 B 3 C b c d

TImme 3 3 C 4 D c d e

Hela modellen består av två delar, den första delen använder aktuell tidpunkt och 23 timmar innan för att prediktera en timme framåt. Den andra delen använder aktuell

(24)

3. Metod

tidpunkt, 23 timmar bakåt och en timme framåt för att prediktera två timmar framåt. Detta görs för att minska luckan mellan indatan och de värden som ska predikteras för att förhoppningsvis genom en mer sammanhängande sekvens kunna ge bättre förutsättningar för en bra prediktion. Det får följden att då modellen ska prediktera på verkliga data kommer den att använda den första prediktionen för att utföra den andra prediktionen. Tabell 3.5 visar hur datan används vid prediktering med SVR-modellen.

Tabell 3.5: Data tillgänglig för de två stegen i prognosen

variabel x1(t-1) x2(t-1) x1(t) x2(t) Y(t) Y(t+1) Y(t+2) Steg 1 känd känd känd känd känd predikteras ej given Steg 2 känd känd känd känd känd "känd" predikteras

SVR-modellen byggdes med hjälp av SKlearn.svm.SVR, ett verktyg som erbjuder ett snabbt och lätt sätt att skapa en SVR-modell i python. För att optimera denna modell användes ett annat verktyg från SKlearn; GridSearchCV. Detta verktyg utför det som gjordes manuellt för det neurala nätverket, att utvärdera alla kombinationer av en uppsättning parametrar med tillägget att det också utför en korsvalidering.

Korsvalideringen hjälper till att skapa en mer generell modell genom att dela in datan i k delar för att sedan iterera genom dessa k delar och använda en som träningsset och k − 1 för utvärdering. När den första av delarna använts för träning, används nästa del för att träna och resten för test, detta itereras tills alla delar använts för träning. Detta ger de parametrar för modellen som ger bästa resultatet sett till hela datasetet och på så sätt också den som bör ha bäst förutsättning att göra korrekta prediktioner. Figur 3.1 ger en grafisk beskrivning av korsvalideringen.

Figur 3.1: GridSearchCV tränar varje generation av modellen på 1 del och utvärderar på k − 1 delar och itererar tills varje generation har

träntas på k olika delar av datan.

Att SVR-modellen gick snabbt att träna utnyttjades för att göra ytterligare opti- mering av parametrarna med hjälp av GridSearchCV genom att en ny uppsättning värden för parametrarna tas fram med utångspunkt i det värde som gav det bästa

(25)

3. Metod

resultatet, detta görs så länge resultatet förbättras. Figur 3.2 ger ett exempel på hur uppdateringen sker; om 1 ger bästa resultat första gången används detta som utångspunkt för nästa gång, det kommer att divideras och multipliceras med 10, 5 och 2.5 för att skapa värden i ett nytt intervall som sedan används som värden för utvärdering i GridSearchCV

Figur 3.2: Exempel på nya värden till GridSearchCV, inringat värde visar det som gett bästa resultat.

3.4 Utvärdering av modeller

De optimerade modellerna testas på data som aldrig tidigare visats för dem, 24 pro- gnoser innehållande två görs för att få totalt 48 prediktioner att utvärdera resultatet på. De 48 tidspunkter som predikteras ligger efter varandra för att skapa två hela dygn av predikterad data. Indikatorerna som listats i avsnitt 2.5 beräknades utifrån de predikterade och verkliga värdena från detta test.

(26)

3. Metod

(27)

4

Resultat

4.1 Neuralt Nätverk

Optimeringen av det neurala nätverket skedde till att börja med att utvärdera vilken storlek nätverket skulle ha, det vill säga antalet noder i lagren. Varje lager kunde innehålla 10, 50 eller 100 noder och alla kombinationer av dessa testades tre gånger vardera genom att de gjorde prediktioner som sedan jämfördes. Anledningen till att inte alla parametrar testades samtidigt var tidsrelaterad, denna uppsättning med tre variabler som kunde anta tre värden där alla kombinationer testas tre gånger innebär att nätverket byggdes om, tränades och utvärderades totalt 81 gånger, vilken tog ca 24 timmar. Resultatet utvärderades genom att kolla på MAE och RMSE för de tre gånger en specifik modell gör sina prediktioner. Kolumnen ’Medel MAE’ i tabell 4.1 viasr medelvärdet av MAE för de tre omgångarna en modell har predikterat.

Antalet epoker var vid detta test satt till 75 och learning rate till 0.001.

Tabell 4.1: Utvärdering av antal noder i de tre lagren

MAE RMSE Noder 1 Noder 2 Noder 3 Medel MAE

0.21 0.21 50 10 100

0.49 0.49 50 10 100 0.63085

1.2 1.23 50 10 100

0.1 0.1 50 50 10

0.83 0.83 50 50 10 0.841859

1.59 1.6 50 50 10

0.69 0.71 10 50 10

0.94 0.96 10 50 10 0.866822

0.96 0.99 10 50 10

Tabellen ovan visar de tre omgångarna för de sammansättningar noder som gett bästa resultaten, baserat på detta test valdes 50/10/100 som antalet noder till de tre lagren. 50/10/100 och 50/50/10 ser vid första anblick ganska lika ut. Men vid en närmare koll verkar det låga ’Medel MAE’ bero på ett enstaka lågt värde på MAE, vilket leder tanken till att detta låga MAE = 0.1 är det avvikande värdet och ger 50/50/10 ett oförtjänt bra resultat med detta sätt att mäta. För 10/50/10 är det inget MAE som dirket avviker, alla resultat ligger något högre än för de andra två konfigurationerna. Den som ansågs vara bästa var 50/10/100 som trots att den har större spridning än 10/50/10 har endast ett värde över MAE = 0.5. När storleken på nätverket var bestämt gjordes tester för att hitta de mest gynnsamma värdena

(28)

4. Resultat

för epoker och learning rate, att testa dessa två tillsammans görs just för att de har inverkan och ett samspel i hur bra prediktionerna görs. Båda dessa parametrar kunde anta tre olika värden och alla kombinationer av dessa testades tre gånger för att få en större säkerhet i att just en specifik kombination är gynnsam för prediktionerna.

Tabell 4.2: Utvärdering av learning rate och epoker

MAE RMSE Epoker Learning Rate Medel MAE

0.36 0.37 100 0.001

0.51 0.63 100 0.001 0.55

0.78 0.81 100 0.001

1.27 1.27 200 0.001

0.37 0.37 200 0.001 0.79

0.75 0.75 200 0.001

1.16 1.19 50 0.001

0.75 0.76 50 0.001 1.29

1.97 1.98 50 0.001

Tabell 4.2 visar att resultatet ytterligare kunde förbättras genom att välja ’rätt’

antal epoker och ’rätt’ learning rate, testet visar entydigt att en learning rate på 0.001 i detta fall ger de bästa resultaten, antalet epoker är dock svårare att bedöma.

Med 200 och 100 epoker är resultaten mycket likvärdiga, enda skillnaden är ett MAE på 1.27 för 200 epoker. Det avvikande värdet för 200 epoker kommer troligen som en effekt av det slumpmässiga utgångsläget för det neurala nätverket vilket gjort att just denna omgång inte blev så bra som det kan bli. För att vidare undersöka de två fallen med 100 epoker och 200 epoker jämförs MAE och RMSE. För fallet med 100 epoker antar RMSE något högre värden än MAE för alla tre fall, vilket tyder på att felen har större spridning än i fallet med 200 epoker då MAE och RMSE är samma för alla tre fall. Utifrån detta resonemang valdes 200 epoker som det bästa alternativet. Efter att modellen optimerats testades den på data som säkert aldrig tidigare visats för den. Som test gjordes 24 prognoser om totalt 48 prediktioner.

Varje prognos använde 24 timmar av historisk data för att göra sina prediktioner.

Figur 4.1 visar utfallet av testet. Att utföra utvärderingen av modellen på detta sätt ger en bra indikation på hur den kommer fungera i praktiken då det är ett liknande tillvägagångssätt.

(29)

4. Resultat

Figur 4.1: Prediktioner och verkliga värden för NN

En viktig sak att poängtera extra är att alla 48 punkter inte är resultatet av en enda prediktion, utan som ovan nämnts 24 individuella prognoser som gett två predik- tioner vardera. Vid en första anblick ser resultaten lovande ut, prediktionerna följer trendlinjen bra med några större fel på vissa ställen. Dessa större fel kommer då sto- ra plötsliga förändringar görs, det största felet på 6kWh uppstår då förbrukningen går från ca 8 till dryga 14 kWh med en timmes mellanrum. Liknande fenomen kan observeras kring timme 35 då förbrukningen plötsligt går ned under två timmar för att sedan gå upp något igen. Detta problem kommer troligen som en effekt av den långa samplingstiden för datan som används, en kortare samplingstid hade givit en bättre upplösning och möjligen hade sådana snabba förändringar kunnat predikte- rats bättre. Men i övrigt ger modellen en bra indikation på vilken förbrukning som kan förväntas. Eftersom modellen ger en prognos innehållande två prediktioner kan det vara av värde att se om den andra prediktionen är svårare att göra än den första, figur 4.2 visar detta. Resultatet visar att prediktion två har lite större spridning är prediktion ett, det är dock svårt att dra några egentliga slutsatser av detta. Figuren visar att den största avvikelsen för hela datasetet på 6 kWh finns bland felen för prediktion två. Det går dock inte att baserat på de tester som utförts säga om det är en effekt av just prediktion nummer två eller av att förbrukningen gör en plöts- lig markant förändring. Detta kan vara fallet för fler av de större fel som finns för prediktion två.

(30)

4. Resultat

Figur 4.2: Spridning av fel för prediktion ett och två, NN

4.2 Support Vector Regression

För att optimera denna modell användes GridSearchCV med ett sätt att ta fram nya värden för test och ytterligare optimering som beskrivet i avsnitt 3.3, tabell 4.3 visar de bästa parametrarna för dessa tester och hur dess resultat utvecklades då nya värden testades.

Tabell 4.3: Utvärdering av värden för parametrar i SVR Modell 1

C epsilon gamma score

10 0.001 scale 0.69

2 0.001 scale 0.70

Modell 2

C epsilon gamma score

1 0.001 scale 0.67

2.5 0.0002 scale 0.68

Redan första uppsättningen värden på dessa parametrar ger ett gott resultat och förbättras marginellt, men ändå en förbättring. Det är viktigt att komma ihåg att dessa värden på parametrarna är de som gett bästa resultatet sett till ’hela’ datasetet genom användning av korsvalidering i optimeringsstadiet. Att C antar så låga värden

(31)

4. Resultat

är det mest överraskande resultatet, det innebär i praktiken att punkter som ligger utanför -zonen inte ’bestraffas’ så hårt, vilket i sin tur betyder att den ger stort utrymme för avvikande värden (outliers). Detta kommer troligen som en effekt av korsvalideringen eftersom målet då blir att bygga en så generell modell som möjligt.

De värden som gav bästa restultat för SVR-modell 1 är C = 2,  = 0.001, gamma = scale och för SVR-modell 2 gavs C = 2.5,  = 0.0002, gamma = scale. Gamma är en parameter som påverkar hur datan transformeras till en högre dimension, enligt [2] kan det tolkas som "Hur långt effekten av ett träningsexempel når". SKlearn erbjuder sätt att automatiskt beräkna ett värde för γ, i regel används γ = scale, testerna visar också att detta ger de bästa resultaten. Efter att GridSearchCV har använts för att ta fram de bästa parametervärdena används dessa värden för att bygga en modell som gör prediktioner på samma data som användes för utvärdering av det neurala nätverket, alltså data som inte tidigare visats för modellen på något sätt. Även här gjordes 24 prognoser med två prediktioner i varje för att få totalt 48 prediktioner. Utfallet visas i figut 4.3

Figur 4.3: Prediktioner och verkliga värden för SVR

Detta test visar på att SVR-modellen har svårare att göra bra prediktioner. Det visar också samma symptom som för det neurala nätverket i att den har svårt att hänga med vid stora förändringar, men också svårare att följa trenden över lag. Att säga vad det beror på är svårt, troligen är det en effekt av många faktorer varav en kan vara att det är en relativ simpel modell som kan utforskas och bearbetas mycket mer än vad som gjorts under detta arbete, grunden till att detta inte gjorts är främst tidsbrist då stor fokus lades på det neurala nätverket. Korsvalideringen och målet att bygga en så generell modell som möjligt kan också vara en bidragande faktor

(32)

4. Resultat

till den lägre prestandan, det kan också var så att datan helt enkelt är för komplex eller inte har nog starka samband för att en modell av denna typ ska prestera bra och att ett annat val av features hade gett denna modell ett bättre resultat.

Figur 4.4: Spridning av fel för prediktion ett och två, SVR

Figur 4.4 visar hur felen fördelar sig för första och andra prediktionen, här syns tydligt att medel-felet för den andra prediktionen är högre än den första och har klart större spridning. Detta känns naturligt då den andra prediktionen är helt beroende av den första, vilket leder till att felet från den första prediktionen bidrar till felet för den andra.

4.3 Jämförelse

Tabell 4.4 visar resultatet för alla 48 prediktioner. Enligt [3] visar en MAPE runt 20% på en okej till god prediktion. Målet för arbetet har inte varit att ställa de två metoderna mot varann, men resultatet visar att det neurala nätverket är mer framgångsrikt i sina prediktioner.

Tabell 4.4: Jämförelse av de två modellerna

MAE RMSE MAPE St. avvikelse fel

NN 1.21 kWh 1.79 kWh 22.16 % 1.80 kWh SVR 1.84 kWh 2.4 kWh 39.50 % 2.37 kWh

(33)

5

Slutsats och fortsatt abrete

5.1 Slutsats

Möjligheten att använda dessa två metoder för kortsiktig prediktering ser lovande ut, i detta projekt användes en relativt liten mängd data för att bygga modellerna.

Detta kan möjligtvis ha gjort att det neurala nätverket har blivit lidande, då det ofta påpekas att dessa kräver en stor mängd data. För att göra prediktionerna bättre kan valet av vilka features som används för att utföra prognosen göras mer aktivt, detta kräver större kunskap i statistik och data-behandling. Ramen för detta projekt var att göra prediktioner enbart på historiska väder- och lastdata som är enkla att logga och spara på plats för en installerad anläggning. Det är svårt att säga om prediktionerna är bra eller dåliga då detta är avhängigt av tillämpningen, i varje tillämpning bör istället frågan vara om det är bra nog för det specifika fallet. För att se till den tillämpning som var utångspunkten för detta arbete, att optimera användningen av ett energilager ger det neurala nätverket vid dessa första enkla tester en bra fingervisning om vilken energiförbrukning som kan förväntas. Ett utlåtande om det är bra nog för en implementering som en del i en styralgoritm till ett smart energilager kan ges först efter ytterligare simuleringar och tester.

5.2 Fortsatt arbete

För fortsatta arbeten finns många intressanta uppgifter, varav den enklaste kanske är att se vilken inverkan normalisering av datan samt en större datamängd skulle ha på prediktionerna. Andra intressanta arbeten kan syfta till att göra prediktioner med högre frekvens, prediktioner så ofta som var femte minut är något som efterfrå- gas i energi-branschen, men också en modell speciellt framtagen för att prediktera tidpunkt och storlek för last-toppar efterfrågas då dessa kan leda till stora kostnader för konsumenter och problem för nätägare. För att bygga vidare på denna typ av modell och öka dess pålitlighet kan informationen som ges till nätverket utökas med exempelvis veckodag för att försöka fånga upp olika förbruknings-mönster som kan förekomma på helg- och vardagar.

(34)

5. Slutsats och fortsatt abrete

(35)

Litteraturförteckning

[1] Gers, Felix A., Douglas Eck, and Jürgen Schmidhuber. Äpplying LSTM to time series predictable through time-window approaches.Neural Nets WIRN Vietri- 01. Springer, London, 2002. 193-200.

[2] Scikit-learn: Machine Learning in Python, Pedregosa et al., JMLR 12, pp. 2825- 2830, 2011.

[3] Lewis, Colin David. Industrial and business forecasting methods: A practi- cal guide to exponential smoothing and curve fitting. Butterworth-Heinemann, 1982.

[4] Kim, Kyoung-jae. Financial time series forecasting using support vector machi- nes.Neurocomputing 55.1-2 (2003): 307-319.

[5] Alexander, David LJ, Alexander Tropsha, and David A. Winkler. Beware of R 2: simple, unambiguous assessment of the prediction accuracy of QSAR and QSPR models."Journal of chemical information and modeling 55.7 (2015): 1316- 1322.

[6] Singh, Arunesh Kumar, et al. Än overview of electricity demand forecasting techniques.Network and Complex Systems 3.3 (2013): 38-48.

[7] Liu, K., et al. "Comparison of very short-term load forecasting techniques."IEEE Transactions on power systems 11.2 (1996): 877-882.

[8] Hochreiter, Sepp, and Jürgen Schmidhuber. Long short-term memory.Neural computation 9.8 (1997): 1735-1780.

[9] Drucker, Harris, et al. Support vector regression machines.Ädvances in neural information processing systems. 1997.

[10] Fu, Yangyang, et al. "Using support vector machine to predict next day electri- city load of public buildings with sub-metering devices.Procedia Engineering 121 (2015): 1016-1022.

[11] Ladjici, Ahmed Amine, Mohamed Boudour, and Nadjib RACHEDI. Power system applications of support vector machine in classification and regres- sion."ICEE09 (2009).

[12] Backpropagation. Brilliant.org. Retrieved 13:48, May 30, 2019, from https://brilliant.org/wiki/backpropagation/

[13] https://keras.io, 2015

[14] https://machinelearningmastery.com/how-to-develop-lstm-models-for-multi- step-time-series-forecasting-of-household-power-consumption/

[15] Smola, Alex J., and Bernhard Schölkopf. Ä tutorial on support vector regres- sion.Statistics and computing 14.3 (2004): 199-222.

[16] https://towardsdatascience.com/understanding-support-vector-machine-part- 2-kernel-trick-mercers-theorem-e1e6848c6c4d

(36)

Litteraturförteckning

[17] https://medium.com/human-in-a-machine-world/mae-and-rmse-which-metric- is-better-e60ac3bde13d

(37)

A

Neurala Nätverket

A.1 Split

Split-funktionen delar in datasetet i tränings- och testdata samt delar in dessa två i grupper om 24 timmar för att skapa en tredimensionell vektor som input för LSTM nätverket.

d e f main ( data ) :

from numpy i m p o r t s p l i t , a r r a y

t r a i n , t e s t = dat a [ 6 : 1 0 3 8 ] , data [ 1 0 3 8 : − 1 ] t r a i n = a r r a y ( s p l i t ( t r a i n , l e n ( t r a i n ) / 2 4 ) ) t e s t = a r r a y ( s p l i t ( t e s t , l e n ( t e s t ) / 2 4 ) ) r e t u r n t r a i n , t e s t

A.2 to_supervised

Denna funktion skapar den sekvens av data som ska användas som input och de motsvarande verkliga värdena som nätverket tränas mot.

def main ( t r a i n , n_input = 2 4 , n_out = 2 ) : from numpy import a r r a y

dat a = t r a i n . r e s h a p e ( ( t r a i n . s ha p e [ 0 ] ∗ t r a i n . s h a pe [ 1 ] , t r a i n . s h a pe [ 2 ] ) )

X, y = l i s t ( ) , l i s t ( ) i n _ s t a r t = 0

f o r _ in range ( len ( d a t a ) ) :

in_end = i n _ s t a r t + n_input out_end = in_end + n_out

i f out_end < len ( d a t a ) :

X. append ( d ata [ i n _ s t a r t : in_end , : ] ) y . append ( data [ in_end : out_end , 1 ] ) i n _ s t a r t += 1

y = a r r a y ( y )

y = y . r e s h a p e ( ( y . s h ap e [ 0 ] , y . s ha p e [ 1 ] , 1 ) ) return a r r a y (X) , y , n_input

(38)

A. Neurala Nätverket

A.3 Model

Modellens uppbyggnad.

def main ( t r a i n _ x , t r a i n _ y ) :

from k e r a s . models import S e q u e n t i a l

from k e r a s . l a y e r s import LSTM, Dense , RepeatVector , T i m e D i s t r i b u t e d

from k e r a s . o p t i m i z e r s import Adam

from k e r a s . c a l l b a c k s import E a r l y S t o p p i n g import m a t p l o t l i b . p y p l o t a s p l t

l r = 0 . 0 0 1 nd1 = 50 nd2 = 10 nd3 = 100 e p o c h s = 200 v e r b o s e = 1

o p t i m i z e r = Adam( l r = l r )

n_timesteps , n _ f e a t u r e s , n_outputs = t r a i n _ x . s h a pe [ 1 ] , t r a i n _ x . s h a pe [ 2 ] , t r a i n _ y . s ha p e [ 1 ]

model = S e q u e n t i a l ( )

model . add (LSTM( nd1 , a c t i v a t i o n= ’ r e l u ’ , input_shape =(

n_timesteps , n _ f e a t u r e s ) ) )

model . add ( R e p e a t V e c t o r ( n_outputs ) ) model . add (LSTM( nd2 , a c t i v a t i o n= ’ r e l u ’ ,

r e t u r n _ s e q u e n c e s=True ) )

model . add ( T i m e D i s t r i b u t e d ( Dense ( nd3 , a c t i v a t i o n= ’ r e l u ’ ) ) )

model . add ( T i m e D i s t r i b u t e d ( Dense ( 1 ) ) )

model . compile ( l o s s= ’ mse ’ , o p t i m i z e r = o p t i m i z e r ) model . summary ( )

model . f i t ( train_x , train_y , e p o c h s=epochs , v e r b o s e=

v e r b o s e )

model . s a v e ( ’ model . h5 ’ )

A.4 Predict

Den del av koden som utför de 48 prediktionerna.

def main ( ) :

from k e r a s . models import load_model import numpy a s np

import pandas a s pd

import m a t p l o t l i b . p y p l o t a s p l t import p r e d i c t _ s p l i t

a c t u a l s = l i s t ( )

(39)

A. Neurala Nätverket

p r e d i c t i o n s = l i s t ( )

e v a l u a t i o n = pd . DataFrame ( )

#############################

’ ’ ’ Load Model ’ ’ ’

model = load_model ( ’ model . h5 ’ )

#############################

’ ’ ’ Load new d a t a ’ ’ ’

dat a = pd . read_csv ( r ’C: \ U s e r s \ Johan \ Documents \ Python

␣ S c r i p t s \ MachineLearn \NN\TIMESERIES\ E l t e k \ Weather

\ p r e p r o c e s s i n g \ r o u n d e d _ t e s t . c s v ’ , i n d e x _ c o l = ’ Datum (UTC) ’ )

#############################

’ ’ ’ S e t t i m e span ’ ’ ’ s t a r t = 0

f o r i in range ( 2 4 ) : end = s t a r t +24

a c t u a l s . append ( da ta . i l o c [ end : end + 2 , 1 ] )

pred_data = p r e d i c t _ s p l i t . main ( dat a . v a l u e s , s t a r t , end )

s t a r t += 2

#############################

’ ’ ’ P r e d i c t on new d a t a ’ ’ ’

p r e d i c t i o n s . append ( model . p r e d i c t ( pred_data ) )

A.5 Grid search

Den del av koden som provar alla möjliga kombinationer av de parametrar som kan ställas för modellen. Resultatet utvärderas genom en prognos innehållande två prediktioner.

def main ( t r a i n _ x , t r a i n _ y , t e s t , t r a i n , n_input ) : from k e r a s . models import S e q u e n t i a l

from k e r a s . l a y e r s import LSTM, Dense , RepeatVector , T i m e D i s t r i b u t e d

from k e r a s . o p t i m i z e r s import Adam import pandas a s pd

import numpy a s np import model2

import e v a l u a t e 2 n_d1 = [ 5 0 , 1 0 0 , 2 0 0 ] n_d2 = [ 5 0 , 1 0 0 , 2 0 0 ]

(40)

A. Neurala Nätverket

n_d3 = [ 5 0 , 1 0 0 , 2 0 0 ]

l _ r = [ 0 . 1 , 0 . 0 1 , 0 . 0 0 1 ] ep = [ 5 0 , 1 0 0 , 2 0 0 ]

MAE_list = l i s t ( ) RMSE_list = l i s t ( )

a c t u a l s _ l i s t = l i s t ( ) p r e d i c t i o n s _ l i s t = l i s t ( ) n o d e s 1 = l i s t ( )

n o d e s 2 = l i s t ( ) n o d e s 3 = l i s t ( ) e p _ l i s t = l i s t ( ) l r _ l i s t = l i s t ( ) i = 0

while i < 3 : f o r l r in l _ r :

f o r e p o c h s in ep : f o r nd1 in n_d1 : f o r nd3 in n_d3 :

f o r nd2 in n_d2 :

model = model2 . main ( nd1 , nd2 , nd3 , train_x , train_y , l r , e p o c h s ) #b y g g e r ny

m o d e l l

MAE, RMSE, p r e d i c t i o n s , a c t u a l s = e v a l u a t e 2 . main ( model , t e s t , t r a i n , n_input ) #e v a l u e r a r denna

MAE_list . append (MAE) RMSE_list . append (RMSE)

p r e d i c t i o n s _ l i s t . append ( p r e d i c t i o n s ) a c t u a l s _ l i s t . append ( a c t u a l s )

n o d e s 1 . append ( nd1 ) n o d e s 2 . append ( nd2 ) n o d e s 3 . append ( nd3 ) l r _ l i s t . append ( l r ) e p _ l i s t . append ( e p o c h s ) i +=1

(41)

B

Support Vector Regression

B.1 to_supervised

Skapar datasetet för SVR, där varje rad innehåller data för 24 timmar.

def main ( data , n_in = 2 4 , n_out = 3 , dropnan = True ) : from pandas import DataFrame

from pandas import c o n c a t

n_vars = 1 i f type ( data ) i s l i s t e l s e d a t a . s h a p e [ 1 ] d f = DataFrame ( dat a )

c o l s , names = l i s t ( ) , l i s t ( ) f o r i in range ( n_in , 0 , −1) :

c o l s . append ( d f . s h i f t ( i ) )

names += [ ( ’ v a r%d ( t−%d ) ’ % ( j +1 , i ) ) f o r j in range ( n_vars ) ]

f o r i in range ( 0 , n_out ) :

c o l s . append ( d f . s h i f t (− i ) ) i f i == 0 :

names += [ ( ’ v a r%d ( t ) ’ % ( j +1) ) f o r j in range ( n_vars ) ]

e l s e :

names += [ ( ’ v a r%d ( t+%d ) ’ % ( j +1 , i ) ) f o r j in range ( n_vars ) ]

agg = c o n c a t ( c o l s , a x i s =1) agg . columns = names

i f dropnan :

agg . dropna ( i n p l a c e = True ) return ( agg )

B.2 models

Beroende på vilket val som görs kan en ny modell skapas, gridsearch utföras eller prediktioner göras.

def main ( d a t a ) :

from j o b l i b import dump from s k l e a r n . svm import SVR import g r i d s e a r c h 2

(42)

B. Support Vector Regression

import p r e d i c t 2

#F i x X and Y ’ s

c h o i c e = input ( ’ You␣ want ␣ t o ␣ p r e d i c t ␣ ( p ) , ␣ b u i l d ␣new␣

model ␣ ( n ) ␣ o r ␣ run ␣ g r i d s e a r c h ? ␣ ( g ) ␣ \n ’ )

X1 = data . drop ( [ ’ v a r 2 ( t +1) ’ , ’ v a r 2 ( t +2) ’ ] , a x i s =1) y1 = d ata [ ’ v a r 2 ( t +1) ’ ]

X2 = data . drop ( [ ’ v a r 2 ( t +2) ’ ] , a x i s =1) y2 = d ata [ ’ v a r 2 ( t +2) ’ ]

i f c h o i c e == ’ n ’ :

#Choose model

model1 = SVR( k e r n e l = ’ r b f ’ , C = 2 , e p s i l o n

= 0 . 0 0 1 , gamma = ’ s c a l e ’ )

model2 = SVR( k e r n e l = ’ r b f ’ , C = 2 . 5 , e p s i l o n = 0 . 0 0 0 2 , gamma = ’ s c a l e ’ )

#F i t model f o r one s t e p o u t

print ( ’ \ n F i t t i n g ␣ model ␣ f o r ␣ 1 ␣ t i m e ␣ s t e p ␣ out ’ ) model1 . f i t ( X1 , y1 )

#B u i l d model f o r s e c o n d s t e p

print ( ’ \ n F i t t i n g ␣ model ␣ f o r ␣ two ␣ t i m e ␣ s t e p s ␣ out ’ )

model2 . f i t ( X2 , y2 )

dump( model1 , ’ model1 . j o b l i b ’ ) dump( model2 , ’ model2 . j o b l i b ’ ) e l i f c h o i c e == ’ g ’ :

g = 1

print ( ’ \n\ nTuning ␣ model ␣ 1 ’ )

model1 = g r i d s e a r c h . main ( X1 , y1 , g ) g = 2

print ( ’ \n\ nTuning ␣ model ␣ 2 ’ )

model2 = g r i d s e a r c h . main ( X2 , y2 , g ) e l i f c h o i c e == ’ p ’ :

p r e d i c t 2 . main ( ) e l s e :

print ( ’ Thats ␣ not ␣ r i g h t . . ␣ t r y ␣ a g a i n . ’ ) return

(43)

B. Support Vector Regression

B.3 GridSearchCV

Här utförs GridSearchCV med den automatiska uppdateringen av värden för para- metrarna.

def main (X, y ) :

from s k l e a r n . m o d e l _ s e l e c t i o n import GridSearchCV from s k l e a r n . svm import SVR

import m a t p l o t l i b . p y p l o t a s p l t

r e g = SVR( k e r n e l = ’ r b f ’ , gamma = ’ auto ’ , C = 1 e3 , e p s i l o n = 0 . 0 0 1 )

k e r n e l = [ ’ r b f ’ ]

gamma = [ ’ aut o ’ , ’ s c a l e ’ ] C = [ 1 e −3 ,1 e −1, 1 , 1 e1 , 1 e3 ]

e p s i l o n = [ 1 e −3 ,1 e −1, 1 , 1 e1 , 1 e3 ]

p a r a m e t e r s = d i c t (C=C, gamma = gamma , e p s i l o n = e p s i l o n )

g r i d = GridSearchCV ( r e g , p a r a m e t e r s , cv = 1 0 ) g r i d . f i t (X, y )

print ( ’ \n\ nBest ␣ p a r a m e t e r s \n ’ , g r i d . best_params_ ) print ( ’ \ nBest ␣ s c o r e \n ’ , g r i d . b e s t _ s c o r e _ )

score_new = g r i d . b e s t _ s c o r e _ s c o r e _ o l d = −1

best_C = g r i d . best_params_ [ ’C ’ ]

b e s t _ e p s i l o n = g r i d . best_params_ [ ’ e p s i l o n ’ ] best_gamma = g r i d . best_params_ [ ’gamma ’ ] C_new = l i s t ( )

e p s i l o n _ n e w = l i s t ( ) gamma_new = l i s t ( )

b e s t _ s c o r e s = l i s t ( ) best_params = l i s t ( )

b e s t _ s c o r e s . append ( g r i d . b e s t _ s c o r e _ ) best_params . append ( g r i d . best_params_ ) while score_new > s c o r e _ o l d :

s c o r e _ o l d = score_new f o r i in range ( 7 ) :

i f i == 0 :

C_new . append ( best_C / 1 0 ) e p s i l o n _ n e w . append (

b e s t _ e p s i l o n / 1 0 ) e l i f i == 1 :

C_new . append ( best_C / 5 ) e p s i l o n _ n e w . append (

b e s t _ e p s i l o n / 5 ) e l i f i == 2 :

C_new . append ( best_C / 2 . 5 )

(44)

B. Support Vector Regression

e p s i l o n _ n e w . append ( b e s t _ e p s i l o n / 2 . 5 ) e l i f i == 3 :

C_new . append ( best_C ) e p s i l o n _ n e w . append (

b e s t _ e p s i l o n ) e l i f i == 4 :

C_new . append ( best_C ∗ 2 . 5 ) e p s i l o n _ n e w . append (

b e s t _ e p s i l o n ∗ 2 . 5 ) e l i f i == 5 :

C_new . append ( best_C ∗ 5 ) e p s i l o n _ n e w . append (

b e s t _ e p s i l o n ∗ 5 ) e l i f i == 6 :

C_new . append ( best_C ∗ 1 0 ) e p s i l o n _ n e w . append (

b e s t _ e p s i l o n ∗ 1 0 )

p a r a m e t e r s = d i c t (C = C_new , gamma = gamma , e p s i l o n = e p s i l o n _ n e w )

g r i d = GridSearchCV ( r e g , p a r a m e t e r s , cv = 1 0 ) g r i d . f i t (X, y )

best_params . append ( g r i d . best_params_ ) b e s t _ s c o r e s . append ( g r i d . b e s t _ s c o r e _ ) score_new = g r i d . b e s t _ s c o r e _

References

Related documents

Detta står i bjärt kontrast till de studier av idrott och social utveckling som gör gällande att ett explicit fokus på social utveckling är av avgörande betydelse för

På idrottens alla nivåer, från barns fria idrottslekar till den yppersta eliten, fi nns faktorer som på olika sätt skapar skilda förutsättningar och villkor för kvinnors och

Alla studier som utvärderat effekter av olika former av sjukgym- nastiska interventioner innehållande information till och träning av patienter som skulle genomgå buk-

För att förbättra individens arbetsförmåga, och för- hindra sjukfrånvaro eller åstadkomma återgång i arbete vid sjukfrånvaro, behöver ofta åtgärder riktas mot både

De studier som utvär- derat individuell övervakad träning jämfört med hemträning (44,39,33), vilka alla hade medelhögt bevisvärde, konkluderade att den

Trots att intresset för att främja fysisk akti- vitet har ökat inom sjukvården, där såväl pro- fessionella organisationer som hälso- och sjuk- vårdspersonal tycks bli mer

Denna handling har beslutats digitalt och saknar

Region Jönköpings län är sedan årsskiftet 2017-2018 finskt förvaltningsområde och ser att de åtgärder som utredningen föreslår är viktiga och nödvändiga för att