Opzakken uitvoeren in r (stap voor stap)


Wanneer we een beslissingsboom maken voor een bepaalde dataset, gebruiken we slechts één trainingsdataset om het model te bouwen.

Het nadeel van het gebruik van één enkele beslissingsboom is echter dat deze vaak te kampen heeft met een hoge variantie . Dat wil zeggen: als we de dataset in twee helften splitsen en de beslissingsboom op beide helften toepassen, kunnen de resultaten heel verschillend zijn.

Eén methode die we kunnen gebruiken om de variantie van een enkele beslissingsboom te verkleinen, staat bekend als ‚bagging‘ , ook wel bootstrap-aggregatie genoemd.

Het opzakken werkt als volgt:

1. Neem b- bootstrapped samples uit de originele dataset.

2. Maak een beslissingsboom voor elk bootstrap-voorbeeld.

3. Gemiddelde van de voorspellingen van elke boom om een definitief model te verkrijgen.

Door honderden of zelfs duizenden individuele beslisbomen te bouwen en de gemiddelde voorspellingen van alle bomen te nemen, eindigen we vaak met een passend tasmodel dat een veel lager testfoutenpercentage oplevert vergeleken met een enkele beslissingsboom.

Deze zelfstudie biedt een stapsgewijs voorbeeld van hoe u een model in een zak kunt maken in R.

Stap 1: Laad de benodigde pakketten

Eerst laden we de benodigde pakketten voor dit voorbeeld:

 library (dplyr) #for data wrangling
library (e1071) #for calculating variable importance
library (caret) #for general model fitting
library (rpart) #for fitting decision trees
library (ipred) #for fitting bagged decision trees

Stap 2: Monteer het model met zak

Voor dit voorbeeld gebruiken we een ingebouwde R-dataset genaamd Air Quality , die metingen bevat van de luchtkwaliteit in New York City gedurende 153 afzonderlijke dagen.

 #view structure of air quality dataset
str(airquality)

'data.frame': 153 obs. of 6 variables:
 $ Ozone: int 41 36 12 18 NA 28 23 19 8 NA ...
 $Solar.R: int 190 118 149 313 NA NA 299 99 19 194 ...
 $ Wind: num 7.4 8 12.6 11.5 14.3 14.9 8.6 13.8 20.1 8.6 ...
 $ Temp: int 67 72 74 62 56 66 65 59 61 69 ...
 $Month: int 5 5 5 5 5 5 5 5 5 5 ...
 $Day: int 1 2 3 4 5 6 7 8 9 10 ...

De volgende code laat zien hoe u een in zakken verpakt model in R kunt passen met behulp van de functie bagging() uit de ipred- bibliotheek.

 #make this example reproducible
set.seed(1)

#fit the bagged model
bag <- bagging(
  formula = Ozone ~ .,
  data = airquality,
  nbagg = 150 ,   
  coob = TRUE ,
  control = rpart. control (minsplit = 2 , cp = 0 )
)

#display fitted bagged model
bag

Bagging regression trees with 150 bootstrap replications 

Call: bagging.data.frame(formula = Ozone ~ ., data = airquality, nbagg = 150, 
    coob = TRUE, control = rpart.control(minsplit = 2, cp = 0))

Out-of-bag estimate of root mean squared error: 17.4973

Merk op dat we ervoor hebben gekozen om 150 bootstrapped-monsters te gebruiken om het in zakken verpakte model te bouwen en dat we hebben gespecificeerd dat coob WAAR is om de geschatte out-of-bag-fout te verkrijgen.

We hebben ook de volgende specificaties gebruikt in de functie rpart.control() :

  • minsplit = 2: Dit vertelt het model dat er slechts 2 waarnemingen in een knooppunt nodig zijn om te splitsen.
  • cp = 0 . Dit is de complexiteitsparameter. Door dit op 0 in te stellen, is het niet nodig dat het model de algehele pasvorm op enigerlei wijze kan verbeteren om een splitsing uit te voeren.

In wezen zorgen deze twee argumenten ervoor dat individuele bomen extreem diep kunnen groeien, wat leidt tot bomen met een hoge variantie maar een lage bias. Wanneer we vervolgens bagging toepassen, kunnen we de variantie van het uiteindelijke model verkleinen, terwijl de bias laag blijft.

Uit de modelresultaten kunnen we zien dat de geschatte out-of-bag RMSE 17,4973 bedraagt. Dit is het gemiddelde verschil tussen de voorspelde waarde voor ozon en de werkelijk waargenomen waarde.

Stap 3: Visualiseer het belang van de voorspellers

Hoewel modellen met zakken vaak nauwkeurigere voorspellingen geven dan individuele beslissingsbomen, is het moeilijk om de resultaten van modellen met zakken te interpreteren en te visualiseren.

We kunnen het belang van voorspellende variabelen echter visualiseren door de totale reductie in RSS (resterende som van kwadraten) als gevolg van de verdeling over een bepaalde voorspellende factor te berekenen, gemiddeld over alle bomen. Hoe groter de waarde, hoe belangrijker de voorspeller.

De volgende code laat zien hoe u een variabele belangrijkheidsplot voor het passende tasmodel kunt maken, met behulp van de functie varImp() uit de caret- bibliotheek:

 #calculate variable importance
VI <- data.frame(var= names (airquality[,-1]), imp= varImp (bag))

#sort variable importance descending
VI_plot <- VI[ order (VI$Overall, decreasing= TRUE ),]

#visualize variable importance with horizontal bar plot
barplot(VI_plot$Overall,
        names.arg= rownames (VI_plot),
        horiz= TRUE ,
        col=' steelblue ',
        xlab=' Variable Importance ')

Variabele belangrijkheidsgrafiek in R

We kunnen zien dat Solar.R de belangrijkste voorspellende variabele in het model is, terwijl Maand de minst belangrijke is.

Stap 4: Gebruik het model om voorspellingen te doen

Tenslotte kunnen we met het ‘fitting bag’-model voorspellingen doen over nieuwe waarnemingen.

 #define new observation
new <- data.frame(Solar.R=150, Wind=8, Temp=70, Month=5, Day=5)

#use fitted bagged model to predict Ozone value of new observation
predict(bag, newdata=new)

24.4866666666667

Op basis van de waarden van de voorspellende variabelen voorspelt het tasmodel dat de ozonwaarde op deze specifieke dag 24.487 zal zijn.

De volledige R-code die in dit voorbeeld wordt gebruikt, vindt u hier .

Einen Kommentar hinzufügen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert