Variabelselektion (Feature Selection)

Variabelselektion: At inkludere de rigtige variabler

Formålet med en prædiktionsmodel kan være enten (1) at estimere effekten (associationen) mellem en eller flere prædiktorer (XX) og udfaldet YY, eller (2) at skabe en model med maksimal prædiktionsevne. I det første scenarie, dvs. når formålet er at estimere prædiktorernes effekter, bliver slutresultatet naturligvis en prædiktionsmodel, men den har sandsynligvis ikke maksimal prædiktionsevne. For at estimere effekter behøver en model ikke at have maksimal prædiktionsevne; fokus bør i stedet være at generere letfortolkelige og pålidelige resultater. I dette scenarie kan variabelselektion foretages ud fra viden om området. Med faglig viden kan man skabe en model, der indeholder de nødvendige kovariater, og specificere modellen på en fornuftig måde. Det betyder, at variabelselektion kan baseres på faglig viden, hvis formålet med modellen er effektestimering. I det andet scenarie, dvs. når formålet er maksimal prædiktionsevne, er variabelselektion noget mere kompliceret, og dette kapitel omhandler primært sådanne modeller.

Prædiktionsmodeller bør udvise høj prædiktionsevne og samtidig være sparsommelige med hensyn til antallet af variabler, der er nødvendige i modellen. Den engelske betegnelse for den sparsommelige model (med hensyn til antallet af prædiktorer) er the parsimonious model. Jo flere prædiktorer en model indeholder, desto sværere er det for andre at anvende modellen, især hvis modellen omfatter prædiktorer, der er svære at fremskaffe. Desuden kan der opstå overfitting, hvis antallet af prædiktorer er for stort.

Variabelselektion (eng. variable selection, feature selection) indebærer, at man på en metodisk måde eliminerer unødvendige variabler. Det betyder, at man starter med et større antal variabler, såkaldte kandidatvariabler (eng. candidate predictors), som gradvist elimineres, indtil de vigtigste står tilbage. Der findes flere metoder til variabelselektion. Nedenfor diskuteres disse metoder.

Stepwise variable selection: backward & forward stepwise selection

Stepwise (trinvis) variabelselektion er en automatiseret proces, hvor softwaren bestemmer, hvilke variabler der skal indgå i en regressionsmodel. Dette kan gøres enten med forward stepwise selection eller backward stepwise selection.

  • Forward stepwise selection indebærer, at modellen starter med 0 (nul) variabler, hvorefter der tilføjes én variabel ad gangen. Den tilføjede variabel får lov at blive i modellen, hvis den fører til en bedre model.
  • Backward stepwise selection indebærer, at alle kandidatvariablerne er med i modellen fra starten. Derefter elimineres én variabel ad gangen. Den variabel, hvis eliminering påvirker modellen mindst, bliver ekskluderet (fordi eliminering af den variabel har mindst indflydelse på modellen). Dette gentages, indtil ingen variabler kan elimineres, uden at modellen bliver signifikant dårligere.
  • Bidirectional stepwise elimination er en kombination af begge ovenstående.

For at vurdere, om modellen bliver bedre eller dårligere, må der anvendes et kriterium. I de fleste tilfælde anvendes Akaike information criterion (AIC). AIC er et mål for balancen mellem modellens kompleksitet (antal prædiktorer) og goodness-of-fit (prædiktionsevne). Jo lavere AIC, desto bedre model.

Disse metoder bør i princippet aldrig anvendes. Disse metoder strider nemlig mod flere principper for statistisk inferens. Konsekvenserne af at anvende stepwise selection er følgende (Harrell):

  • R2-værdier er biased (for høje)
  • Selve selektionen af variabler baseres på P-værdier (signifikanstest), hvilket egentlig kræver en præspecificeret hypotese.
  • Standard error (SE) er biased (for små).
  • Konfidensintervaller er biased (for snævre).
  • P-værdier bliver falsk for små, og der er problemer med multipel testning.
  • Regressionskoefficienterne er biased (koefficienterne, og dermed effekten, er falsk for store).

Trods dette vil vi demonstrere, hvordan stepwise variable selection udføres i R. Begynd med at installere pakken olsrr og aktivere den. I nedenstående eksempel skaber vi en lineær model med mpg-data. Vi prædikterer hwy ved at specificere hwy ~., hvor . betyder "alle variabler" i mpg. Du kan derefter bruge funktionen tidy() fra broom til at se resultatet. Derefter anvendes ols_step_forward_aic() til at udføre forward stepwise selection. Resultatet visualiseres derefter. Vi udskriver også resultaterne, så information om R2R^2 kan opnås. Den tilsvarende funktion for backward stepwise selection er ols_step_backward_aic().

library(olsrr)
library(broom)
library(tidyverse)

## Skaber modellen
model <- lm(hwy ~., data = mpg)

## Se modellens resultat før forward stepwise selection
tidy(model)

## Forward stepwise selection
forward<-ols_step_forward_aic(model)

plot(forward) + theme_bw()
Linjediagram over AIC pr. trin i forward stepwise selection, hvor cty, model, fl, year, trans og cyl tilføjes, og AIC falder
print(forward)
                         Selection Summary
-------------------------------------------------------------------
Variable       AIC       Sum Sq       RSS       R-Sq      Adj. R-Sq
-------------------------------------------------------------------
cty          930.567    7549.302    712.360    0.91378      0.91340
model        745.249    8026.474    235.189    0.97153      0.96598
fl           721.367    8056.430    205.232    0.97516      0.96970
year         693.609    8080.938    180.724    0.97812      0.97317
trans        689.636    8097.136    164.526    0.98009      0.97436
cyl          685.650    8101.292    160.370    0.98059      0.97487
-------------------------------------------------------------------

Univariat screening

Mange forskere anvender univariat screening til at bestemme, hvilke variabler der skal indgå i modellen. Det indebærer, at én variabel ad gangen testes, og hvis den er statistisk signifikant, inkluderes den i den endelige model. Dette er også forkert, fordi variabelselektionen ikke bør baseres på P-værdier. Desuden kan det føre til, at variabler, der kun er signifikante i tilstedeværelse af andre variabler, bliver ekskluderet. Man kan således miste vigtige prædiktorer med denne metode.

LASSO (least absolute shrinkage and selection operator)

LASSO er en regressionsmodel, der kan anvendes til at selektere variabler. LASSO fungerer ved at beregne parameteren λ\lambda, hvormed mere komplekse modeller straffes, og dermed kan variabler ekskluderes.

I R anvendes pakken glmnet() til at udføre LASSO. Pakken accepterer ikke en data frame, men kræver, at udfaldet og prædiktorerne specificeres i to separate matricer (se nedenfor). Alle variabler af typen character skal konverteres til factor. Derefter skal der udføres one-hot encoding for faktorer, hvilket betyder, at en factor med 4 niveauer konverteres til 4 forskellige binære variabler (én for hvert niveau af den oprindelige variabel). Følg kommentarerne i koden nedenfor for at forstå, hvilke trin der udføres.

## Aktivér mltools for at få adgang til funktionen one_hot()
library(mltools)
## Aktivér data.table for at få adgang til funktionen as.data.table()
library(data.table)
## Aktivér glmnet, som har lasso()
library(glmnet)

## Konverterer alle character til factor
mpg <- mpg %>% mutate_if(is.character, as.factor)

## One-hot encoding
mpg <- one_hot(as.data.table(mpg))

## Alle prædiktorer placeres i én matrix
x <- as.matrix(select(mpg, -hwy))

## Udfaldsmålet placeres i en anden matrix
y <- as.matrix(select(mpg, hwy))

my_lasso <- glmnet(x,y)
print(my_lasso)

Resultatet bliver som følger nedenfor (forkortet). DF (degrees of freedom) er antallet af frihedsgrader, hvilket er antallet af prædiktorer. %Dev ligner målet R2 (dvs. et mål for prædiktionsevne).

Call:  glmnet(x = x, y = y)

   Df  %Dev Lambda
1   0  0.00 5.6800
2   1 15.51 5.1750
3   1 28.39 4.7160
4   1 39.09 4.2970
5   1 47.97 3.9150
6   1 55.34 3.5670
7   1 61.46 3.2500
..................
80 63 98.07 0.0037
81 63 98.07 0.0033
82 63 98.07 0.0030
83 63 98.07 0.0028
84 63 98.07 0.0025
85 64 98.07 0.0023

For en specifik λ\lambda kan vi se, hvilke variabler der findes i modellen, med følgende kommando:

coef(my_lasso, 1)
83 x 1 sparse Matrix of class "dgCMatrix"
                                     s1
(Intercept)                   6.1476740
drv_4                        -0.8684261
cty                           1.0483884

Vi kan visualisere prædiktorerne i den bedste model med funktionen plot_glmnet() fra pakken plotmo. Hvis du ikke har plotmo, skal du installere den først (install.packages("plotmo")). Herunder visualiserer vi de 5 bedste prædiktorer.

library(plotmo)
plot_glmnet(my_lasso, label=5)
LASSO-koefficientbaner mod log lambda, hvor flere prædiktorer får koefficienter forskellige fra nul, når lambda aftager

LASSO bør egentlig udføres med krydsvalidering (cross validation). For at gentage processen med krydsvalidering med 5 folds anvendes følgende kommando:

cv_lasso_fit <- cv.glmnet(x = x, y = y,
                          alpha = 1,
                          nfolds = 5)

Vi kan visualisere resultatet af LASSO som følger:

plot(cv_lasso_fit)
Krydsvalideret MSE mod log lambda for LASSO med fejlsøjler og stiplede linjer ved laveste MSE og 1 SE

Grafen ovenfor viser MSE (middelværdien af den kvadrerede fejl) på Y-aksen, og X-aksen viser log(λ\lambda) med et konfidensinterval for hver model. Der er to vertikale (stiplede) linjer. Linjen til venstre viser, hvor den laveste MSE er. Linjen til højre ligger 1 standard error højere (i MSE) og angiver lambda for en mere regulariseret model. En regulariseret model har mindre overfitting og prædikterer bedre på testdata.

Vi kan udtrække λ\lambda for modellen med laveste MSE med følgende kommando:

cv_lasso_fit$lambda.min
[1] 0.0213847

Vi kan udtrække lambda for modellen, der har 1 standard error højere MSE:

cvdata$lambda.1se
[1] 0.071673

For at få oplyst, hvilke variabler det drejer sig om, skrives:

coef(cv_lasso_fit, cv_lasso_fit$lambda.1se)
83 x 1 sparse Matrix of class "dgCMatrix"
                                         s1
(Intercept)                  -64.0455866216
manufacturer_audi              1.5005369115
manufacturer_jeep             -0.1174150053
manufacturer_land rover        0.1612552376
manufacturer_nissan           -0.1059190236
manufacturer_pontiac           0.8169337991
model_4runner 4wd             -0.5598256719
model_a4 quattro               0.5838794421
model_c1500 suburban 2wd      -0.2756224964
model_caravan 2wd             -0.3546136186
model_corvette                 1.5663555709
model_f150 pickup 4wd         -0.2270155529
model_forester awd             0.6830388254
model_grand prix               0.0193951129
model_maxima                  -0.6714694460
model_new beetle               0.2395820131
model_passat                   0.2035794420
model_range rover              0.0072253567
model_toyota tacoma 4wd       -0.1979795939
year                           0.0353436525
cyl                           -0.0568519000
trans_auto(av)                -0.4658374498
trans_auto(l3)                -0.8101522067
trans_auto(l4)                -0.0860617303
trans_auto(l5)                 0.1494574949
trans_auto(s5)                 0.5779641947
drv_4                         -1.5127151569
drv_f                          0.0009265857
cty                            1.0643633366
fl_c                           2.5131385470
fl_d                           0.5011373754
fl_e                          -0.8901996792
class_2seater                  0.0315777873
class_compact                  0.0529440191
class_midsize                  0.6824124438
class_pickup                  -1.4729080052
class_suv                     -1.2054913050

Machine learning til variabelselektion

Machine learning, især random forest, kan også anvendes til at identificere vigtige variabler. Machine learning (random forest) har en naturlig måde at kvantificere hver prædiktors styrke på, og dermed kan man rangordne alle prædiktorerne efter deres prædiktionsevne. Dette bliver stadig mere almindeligt i kliniske studier, og fordelen er, at disse metoder kan håndtere et meget stort antal kandidatvariabler (tusindvis af variabler går fint). Andre metoder, såsom principal component analysis (PCA), kan også anvendes, men random forest har flere fordele sammenlignet med disse. Disse metoder diskuteres i de respektive kapitler.