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.
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.
- 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).
- 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.
- 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.
- 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
- anakonda: conda install -cr r-caret
- e1071: Biblioteka uczenia maszynowego R.
- anakonda: conda install -cr r-e1071
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"

