Samouczek dotyczący losowego lasu w R: algorytm z przykładem

⚡ Inteligentne podsumowanie

Random Forest w R buduje setki drzew decyzyjnych na podstawie bootstrappingowych próbek i uśrednia ich głosy w jedną solidną prognozę. Ten przewodnik dostraja mtry, maxnodes i ntree za pomocą caret i ocenia ostateczny model na podstawie danych o przetrwaniu Titanica.

  • 🌳 Zasada główna: W metodzie bagging każde drzewo jest trenowane na próbce bootstrapowej i losowym podzbiorze predyktorów, dzięki czemu pojedyncze błędy znoszą się podczas głosowania większościowego.
  • 🧪 Konfiguracja walidacji: trainControl(method = “cv”, number = 10, search = “grid”) naprawia dziesięciokrotne przeszukiwanie siatki, wykorzystywane ponownie w każdym kroku dostrajania.
  • 🎯 Kolejność strojenia: Najpierw zoptymalizuj mtry, następnie maxnodes, a na końcu ntree, przenosząc zwycięską wartość do przodu na każdym etapie.
  • 📈 Najlepsza konfiguracja: mtry = 4, maxnodes = 24 i ntree = 800 dały najwyższą dokładność potwierdzoną krzyżowo w tym zestawie danych.
  • 🧮 Wynik testu: confusionMatrix() zgłasza dokładność na poziomie 79.43%, czułość 0.9091 i swoistość 0.6364 w przypadku danych wyodrębnionych.

Las losowy w R

Co to jest losowy las w R?

Losowe lasy opierają się na prostym pomyśle: „mądrości tłumu”. Suma wyników wielu predyktorów daje lepszą prognozę niż najlepszy indywidualny predyktor. Grupa predyktorów nazywana jest an ensemble. Dlatego ta technika nazywa się Nauka zespołowa.

W poprzednim samouczku nauczyłeś się, jak używać drzewa decyzyjne dokonać przewidywania binarnego. Aby udoskonalić naszą technikę, możemy szkolić grupę Klasyfikatory drzew decyzyjnych, każdy na innym losowym podzbiorze zbioru szkoleniowego. Aby dokonać prognozy, zbierasz prognozy wszystkich pojedynczych drzew i zwracasz klasę, która otrzyma najwięcej głosów. Ta technika nazywa się Losowy las.

Zanim napiszesz jakikolwiek kod, warto zobaczyć dokładnie, w jaki sposób poszczególne drzewa tworzą las.

Jak działa losowy las w R?

Zrozumienie mechaniki ułatwia wnioskowanie o każdym parametrze dostrajania. Budowa lasu losowego składa się z czterech etapów.

  1. Bootstrap próbowanie. Algorytm losuje próbkę wierszy z wymianą z zestawu treningowego dla każdego drzewa. Około jedna trzecia rzędów jest pomijana w każdej próbce; są to obserwacje poza workiem (OOB).
  2. Losowy wybór cech. Przy każdym podziale brany jest pod uwagę tylko losowy podzbiór predyktorów. Rozmiar tego podzbioru to próba parametr. Ograniczenie wyboru zapobiega temu, aby wszystkie drzewa wyglądały tak samo.
  3. Nieprzycinane pędy drzew. Każde drzewo rośnie, aż dotrze do punktu zatrzymaniaping zasada taka jak maxwęzły or rozmiar węzłaPoszczególnym drzewom celowo pozwala się na nadmierne dopasowanie, ponieważ ich błędy nie są skorelowane.
  4. Zbiór. W przypadku klasyfikacji las zwraca klasę z największą liczbą głosów; w przypadku regresji zwraca średnią prognozę. Ten krok uśredniania jest tym, co określa się terminem parcianka (agregacja bootstrapowa) opisuje.

Próbkowanie wierszowe i kolumnowe to cała sztuczka. Pojedyncze, głębokie drzewo ma niskie odchylenie i bardzo wysoką wariancję; uśrednianie setek takich drzew utrzymuje niskie odchylenie, jednocześnie zmniejszając wariancję.

Błąd braku opakowania. Ponieważ każda obserwacja jest pomijana w około jednej trzeciej drzew, R może oceniać każdy wiersz, używając tylko drzew, które go nigdy nie widziały. Wynikowy błąd OOB to darmowe, wbudowane oszacowanie walidacyjne wydrukowane przez randomForest():

rf_oob <- randomForest(survived~., data = data_train, ntree = 800, mtry = 4)
print(rf_oob)   # reports the OOB estimate of error rate

Błąd OOB to wygodna i szybka kontrola, ale w tym samouczku zastosowano dziesięciokrotną walidację krzyżową za pomocą kursora, więc każda siatka strojenia jest porównywana w identycznych miejscach.

Las losowy a drzewo decyzyjne w R

Las losowy to zbiór tych samych drzewa decyzyjne zostały omówione w poprzednim samouczku, warto więc jasno określić różnice przed podjęciem decyzji.

kryteria Drzewo decyzyjne Losowy las
Structure Jedno drzewo Setki drzew połączonych poprzez głosowanie
Zmienność Wysoka, bardzo wrażliwa na próbkę treningową Niski, uśrednianie anuluje pojedyncze błędy
Ryzyko nadmiernego dopasowania Wysoka, chyba że przycinana Niski nawet przy nie przycinanych drzewach
Interpretowalność W pełni czytelny jako schemat blokowy Można odczytać tylko zmienną ważność
Koszt szkolenia Bardzo szybka Proporcjonalnie do ntree
Wbudowana walidacja żaden Oszacowanie błędu poza torbą
Funkcja R rpart() randomForest()

Wybierz pojedyncze drzewo, gdy musisz wyjaśnić ścieżkę decyzyjną odbiorcy nietechnicznemu. Wybierz las, gdy dokładność predykcji jest ważniejsza niż czytelny diagram.

Zalety i wady losowego lasu

Wiedza o tym, w których momentach algorytm jest mocny, a w których słaby, podpowie, kiedy warto poświęcić czas na dalsze dostrajanie.

Zalety

  • Dokładność bez przycinania: uśrednianie wielu nieskorelowanych drzew daje dobre rezultaty przy minimalnym konieczności ręcznego dostrajania.
  • Odporny na nadmierne dopasowanie: dodawanie większej liczby drzew nigdy nie zwiększa błędu generalizacji, więc ntree można bezpiecznie podnieść.
  • Obsługuje mieszane dane: predyktory numeryczne i czynnikowe działają obok siebie, a skalowanie nie jest konieczne.
  • Bezpłatna walidacja i ranking: błąd OOB i varImp() nie powodują dodatkowych kosztów obliczeniowych.

Wady

  • Nieprzejrzyste prognozy: nie możesz tracpojedyncza ścieżka decyzyjna, co ma znaczenie w środowiskach regulowanych.
  • Powolny w dużych lasach: skala czasu szkolenia i przewidywania liniowo zależna od liczby drzew.
  • Wyniki oceny ważności stronniczej: zmienne kategoryczne o wielu poziomach mogą wydawać się ważniejsze niż są w rzeczywistości.
  • Słaba ekstrapolacja: w przypadku regresji las nigdy nie jest w stanie przewidzieć czegoś poza zakresem widzianym podczas treningu.

Po ustaleniu teorii i kompromisów, następnych sześć kroków polega na zbudowaniu, dostrojeniu i ocenie lasu losowego na podstawie zbioru danych o przetrwaniu Titanica.

Krok 1) Zaimportuj dane

Aby upewnić się, że masz ten sam zestaw danych, co w samouczku dotyczącym drzewa decyzyjneZestaw pociągowy i zestaw testowy są dostępne online. Można je zaimportować bez wprowadzania żadnych zmian.

library(dplyr)
data_train <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/train.csv")
glimpse(data_train)
data_test <- read.csv("https://raw.githubusercontent.com/guru99-edu/R-Programming/master/test.csv") 
glimpse(data_test)

Krok 2) Wytrenuj model

Jednym ze sposobów oceny wydajności modelu jest trenowanie go na kilku różnych, mniejszych zbiorach danych i ocena ich w oparciu o inny, mniejszy zestaw testowy. To się nazywa k-krotna weryfikacja krzyżowa. R posiada funkcję, która losowo dzieli dane na k podzbiorów o niemal tej samej wielkości. Na przykład, jeśli k = 10, model jest trenowany na dziewięciu podzbiorach i oceniany na pozostałym podzbiorze. Ten proces jest powtarzany, aż wszystkie podzbiory zostaną ocenione. Ta technika jest szeroko stosowana do selekcji modelu, zwłaszcza gdy model ma parametry do dostrojenia.

Teraz, gdy wiemy już, jak ocenić nasz model, musimy zdecydować, które parametry najlepiej uogólniają dane, których nie widzieliśmy.

Losowy las wybiera losowy podzbiór funkcji i buduje wiele drzew decyzyjnych. Model uśrednia wszystkie przewidywania drzew decyzyjnych.

Las losowy ma pewne parametry, które można zmienić, aby poprawić generalizację prognozy. Do trenowania modelu użyjesz funkcji randomForest().

Składnia funkcji randomForest() jest następująca:

randomForest(formula, ntree=n, mtry=FALSE, maxnodes = NULL)
Arguments:
- Formula: Formula of the fitted model
- ntree: number of trees in the forest
- mtry: Number of candidate variables drawn at each split. By default, it is the square root of the number of predictors for classification.
- maxnodes: Set the maximum number of terminal nodes each tree can have
- importance=TRUE: Whether independent variables importance in the random forest be assessed

Note: Losowy las można trenować na większej liczbie parametrów. Możesz odwołać się do winieta aby zobaczyć różne parametry.

Strojenie modelu to żmudna praca. Istnieje wiele możliwych kombinacji parametrów. Nie zawsze masz czas, aby wypróbować je wszystkie. Dobrą alternatywą jest pozwolenie maszynie znaleźć najlepszą kombinację. Dostępne są dwie metody:

  • Losowe wyszukiwanie
  • Wyszukiwanie siatki

Obie metody zdefiniowano poniżej, ale w tym samouczku model jest trenowany za pomocą przeszukiwania siatki.

Definicja wyszukiwania w siatce

Metoda wyszukiwania siatki jest prosta, model zostanie oceniony na podstawie całej kombinacji przekazanej w funkcji za pomocą sprawdzania krzyżowego.

Na przykład chcesz wypróbować model z 10, 20, 30 drzewami, a każde drzewo będzie testowane przez liczbę mtry równą 1, 2, 3, 4, 5. Następnie maszyna przetestuje 15 różnych modeli:

    .mtry ntrees
 1      1     10
 2      2     10
 3      3     10
 4      4     10
 5      5     10
 6      1     20
 7      2     20
 8      3     20
 9      4     20
 10     5     20
 11     1     30
 12     2     30
 13     3     30
 14     4     30
 15     5     30	

Algorytm oceni:

randomForest(formula, ntree=10, mtry=1)
randomForest(formula, ntree=10, mtry=2)
randomForest(formula, ntree=10, mtry=3)
randomForest(formula, ntree=20, mtry=2)
...

Każda kombinacja jest oceniana za pomocą walidacji krzyżowej. Wadą przeszukiwania siatki jest liczba eksperymentów: rośnie ona gwałtownie, gdy liczba kombinacji jest duża. Aby rozwiązać ten problem, można zastosować wyszukiwanie losowe.

Definicja wyszukiwania losowego

Główną różnicą między wyszukiwaniem losowym a wyszukiwaniem siatkowym jest to, że wyszukiwanie losowe nie ocenia wszystkich kombinacji hiperparametrów w przestrzeni wyszukiwania. Zamiast tego losowo wybiera kombinację w każdej iteracji. Zaletą jest znacznie niższy koszt obliczeniowy.

Ustaw parametr kontrolny

Aby skonstruować i ocenić model, będziesz postępować w następujący sposób:

  • Oceń model z ustawieniami domyślnymi
  • Znajdź najlepszą liczbę mtry
  • Znajdź najlepszą liczbę maxnodów
  • Znajdź najlepszą liczbę ndrzew
  • Oceń model na testowym zestawie danych

Zanim zaczniesz eksplorację parametrów, musisz zainstalować dwie biblioteki.

  • caret: Biblioteka uczenia maszynowego R. Jeśli masz zainstaluj r z r-essential. Jest już w bibliotece
  • e1071: Biblioteka uczenia maszynowego R.

Możesz je zaimportować wraz z randomForest:

library(randomForest)
library(caret)
library(e1071)

Ustawienia domyślne

Walidacja krzyżowa K-krotna jest kontrolowana przez funkcję trainControl().

trainControl(method = "cv", number = n, search ="grid")
arguments
- method = "cv": The method used to resample the dataset. 
- number = n: Number of folds to create
- search = "grid": Use the grid search method. For the randomized method, use "random"
Note: You can refer to the vignette to see the other arguments of the function.

Możesz spróbować uruchomić model z domyślnymi parametrami i sprawdzić wynik dokładności.

Note: Przez cały samouczek będziesz używać tych samych elementów sterujących.

# Define the control
trControl <- trainControl(method = "cv",
    number = 10,
    search = "grid")

Do oceny modelu użyjesz biblioteki caret. Biblioteka ma jedną funkcję o nazwie train() do oceny prawie wszystkich uczenie maszynowe algorytm. Inaczej mówiąc, możesz użyć tej funkcji do trenowania innych algorytmów.

Podstawowa składnia to:

train(formula, df, method = "rf", metric= "Accuracy", trControl = trainControl(), tuneGrid = NULL)
argument
- `formula`: Define the formula of the algorithm
- `method`: Define which model to train. Note, at the end of the tutorial, there is a list of all the models that can be trained
- `metric` = "Accuracy": Define how to select the optimal model
- `trControl = trainControl()`: Define the control parameters
- `tuneGrid = NULL`: Return a data frame with all the possible combination

Zbudujmy model z wartościami domyślnymi.

set.seed(1234)
# Run the model
rf_default <- train(survived~.,
    data = data_train,
    method = "rf",
    metric = "Accuracy",
    trControl = trControl)
# Print the results
print(rf_default)

Code Wyjaśnienie

  • trainControl(metoda=”cv”, liczba=10, wyszukiwanie=”siatka”): Oceń model za pomocą wyszukiwania siatki ponad 10-krotnie
  • pociąg(…): Wytrenuj losowy model lasu. Najlepszy model wybiera się na podstawie miary dokładności.

Wyjście:

## Random Forest 
## 
## 836 samples
##   7 predictor
##   2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##    2    0.7919248  0.5536486
##    6    0.7811245  0.5391611
##   10    0.7572002  0.4939620
## 
## Accuracy was used to select the optimal model using  the largest value.
## The final value used for the model was mtry = 2.

Algorytm wykorzystuje 500 drzew i testuje trzy różne wartości mtry: 2, 6, 10.

Wartość końcowa użyta w modelu to mtry = 2, z dokładnością walidowaną krzyżowo na poziomie 0.792. Spróbujmy uzyskać wyższy wynik.

Wyszukaj najlepszy mtry

Możesz przetestować model z wartościami mtry od 1 do 10

set.seed(1234)
tuneGrid <- expand.grid(.mtry = c(1: 10))
rf_mtry <- train(survived~.,
    data = data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 300)
print(rf_mtry)

Code Wyjaśnienie

  • tuneGrid <- expand.grid(.mtry = c(1:10)): Konstruuje wektor z wartościami od 1 do 10

Wyjście:

## Random Forest 
## 
## 836 samples
##   7 predictor
##   2 classes: 'No', 'Yes' 
## 
## No pre-processing
## Resampling: Cross-Validated (10 fold) 
## Summary of sample sizes: 753, 752, 753, 752, 752, 752, ... 
## Resampling results across tuning parameters:
## 
##   mtry  Accuracy   Kappa    
##    1    0.7572576  0.4647368
##    2    0.7979346  0.5662364
##    3    0.8075158  0.5884815
##    4    0.8110729  0.5970664
##    5    0.8074727  0.5900030
##    6    0.8099111  0.5949342
##    7    0.8050918  0.5866415
##    8    0.8050918  0.5855399
##    9    0.8050631  0.5855035
##   10    0.7978916  0.5707336
## 
## Accuracy was used to select the optimal model using  the largest value.
## The final value used for the model was mtry = 4.

Najlepsza wartość mtry wynosi 4. Jest ona przechowywana w:

rf_mtry$bestTune$mtry

Można go przechowywać i używać, gdy trzeba dostroić inne parametry.

max(rf_mtry$results$Accuracy)

Wyjście:

## [1] 0.8110729
best_mtry <- rf_mtry$bestTune$mtry 
best_mtry

Wyjście:

## [1] 4

Krok 3) Wyszukaj najlepsze maxnody

Musisz utworzyć pętlę, aby ocenić różne wartości maxnodes. W poniższym kodzie:

  • Tworzenie listy
  • Utwórz zmienną o najlepszej wartości parametru mtry; Obowiązkowy
  • Utwórz pętlę
  • Zapisz bieżącą wartość maxnode
  • Podsumuj wyniki
store_maxnode <- list()
tuneGrid <- expand.grid(.mtry = best_mtry)
for (maxnodes in c(5: 15)) {
    set.seed(1234)
    rf_maxnode <- train(survived~.,
        data = data_train,
        method = "rf",
        metric = "Accuracy",
        tuneGrid = tuneGrid,
        trControl = trControl,
        importance = TRUE,
        nodesize = 14,
        maxnodes = maxnodes,
        ntree = 300)
    current_iteration <- toString(maxnodes)
    store_maxnode[[current_iteration]] <- rf_maxnode
}
results_mtry <- resamples(store_maxnode)
summary(results_mtry)

Code wyjaśnienie:

  • store_maxnode <-list(): Wyniki modelu będą przechowywane na tej liście
  • Expand.grid(.mtry=best_mtry): Użyj najlepszej wartości mtry
  • dla (maxnodes in c(5:15)) { … }: Oblicz model z wartościami maxnodes od 5 do 15.
  • maxnodes = maxnodes: Dla każdej iteracji maxnodes jest równe bieżącej wartości pętli, tj. 5, 6, 7, …
  • current_iteration <- toString(maxnodes): Przechowuje wartość maxnodes jako ciąg znaków.
  • store_maxnode[[current_iteration]] <- rf_maxnode: Zapisz wynik modelu na liście.
  • resamples(store_maxnode): Uporządkuj wyniki modelu
  • podsumowanie(results_mtry): Wydrukuj podsumowanie całej kombinacji.

Wyjście:

## 
## Call:
## summary.resamples(object = results_mtry)
## 
## Models: 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 
## Number of resamples: 10 
## 
## Accuracy 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 5  0.6785714 0.7529762 0.7903758 0.7799771 0.8168388 0.8433735    0
## 6  0.6904762 0.7648810 0.7784710 0.7811962 0.8125000 0.8313253    0
## 7  0.6904762 0.7619048 0.7738095 0.7788009 0.8102410 0.8333333    0
## 8  0.6904762 0.7627295 0.7844234 0.7847820 0.8184524 0.8433735    0
## 9  0.7261905 0.7747418 0.8083764 0.7955250 0.8258749 0.8333333    0
## 10 0.6904762 0.7837780 0.7904475 0.7895869 0.8214286 0.8433735    0
## 11 0.7023810 0.7791523 0.8024240 0.7943775 0.8184524 0.8433735    0
## 12 0.7380952 0.7910929 0.8144005 0.8051205 0.8288511 0.8452381    0
## 13 0.7142857 0.8005952 0.8192771 0.8075158 0.8403614 0.8452381    0
## 14 0.7380952 0.7941050 0.8203528 0.8098967 0.8403614 0.8452381    0
## 15 0.7142857 0.8000215 0.8203528 0.8075301 0.8378873 0.8554217    0
## 
## Kappa 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 5  0.3297872 0.4640436 0.5459706 0.5270773 0.6068751 0.6717371    0
## 6  0.3576471 0.4981484 0.5248805 0.5366310 0.6031287 0.6480921    0
## 7  0.3576471 0.4927448 0.5192771 0.5297159 0.5996437 0.6508314    0
## 8  0.3576471 0.4848320 0.5408159 0.5427127 0.6200253 0.6717371    0
## 9  0.4236277 0.5074421 0.5859472 0.5601687 0.6228626 0.6480921    0
## 10 0.3576471 0.5255698 0.5527057 0.5497490 0.6204819 0.6717371    0
## 11 0.3794326 0.5235007 0.5783191 0.5600467 0.6126720 0.6717371    0
## 12 0.4460432 0.5480930 0.5999072 0.5808134 0.6296780 0.6717371    0
## 13 0.4014252 0.5725752 0.6087279 0.5875305 0.6576219 0.6678832    0
## 14 0.4460432 0.5585005 0.6117973 0.5911995 0.6590982 0.6717371    0
## 15 0.4014252 0.5689401 0.6117973 0.5867010 0.6507194 0.6955990    0

Najwyższa średnia dokładność w tym zakresie (0.8099) przypada na maxnodes = 14, na szczycie testowanego przedziału. Ponieważ najlepsza wartość znajduje się na krawędzi siatki, należy rozszerzyć wyszukiwanie w górę.

store_maxnode <- list()
tuneGrid <- expand.grid(.mtry = best_mtry)
for (maxnodes in c(20: 30)) {
    set.seed(1234)
    rf_maxnode <- train(survived~.,
        data = data_train,
        method = "rf",
        metric = "Accuracy",
        tuneGrid = tuneGrid,
        trControl = trControl,
        importance = TRUE,
        nodesize = 14,
        maxnodes = maxnodes,
        ntree = 300)
    key <- toString(maxnodes)
    store_maxnode[[key]] <- rf_maxnode
}
results_node <- resamples(store_maxnode)
summary(results_node)

Wyjście:

## 
## Call:
## summary.resamples(object = results_node)
## 
## Models: 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30 
## Number of resamples: 10 
## 
## Accuracy 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 20 0.7142857 0.7821644 0.8144005 0.8075301 0.8447719 0.8571429    0
## 21 0.7142857 0.8000215 0.8144005 0.8075014 0.8403614 0.8571429    0
## 22 0.7023810 0.7941050 0.8263769 0.8099254 0.8328313 0.8690476    0
## 23 0.7023810 0.7941050 0.8263769 0.8111302 0.8447719 0.8571429    0
## 24 0.7142857 0.7946429 0.8313253 0.8135112 0.8417599 0.8690476    0
## 25 0.7142857 0.7916667 0.8313253 0.8099398 0.8408635 0.8690476    0
## 26 0.7142857 0.7941050 0.8203528 0.8123207 0.8528758 0.8571429    0
## 27 0.7023810 0.8060456 0.8313253 0.8135112 0.8333333 0.8690476    0
## 28 0.7261905 0.7941050 0.8203528 0.8111015 0.8328313 0.8690476    0
## 29 0.7142857 0.7910929 0.8313253 0.8087063 0.8333333 0.8571429    0
## 30 0.6785714 0.7910929 0.8263769 0.8063253 0.8403614 0.8690476    0
## 
## Kappa 
##         Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 20 0.3956835 0.5316120 0.5961830 0.5854366 0.6661120 0.6955990    0
## 21 0.3956835 0.5699332 0.5960343 0.5853247 0.6590982 0.6919315    0
## 22 0.3735084 0.5560661 0.6221836 0.5914492 0.6422128 0.7189781    0
## 23 0.3735084 0.5594228 0.6228827 0.5939786 0.6657372 0.6955990    0
## 24 0.3956835 0.5600352 0.6337821 0.5992188 0.6604703 0.7189781    0
## 25 0.3956835 0.5530760 0.6354875 0.5912239 0.6554912 0.7189781    0
## 26 0.3956835 0.5589331 0.6136074 0.5969142 0.6822128 0.6955990    0
## 27 0.3735084 0.5852459 0.6368425 0.5998148 0.6426088 0.7189781    0
## 28 0.4290780 0.5589331 0.6154905 0.5946859 0.6356141 0.7189781    0
## 29 0.4070588 0.5534173 0.6337821 0.5901173 0.6423101 0.6919315    0
## 30 0.3297872 0.5534173 0.6202632 0.5843432 0.6590982 0.7189781    0

Najwyższą średnią dokładność, 0.8135, uzyskano przy maxnodes = 24 (maxnodes = 27 równa się średniej, ale ma dolny trzeci kwartyl). Dlatego w pozostałych krokach należy użyć maxnodes = 24.

Krok 4) Wyszukaj najlepsze drzewa

Teraz, gdy masz najlepszą wartość mtry i maxnode, możesz dostroić liczbę drzew. Metoda jest dokładnie taka sama jak maxnode.

store_maxtrees <- list()
for (ntree in c(250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000)) {
    set.seed(5678)
    rf_maxtrees <- train(survived~.,
        data = data_train,
        method = "rf",
        metric = "Accuracy",
        tuneGrid = tuneGrid,
        trControl = trControl,
        importance = TRUE,
        nodesize = 14,
        maxnodes = 24,
        ntree = ntree)
    key <- toString(ntree)
    store_maxtrees[[key]] <- rf_maxtrees
}
results_tree <- resamples(store_maxtrees)
summary(results_tree)

Wyjście:

## 
## Call:
## summary.resamples(object = results_tree)
## 
## Models: 250, 300, 350, 400, 450, 500, 550, 600, 800, 1000, 2000 
## Number of resamples: 10 
## 
## Accuracy 
##           Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 250  0.7380952 0.7976190 0.8083764 0.8087010 0.8292683 0.8674699    0
## 300  0.7500000 0.7886905 0.8024240 0.8027199 0.8203397 0.8452381    0
## 350  0.7500000 0.7886905 0.8024240 0.8027056 0.8277623 0.8452381    0
## 400  0.7500000 0.7886905 0.8083764 0.8051009 0.8292683 0.8452381    0
## 450  0.7500000 0.7886905 0.8024240 0.8039104 0.8292683 0.8452381    0
## 500  0.7619048 0.7886905 0.8024240 0.8062914 0.8292683 0.8571429    0
## 550  0.7619048 0.7886905 0.8083764 0.8099062 0.8323171 0.8571429    0
## 600  0.7619048 0.7886905 0.8083764 0.8099205 0.8323171 0.8674699    0
## 800  0.7619048 0.7976190 0.8083764 0.8110820 0.8292683 0.8674699    0
## 1000 0.7619048 0.7976190 0.8121510 0.8086723 0.8303571 0.8452381    0
## 2000 0.7619048 0.7886905 0.8121510 0.8086723 0.8333333 0.8452381    0
## 
## Kappa 
##           Min.   1st Qu.    Median      Mean   3rd Qu.      Max. NA's
## 250  0.4061697 0.5667400 0.5836013 0.5856103 0.6335363 0.7196807    0
## 300  0.4302326 0.5449376 0.5780349 0.5723307 0.6130767 0.6710843    0
## 350  0.4302326 0.5449376 0.5780349 0.5723185 0.6291592 0.6710843    0
## 400  0.4302326 0.5482030 0.5836013 0.5774782 0.6335363 0.6710843    0
## 450  0.4302326 0.5449376 0.5780349 0.5750587 0.6335363 0.6710843    0
## 500  0.4601542 0.5449376 0.5780349 0.5804340 0.6335363 0.6949153    0
## 550  0.4601542 0.5482030 0.5857118 0.5884507 0.6396872 0.6949153    0
## 600  0.4601542 0.5482030 0.5857118 0.5884374 0.6396872 0.7196807    0
## 800  0.4601542 0.5667400 0.5836013 0.5910088 0.6335363 0.7196807    0
## 1000 0.4601542 0.5667400 0.5961590 0.5857446 0.6343666 0.6678832    0
## 2000 0.4601542 0.5482030 0.5961590 0.5862151 0.6440678 0.6656337    0

Masz swój ostateczny model. Możesz trenować losowy las z następującymi parametrami:

  • ntree = 800: 800 drzew zostanie przeszkolonych
  • mtry = 4: 4 cechy kandydackie są losowane przy każdym podziale
  • maxnodes = 24: Każde drzewo jest ograniczone do 24 węzłów końcowych (liści)
fit_rf <- train(survived~.,
    data_train,
    method = "rf",
    metric = "Accuracy",
    tuneGrid = tuneGrid,
    trControl = trControl,
    importance = TRUE,
    nodesize = 14,
    ntree = 800,
    maxnodes = 24)

Krok 5) Oceń model

Karetka biblioteczna posiada funkcję przewidywania.

predict(model, newdata= df)
argument
- `model`: Define the model evaluated before. 
- `newdata`: Define the dataset to make prediction
prediction <-predict(fit_rf, data_test)

Możesz użyć prognozy do obliczenia macierzy zamieszania i sprawdzenia wyniku dokładności

confusionMatrix(prediction, data_test$survived)

Wyjście:

## Confusion Matrix and Statistics
## 
##           Reference
## Prediction  No Yes
##        No  110  32
##        Yes  11  56
##                                          
##                Accuracy : 0.7943         
##                  95% CI : (0.733, 0.8469)
##     No Information Rate : 0.5789         
##     P-Value [Acc > NIR] : 3.959e-11      
##                                          
##                   Kappa : 0.5638         
##  Mcnemar's Test P-Value : 0.002289       
##                                          
##             Sensitivity : 0.9091         
##             Specificity : 0.6364         
##          Pos Pred Value : 0.7746         
##          Neg Pred Value : 0.8358         
##              Prevalence : 0.5789         
##          Detection Rate : 0.5263         
##    Detection Prevalence : 0.6794         
##       Balanced Accuracy : 0.7727         
##                                          
##        'Positive' Class : No             
## 

Model osiąga dokładność 0.7943, czyli 79.43% w niewidocznym zestawie testowym, co jest wartością wyższą niż w konfiguracji domyślnej. Czułość wynosi 0.9091, a swoistość 0.6364, co oznacza, że ​​model rozpoznaje osoby, które nie przeżyły, znacznie skuteczniej niż te, które przeżyły.

Krok 6) Wizualizuj wynik

Na koniec, możesz sprawdzić ważność cech za pomocą funkcji varImp(). Najważniejszymi cechami są płeć i wiek. Nie jest to zaskakujące, ponieważ ważne cechy zazwyczaj pojawiają się bliżej korzenia drzewa, podczas gdy mniej ważne cechy zazwyczaj pojawiają się bliżej liści.

varImp(fit_rf)

Wyjście:

## rf variable importance
## 
##              Importance
## sexmale         100.000
## age              28.014
## pclassMiddle     27.016
## fare             21.557
## pclassUpper      16.324
## sibsp            11.246
## parch             5.522
## embarkedC         4.908
## embarkedQ         1.420
## embarkedS         0.000		

Las losowy w R: szybki przegląd funkcji

Poniższa tabela zawiera listę wszystkich funkcji użytych w sześciu krokach, pakietów, które je dostarczają, oraz oczekiwanych parametrów.

Biblioteka Cel Funkcjonować Parametr
losowy las Utwórz losowy las randomForest() formuła, ntree=n, mtry=FALSE, maxnodes = NULL
wstawka korektorska Utwórz k-krotną walidację krzyżową kontrola pociągu() metoda = „cv”, liczba = n, wyszukiwanie = „siatka”
wstawka korektorska Wytrenuj losowy las pociąg() formuła, df, metoda = „rf”, metryka = „Dokładność”, trControl = trainControl(), tuneGrid = NULL
wstawka korektorska Przewiduj na podstawie próbki przewidzieć model, nowedane=df
wstawka korektorska Matryca zamieszania i statystyki zamieszanieMatrix() model, test
wstawka korektorska Zmienna ważność varImp() model

Dodatek: Modele dostępne w karetce

Funkcja train() obsługuje znacznie więcej niż tylko lasy losowe. Uruchom poniższe polecenie, aby wyświetlić wszystkie identyfikatory modeli obsługiwane przez caret, a następnie przekaż je do argumentu metody.

names(getModelInfo())

Wyjście:

