Jak tworzyć losowe lasy w r (krok po kroku)


Kiedy związek między zbiorem zmiennych predykcyjnych a zmienną odpowiedzi jest bardzo złożony, często używamy metod nieliniowych do modelowania związku między nimi.

Jedną z takich metod jest zbudowanie drzewa decyzyjnego . Jednakże wadą stosowania pojedynczego drzewa decyzyjnego jest to, że charakteryzuje się ono dużą wariancją .

Oznacza to, że jeśli podzielimy zbiór danych na dwie połowy i zastosujemy drzewo decyzyjne do obu połówek, wyniki mogą być bardzo różne.

Jedną z metod, których możemy użyć do zmniejszenia wariancji pojedynczego drzewa decyzyjnego, jest zbudowanie losowego modelu lasu , który działa w następujący sposób:

1. Pobierz próbki bootstrapowe z oryginalnego zbioru danych.

2. Utwórz drzewo decyzyjne dla każdej próbki bootstrap.

  • Podczas konstruowania drzewa za każdym razem, gdy rozważany jest podział, tylko losowa próbka m predyktorów jest uważana za kandydatów do podziału z pełnego zestawu p predyktorów. Generalnie wybieramy m równe √p .

3. Uśrednij przewidywania z każdego drzewa, aby otrzymać ostateczny model.

Okazuje się, że losowe lasy zwykle tworzą znacznie dokładniejsze modele niż pojedyncze drzewa decyzyjne, a nawet modele workowe .

W tym samouczku przedstawiono krok po kroku przykład tworzenia losowego modelu lasu dla zbioru danych w języku R.

Krok 1: Załaduj niezbędne pakiety

Najpierw załadujemy pakiety niezbędne dla tego przykładu. W tym prostym przykładzie potrzebujemy tylko jednego pakietu:

 library (randomForest)

Krok 2: Dostosuj model losowego lasu

W tym przykładzie użyjemy wbudowanego zbioru danych R o nazwie Air Quality , który zawiera pomiary jakości powietrza w Nowym Jorku w ciągu 153 poszczególnych dni.

 #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 ...

#find number of rows with missing values
sum(! complete . cases (airquality))

[1] 42

Ten zbiór danych zawiera 42 wiersze z brakującymi wartościami. Dlatego przed dopasowaniem losowego modelu lasu uzupełnimy brakujące wartości w każdej kolumnie medianami kolumn:

 #replace NAs with column medians
for (i in 1: ncol (air quality)) {
  airquality[,i][ is . na (airquality[, i])] <- median (airquality[, i], na . rm = TRUE )
}

Powiązane: Jak przypisać brakujące wartości w R

Poniższy kod pokazuje, jak dopasować losowy model lasu w R przy użyciu funkcji randomForest() z pakietu randomForest .

 #make this example reproducible
set.seed(1)

#fit the random forest model
model <- randomForest(
  formula = Ozone ~ .,
  data = airquality
)

#display fitted model
model

Call:
 randomForest(formula = Ozone ~ ., data = airquality) 
               Type of random forest: regression
                     Number of trees: 500
No. of variables tried at each split: 1

          Mean of squared residuals: 327.0914
                    % Var explained: 61

#find number of trees that produce lowest test MSE
which.min(model$mse)

[1] 82

#find RMSE of best model
sqrt(model$mse[ which . min (model$mse)]) 

[1] 17.64392

Z wyniku widać, że model, który wygenerował najniższy testowy błąd średniokwadratowy (MSE), wykorzystywał 82 drzewa.

Widzimy również, że średni błąd kwadratowy tego modelu wyniósł 17,64392 . Możemy to traktować jako średnią różnicę między przewidywaną wartością ozonu a rzeczywistą obserwowaną wartością.

Możemy również użyć poniższego kodu, aby utworzyć wykres testu MSE w oparciu o liczbę użytych drzew:

 #plot the MSE test by number of trees
plot(model)

Przetestuj MSE według liczby drzew w losowym lesie w R

Możemy także użyć funkcji varImpPlot() , aby utworzyć wykres przedstawiający ważność każdej zmiennej predykcyjnej w ostatecznym modelu:

 #produce variable importance plot
varImpPlot(model) 

Losowy las w R

Oś x przedstawia średni wzrost czystości węzłów drzew regresji jako funkcję podziału na różne predyktory wyświetlane na osi y.

Z wykresu widzimy, że najważniejszą zmienną predykcyjną jest Wiatr , a tuż za nim znajduje się Temp .

Krok 3: Dopasuj model

Domyślnie funkcja randomForest() wykorzystuje 500 drzew i (łącznie predyktorów/3) losowo wybranych predyktorów jako potencjalnych kandydatów do każdego podziału. Możemy dostosować te parametry za pomocą funkcji tuneRF() .

Poniższy kod pokazuje, jak znaleźć optymalny model przy użyciu następujących specyfikacji:

  • ntreeTry: Liczba drzew do zbudowania.
  • mtryStart: początkowa liczba zmiennych predykcyjnych, które należy uwzględnić przy każdym podziale.
  • stepFactor: Współczynnik zwiększany do momentu, aż szacowany błąd out-of-bag przestanie się poprawiać o określoną wartość.
  • poprawić: wielkość, o jaką należy poprawić błąd wyjścia worka, aby w dalszym ciągu zwiększać współczynnik kroku.
 model_tuned <- tuneRF(
               x=airquality[,-1], #define predictor variables
               y=airquality$Ozone, #define response variable
               ntreeTry= 500 ,
               mtryStart= 4 , 
               stepFactor= 1.5 ,
               improve= 0.01 ,
               trace= FALSE #don't show real-time progress
               )

Ta funkcja generuje następujący wykres, który przedstawia liczbę predyktorów użytych przy każdym podziale podczas konstruowania drzew na osi x i szacowany błąd out-of-bag na osi y:

Błąd OOB losowego modelu lasu w R

Widzimy, że najniższy błąd OOB uzyskuje się, stosując 2 losowo wybrane predyktory przy każdym podziale podczas budowania drzew.

W rzeczywistości odpowiada to ustawieniu domyślnemu (liczba predyktorów/3 = 6/3 = 2) używanemu przez początkową funkcję randomForest() .

Krok 4: Użyj ostatecznego modelu do przewidywania

Wreszcie możemy użyć skorygowanego modelu lasu losowego do przewidywania nowych obserwacji.

 #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(model, newdata=new)

27.19442

Na podstawie wartości zmiennych predykcyjnych dopasowany losowy model lasu przewiduje, że w tym konkretnym dniu wartość ozonu wyniesie 27,19442 .

Pełny kod R użyty w tym przykładzie można znaleźć tutaj .

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *