Vi har hittills använt numeriska förklaringsvariabler i våra regressionsmodeller.
Det är också möjligt att använda kategoriska förklaringsvariabler.
Anta att vi vill prediktera amerikanska studenters snittbetyg (GPA) med SAT score som förklaringsvariabel. (SAT är en amerikansk variant av högskoleprovet).
Modellen estimerar att en student med hög närvaro har ett snittbetyg som är 0.223 högre än en student som inte har hög närvaro, givet en viss SAT-poäng.
Exempel
Anta att vi har två studenter med samma SAT-poäng. En av dem har hög närvaro och en har det inte. Modellen estimerar att studenten med hög närvaro har ett snittbetyg som är 0.223 högre.
Dummyvariabler - tolka en dummyvariabel
Notera att skattningen av den koefficient som kopplad till dummyvariabeln säger oss hur den kategori som kodats till 1 skiljer sig jämfört med den kategori som kodats till 0.
När vi kodade hög närvaro som 1 och ej hög närvaro som 0 fick vi den här modellen:
Den senare modellen estimerar att en student som inte har hög närvaro har ett snittbetyg som är 0.223 lägre än en student som har hög närvaro, givet en viss SAT-poäng.
Det predikterade medelbetyget för en enskild student blir detsamma oavsett hur vi kodar dummyvariabeln. Det beror på att interceptet förändras när vi kodar om dummyvariabeln. I den andra modellen blir termen \(b_2 \cdot \text{NotHighAttendance}\)0.223 lägre än i den första modellen för varje student, men interceptet är samtidigt 0.223 högre.
Modellval
Hittills har vi framför allt undersökt hur vi tolkar en regressionsmodell.
Vi har transformerat variabler för hitta samband som är någorlunda linjära.
Vi har också gått igenom måttet R-squared som säger oss något om hur väl modellen förklarar responsvariabelns värden.
Nu kommer vi in på frågan om modellval, det vill säga frågan om vilka variabler vi ska använda i en modell och hur vissa av variablerna eventuellt ska transformeras.
Modellval
En naturlig fråga att ställa är: Varför välja ut vissa variabler och välja bort andra? Kan vi inte bara inkludera alla tillgängliga variabler?
Att använda alla variabler ger måttet R-squared dess största möjliga värde. Vi har tidigare lärt oss att R-squared alltid ökar när vi lägger till fler variabler.
Problemet är att ju fler variabler vi använder desto mer flexibel blir modellen.
Låt oss titta närmare på vad vi menar med att en modell är flexibel, och varför vi vill undvika att en modell för flexibel!
Modellval
Här ser vi 3 regressionsmodeller som estimerar en bils bränsleförbrukning med förklaringsvariabeln hästkrafter.
Vi bryr oss i det här sammanhanget inte om hur modellerna är konstruerade, utan vi konstaterar bara att de har olika stor flexibilitet.
En mer flexibel en modell följer den responsvariabelns värden närmare.
Modellval - flexibilitet
Den minst flexibla modellen är en rät linje.
Den något mer flexibla modellen i mitten följer det övergripande mönstret.
Den mest flexibla modellen anpassar sig tydligt efter de enskilda datapunkterna.
Modellval - flexibilitet
Kom ihåg att en bra modell ska ge rimliga estimat för nya observationer.
Om vi har två nya bilar, en med 210 hästkrafter och en med 250 hästkrafter, vilken av modellerna ger de rimligaste prediktionerna?
Det verkar orimligt att bilar med 210 hästkrafter generellt skulle ha betydligt större bränsleförbrukning än bilar med 250 hästkrafter.
Modellval - generaliserbarhet
Vi säger att den mindre flexibla modellen till vänster är mer generaliserbar. En modell som är generaliserbar ser ungefär likadan ut även om den anpassades med annan data. Modellen till vänster skulle exempelvis kunna se ungefär likadan ut om vår data innehöll 32 andra bilmodeller.
Modellen till höger skulle förmodligen se helt annorlunda ut om vi hade andra bilmodeller i vår data.
Vi säger att en flexibel modell med dålig generaliserbarhet är överanpassad (overfitted).
Modellval - generaliserbarhet
En oflexibel modell som inte fångar mönstret i vår data är underanpassad (underfit).
Den här grafen visar en underanpassad modell. Den räta linjen fångar inte det övergripande bågmönstret.
Målet är att hitta en bra medelväg där modellen fångar det övergripande mönstret men utan att fånga alla slumpvisa variationer.
Modellval - generaliserbarhet
Vi har redan konstaterat att måttet \(R^2\)inte tar hänsyn till generaliserbarhet. Tvärtom blir \(R^2\) högt för en överanpassad modell.
Vi har tidigare talat om adjusted R-squared, som tar hänsyn till generaliserbarhet.
I formeln står \(k\) för antalet variabler, och vi ser att adjusted R-squared blir mindre när antalet variabler ökar.
Att försöka maximera adjusted R-squared är en enkel strategi i sökandet efter den bästa modellen, men det finns mer sofistikerade sätt att mäta hur bra en modell är.
Modellval - träningsdata och testdata
Vi har sagt att en generaliserbar modell är en modell som fungerar även för ny data, det vill data som vi inte använde när vi anpassade modellen.
Ett bra sätt att bedöma om modellen är generaliserbar är att helt enkelt testa hur bra prediktionerna blir på ny data.
För att göra det delar vi upp vårt dataset i två delar
En del är träningsdata (training data). Den används för att anpassa modellen, alltså för att hitta värdet på modellens koefficienter.
Den andra delen är testdata. Den används för att utvärdera modellen.
Modellval - träningsdata och testdata
Här ser vi en oflexibel model och en flexibel. Den flexibla ser bra ut i förhållande till träningsdata, men inte i förhållande till ny data.
Modellval - träningsdata och testdata
Exempel: Vi kan använda 70% av observationerna som träningsdata och de övriga 30% av observationerna som testdata.
Om observationerna ligger i någon särskild ordning bör observationerna sorteras slumpmässigt innan vi gör en uppdelning i träningsdata och testdata. Vi vill att både träningsdata och testdata ska vara representativ för hela datamaterialet.
Modellval - träningsdata och testdata
Proceduren för att utvärdera en modell på testdata är
Dela upp observationerna i träningsdata och testdata.
Anpassa regressionsmodellen med hjälp av träningsdata.
Utvärdera modellen med hjälp av testdata.
För att kunna genomföra steg 3 behöver vi ett mått för att utvärdera hur väl en modell passar vår testdata.
Det finns flera möjliga mått, men här kommer vi att använda RMSE (Rooted Mean Squared Error).
Om RMSE för en modell är lägre betyder det att modellen är bättre.
Modellval - träningsdata och testdata
RMSE utvärderad på vår testdata räknas ut med formeln
där \(n_\text{test}\) är antalet observationer i vårt testset.
Uttrycket \(\sum_{i=1}^{n_\text{test}} (y_i - \hat{y}_i)^2\) är summan av de kvadrerade prediktionsfelen. Vi kallar det därför SSE (Summed Squared Errors). Formeln för RMSE kan alltså också skrivas
Eftersom vi senare ändå kommer att behöva räkna ut \(\text{SSE}_\text{test}\) kan det här vara ett bra sätt att räkna ut RMSE.
Modellval - träningsdata och testdata
Låt oss nu gå igenom ett exempel där vi
delar upp ett dataset i träningsdata och testdata
anpassar modellen med hjälp av vår träningsdata
utvärderar modellen genom att räkna ut RMSE för vår testdata
Modellval - träningsdata och testdata
För vårt exempel använder vi ett dataset med variablerna \(y\), \(x_1\), \(x_2\) och \(x_3\). Vår responsvariabel är \(y\), och övriga variabler är förklaringsvariabler.
Vi har totalt 100 observationer.
Vilka förklaringsvariabler vi inkluderar är upp till oss själva. Målet är att åstadkomma en modell som ger bra prediktioner i vår testdata.
Nu räknar vi ut \(\text{RMSE}_\text{test}\). Vi gör uträkningen i flera steg. Först räknar vi ut \(\text{SSE}_\text{test}\), därefter \(\text{MSE}_\text{test}\) och slutligen \(\text{RMSE}_\text{test}\).
Skillnaderna mellan modellerna är små, men det finns saker att notera.
Baserat på R-squared kunde man tro att modell 2 är bättre, då den förklarar en aning mer av variationen i vår träningsdata.
RMSE är samtidigt något mindre för modell 1, vilket betyder att den modellen är lite bättre på att göra prediktioner på vår testdata.
Modellval - träningsdata och testdata
Att dela upp ett dataset i träningsdata och testdata ger oss en bättre bild av hur användbar en modell är.
Vi vet dock inte säkert om det ger en rättvis bild, särskilt om det är ett dataset med få observationer.
Vi ska visa ett exempel där vi använder vår bildata och modellen \(\widehat{\text{litermil}} = b_0 + b_1 \cdot \text{viktton}\).
Först använder vi de 12 sista observationerna i vårt testset och de 20 första i vårt träningsset.
Sedan gör vi samma sak, men använder i stället de 12 första i vårt testset och de 20 sista i vårt träningsset.
Modellval - träningsdata och testdata
Vi kodar vårt exempel i R. Vi börjar med att inkludera de 12 sista observationerna i vår testdata. Övriga observationer inkluderar vi i vårt träningsdata.
# De 12 sista observationerna används i vårt testsetcarstrain <- mtcars %>%slice(1:20)carstest <- mtcars %>%slice(21:32)lmod1 <-lm(litermil ~ viktton, data=carstrain)y_hatt <-predict(lmod1, newdata=carstest)RMSE <-sqrt(mean((carstest$litermil - y_hatt)^2))print(RMSE)
[1] 0.1984769
Modellval - träningsdata och testdata
Denna gång inkluderar vi de första 12 observationerna i vår testdata, och övriga observationer i vår träningsdata.
# De 12 första observationerna används i vårt testsetcarstrain <- mtcars %>%slice(13:32)carstest <- mtcars %>%slice(1:12)lmod1 <-lm(litermil ~ viktton, data=carstrain)y_hatt <-predict(lmod1, newdata=carstest)RMSE <-sqrt(mean((carstest$litermil - y_hatt)^2))print(RMSE)
[1] 0.1790871
Med de sista 12 observationerna som testdata fick vi \(\text{RMSE}=0.198\).
Med de första 12 observationerna som testdata fick vi \(\text{RMSE}=0.179\).
RMSE utvärderat på testdata skiljer sig alltså åt beroende på hur vi delar upp vår data.
Modellval - korsvalidering
Korsvalidering (cross validation) är en metod för att utvärdera modeller som låter oss använda alla observationer både som träningsdata och som testdata.
Med korsvalidering delar vi upp vårt dataset mellan träningsdata och testdata flera gånger.
Varje gång vi gör en uppdelning är det en ny uppsättning observationer som inkluderas i vår testdata.
Varje observation är en del av testdatan i en av uppdelningarna. I övriga uppdelningar är den en del av träningsdatan.
Modellval - korsvalidering
Varje uppdelning kallar vi för en fold.
Korsvalisering kallas ibland K-fold cross validation, där \(K\) är antalet folds.
Korsvalidering med K=4 betyder exempelvis att vi delar in vår data i träningsdata och testdata på 4 olika sätt.
Modellval - korsvalidering
För var och en av de 4 uppdelningarna räknar vi ut SSE för testdatan.
Summan av våra 4 SSE-värden använder vi sedan till att räkna ut RMSE.
Modellval - korsvalidering
Anta att vi har ett dataset med 100 observationer och \(K=4\).
k=1: Observation 1 till 25 är testdata.
k=2: Observation 26 till 50 är testdata, etc.
Modellval - korsvalidering
Vårt mål är att räkna ut RMSE med hjälp av våra 4 folds.
Vi börjar med att räkna ut SSE för var och en av våra folds.
Enkel uppdelning i träningsdata och testdata, procedur:
Räkna ut \(\text{SSE}_\text{test}\)
Räkna ut \(\text{MSE}_\text{test} = \text{SSE}_\text{test} / n_{\text{test}}\)
Räkna ut \(\text{RMSE}_\text{test} = \sqrt{\text{MSE}_\text{test}}\)
Korsvalidering, procedur:
Räkna ut \(\text{SSE}_\text{test}^{(1)}, \text{SSE}_\text{test}^{(2)},...,\text{SSE}_\text{test}^{(K)}\), och därefter \(\text{SSE}_\text{CV} = \text{SSE}_\text{test}^{(1)}+\text{SSE}_\text{test}^{(2)}+...+\text{SSE}_\text{test}^{(K)}\)
Räkna ut \(\text{MSE}_\text{CV} = \text{SSE}_\text{CV} / n\)
Räkna ut \(\text{RMSE}_\text{CV} = \sqrt{\text{MSE}_\text{CV}}\)
Modellval - korsvalidering, exempel med K=2
Vi ska nu gå igenom ett exempel på hur vi räknar ut RMSE med korsvalidering i R.
Vi använder vår bildata, och utvärderar modellen \(\widehat{\text{litermil}} = b_0 + b_1 \cdot \text{viktton}\).
Vi sätter \(K=2\), det vill säga vi använder 2 folds.
Vi har totalt 32 observationer.
När vi räknar ut \(\text{SSE}_\text{test}^{(1)}\) låter vi de 16 första observationerna vara testdata och övriga träningsdata.
När vi räknar ut \(\text{SSE}_\text{test}^{(2)}\) låter vi de 16 sista observationerna vara testdata och övriga träningsdata.
Modellval - korsvalidering, exempel med K=2
Den här koden använder vi för att räkna ut \(\text{SSE}_\text{test}^{(1)}\) och \(\text{SSE}_\text{test}^{(2)}\).
Vi skriver ut värdet på \(\text{SSE}_\text{test}^{(1)}\) och \(\text{SSE}_\text{test}^{(2)}\).
#Skriv ut värdet på SSE(1) och SSE(2)sprintf("SSE1 = %.4f, SSE2 = %.4f", SSE1, SSE2)
[1] "SSE1 = 0.5331, SSE2 = 1.0270"
Modellval - korsvalidering, exempel med K=2
Graferna illustrerar vår data och de båda regressionsmodellerna. Om vi kvadrerar de röda linjerna i graferna till höger och summerar kvadraterna får vi \(\text{SSE}_\text{test}^{(1)}\) (övre) och \(\text{SSE}_\text{test}^{(2)}\) (undre).