##   [1] "ada"                 "AdaBag"              "AdaBoost.M1"        ##   [4] "adaboost"            "amdai"               "ANFIS"              ##   [7] "avNNet"              "awnb"                "awtan"              ##  [10] "bag"                 "bagEarth"            "bagEarthGCV"        ##  [13] "bagFDA"              "bagFDAGCV"           "bam"                ##  [16] "bartMachine"         "bayesglm"            "binda"              ##  [19] "blackboost"          "blasso"              "blassoAveraged"     ##  [22] "bridge"              "brnn"                "BstLm"              ##  [25] "bstSm"               "bstTree"             "C5.0"               ##  [28] "C5.0Cost"            "C5.0Rules"           "C5.0Tree"           ##  [31] "cforest"             "chaid"               "CSimca"             ##  [34] "ctree"               "ctree2"              "cubist"             ##  [37] "dda"                 "deepboost"           "DENFIS"             ##  [40] "dnn"                 "dwdLinear"           "dwdPoly"            ##  [43] "dwdRadial"           "earth"               "elm"                ##  [46] "enet"                "evtree"              "extraTrees"         ##  [49] "fda"                 "FH.GBML"             "FIR.DM"             ##  [52] "foba"                "FRBCS.CHI"           "FRBCS.W"            ##  [55] "FS.HGD"              "gam"                 "gamboost"           ##  [58] "gamLoess"            "gamSpline"           "gaussprLinear"      ##  [61] "gaussprPoly"         "gaussprRadial"       "gbm_h3o"            ##  [64] "gbm"                 "gcvEarth"            "GFS.FR.MOGUL"       ##  [67] "GFS.GCCL"            "GFS.LT.RS"           "GFS.THRIFT"         ##  [70] "glm.nb"              "glm"                 "glmboost"           ##  [73] "glmnet_h3o"          "glmnet"              "glmStepAIC"         ##  [76] "gpls"                "hda"                 "hdda"               ##  [79] "hdrda"               "HYFIS"               "icr"                ##  [82] "J48"                 "JRip"                "kernelpls"          ##  [85] "kknn"                "knn"                 "krlsPoly"           ##  [88] "krlsRadial"          "lars"                "lars2"              ##  [91] "lasso"               "lda"                 "lda2"               ##  [94] "leapBackward"        "leapForward"         "leapSeq"            ##  [97] "Linda"               "lm"                  "lmStepAIC"          ## [100] "LMT"                 "loclda"              "logicBag"           ## [103] "LogitBoost"          "logreg"              "lssvmLinear"        ## [106] "lssvmPoly"           "lssvmRadial"         "lvq"                ## [109] "M5"                  "M5Rules"             "manb"               ## [112] "mda"                 "Mlda"                "mlp"                ## [115] "mlpKerasDecay"       "mlpKerasDecayCost"   "mlpKerasDropout"    ## [118] "mlpKerasDropoutCost" "mlpML"               "mlpSGD"             ## [121] "mlpWeightDecay"      "mlpWeightDecayML"    "monmlp"             ## [124] "msaenet"             "multinom"            "mxnet"              ## [127] "mxnetAdam"           "naive_bayes"         "nb"                 ## [130] "nbDiscrete"          "nbSearch"            "neuralnet"          ## [133] "nnet"                "nnls"                "nodeHarvest"        ## [136] "null"                "OneR"                "ordinalNet"         ## [139] "ORFlog"              "ORFpls"              "ORFridge"           ## [142] "ORFsvm"              "ownn"                "pam"                ## [145] "parRF"               "PART"                "partDSA"            ## [148] "pcaNNet"             "pcr"                 "pda"                ## [151] "pda2"                "penalized"           "PenalizedLDA"       ## [154] "plr"                 "pls"                 "plsRglm"            ## [157] "polr"                "ppr"                 "PRIM"               ## [160] "protoclass"          "pythonKnnReg"        "qda"                ## [163] "QdaCov"              "qrf"                 "qrnn"               ## [166] "randomGLM"           "ranger"              "rbf"                ## [169] "rbfDDA"              "Rborist"             "rda"                ## [172] "regLogistic"         "relaxo"              "rf"                 ## [175] "rFerns"              "RFlda"               "rfRules"            ## [178] "ridge"               "rlda"                "rlm"                ## [181] "rmda"                "rocc"                "rotationForest"     ## [184] "rotationForestCp"    "rpart"               "rpart1SE"           ## [187] "rpart2"              "rpartCost"           "rpartScore"         ## [190] "rqlasso"             "rqnc"                "RRF"                ## [193] "RRFglobal"           "rrlda"               "RSimca"             ## [196] "rvmLinear"           "rvmPoly"             "rvmRadial"          ## [199] "SBC"                 "sda"                 "sdwd"               ## [202] "simpls"              "SLAVE"               "slda"               ## [205] "smda"                "snn"                 "sparseLDA"          ## [208] "spikeslab"           "spls"                "stepLDA"            ## [211] "stepQDA"             "superpc"             "svmBoundrangeString"## [214] "svmExpoString"       "svmLinear"           "svmLinear2"         ## [217] "svmLinear3"          "svmLinearWeights"    "svmLinearWeights2"  ## [220] "svmPoly"             "svmRadial"           "svmRadialCost"      ## [223] "svmRadialSigma"      "svmRadialWeights"    "svmSpectrumString"  ## [226] "tan"                 "tanSearch"           "treebag"            ## [229] "vbmpRadial"          "vglmAdjCat"          "vglmContRatio"      ## [232] "vglmCumulative"      "widekernelpls"       "WM"                 ## [235] "wsrf"                "xgbLinear"           "xgbTree"            ## [238] "xyf"

FAQ

Zacznij od 500, domyślnej wartości randomForest(). Dokładność zazwyczaj osiąga plateau między 300 a 1000 drzew. Zwiększanie wartości ntree nigdy nie wpływa negatywnie na dokładność, a jedynie na czas wykonania, więc zwiększaj ją, aż krzywa błędu się spłaszczy.

Błąd „out-of-bag” ocenia każdą obserwację, wykorzystując wyłącznie drzewa wytrenowane bez niego. Jest to szybka, obiektywna ocena i często zastępuje walidację krzyżową, chociaż metoda k-krotna pozostaje preferowana przy porównywaniu siatek dostrajających dla identycznych rzędów.

Tak. Podaj odpowiedź numeryczną, a randomForest() uśredni prognozy drzew zamiast głosowania. W karetce, zachowaj metodę = „rf” i zmień argument metryki z Accuracy na RMSE.

Lasy losowe pozostają standardową bazą dla tabelarycznych problemów AI, takich jak rotacja, oszustwa i ocena ryzyka. Zespoły często przeprowadzają testy porównawcze lasu przed wdrożeniem technologii gradient boosting lub sieci neuronowych.

Tak. Asystenci AI mogą tworzyć siatki dostrajające, objaśniać wyniki resamplingu i sugerować sensowne zakresy mtry. Zawsze uruchamiaj ponownie wygenerowany kod z ustalonym ziarnem, aby raportowana dokładność była powtarzalna.

Podsumuj ten post następująco: