Drzewo decyzyjne w R: Drzewo klasyfikacyjne z przykładem
⚡ Inteligentne podsumowanie
Drzewa decyzyjne w R dzielą dane na gałęzie za pomocą prostych reguł „tak” lub „nie”, aż do momentu, gdy każdy liść będzie zawierał jedną dominującą klasę. Ten przewodnik buduje, kreśli, ocenia i dostraja drzewo klasyfikacji rpart na zbiorze danych o przetrwaniu Titanica.

Czym sÄ… drzewa decyzyjne?
Drzewa decyzyjne To wszechstronny algorytm uczenia maszynowego, który może wykonywać zarówno zadania klasyfikacyjne, jak i regresyjne. To bardzo wydajne algorytmy, zdolne do analizowania złożonych zbiorów danych. Ponadto drzewa decyzyjne są podstawowymi składnikami lasów losowych, które należą do najpotężniejszych dostępnych obecnie algorytmów uczenia maszynowego.
Zanim utworzysz drzewo w kodzie, warto dowiedzieć się, w jaki sposób decyduje, gdzie się podzielić.
Jak działa drzewo decyzyjne?
Drzewo decyzyjne przekształca zbiór danych w schemat blokowy pytań typu „tak” lub „nie” zbudowany z trzech rodzajów węzłów: korzeń przeprowadza każdą obserwację szkoleniową, węzeł wewnętrzny zadaje pytanie o jeden predyktor i dzieli dane na dwie części, a liść zatrzymuje podział i zwraca klasę większościową.
Wzrost następuje zgodnie z chciwą procedurą zwaną rekurencyjne partycjonowanie binarne:
- Oceń każdy podział kandydatów. Dla każdego predyktora i punktu odcięcia zmierz, jak bardzo zanieczyszczone będą dwie powstałe grupy.
- Zachowaj najlepszy. Podział, który najbardziej redukuje zanieczyszczenia, staje się pytaniem zadawanym w tym węźle.
- Powtórz dla każdego dziecka dopóki reguła sterująca tego nie zatrzyma: minsplit, minbucket, maxdepth lub cp.
- Suszona śliwka. Następnie cp przycina gałęzie, które nie przynoszą zysków, co uniemożliwia drzewu zapamiętanie zestawu treningowego.
PoniewaĹĽ kaĹĽde pytanie porĂłwnuje jednÄ… zmiennÄ… z progiem, algorytm nie wymaga nigdy skalowania ani kodowania pozornego.
WskaĹşnik Giniego a entropia w drzewach decyzyjnych
Stopień zanieczyszczenia można mierzyć na dwa sposoby, a rpart pozwala na wybór.
| kryteria | Indeks Giniego | Entropia (zysk informacji) |
|---|---|---|
| Formuła | 1 – suma kwadratów proporcji klasowych | -suma p razy log2(p) |
| Zasięg (dwie klasy) | 0 do 0.5 | 0 do 1 |
| Obliczenie | Szybciej, bez logarytmu | Wolniejszy, uĹĽywa logarytmĂłw |
| ustawienie rpart | Domyślnie | parametry = lista(podział = „informacje”) |
fit_entropy <- rpart(survived~., data = data_train, method = 'class', parms = list(split = "information"))
W praktyce oba kryteria najczęściej wybierają ten sam podział, więc domyślny indeks Giniego jest bezpiecznym wyborem.
Zalety i wady drzew decyzyjnych
Kompromisy wskazują, kiedy wystarczy pojedyncze drzewo, a kiedy należy przejść na zespół.
Zalety
- W pełni interpretowalne: dopasowany model to diagram, który może odczytać każda zainteresowana strona.
- Minimalne przetwarzanie wstępne: nie jest wymagane żadne skalowanie ani normalizacja, a czynniki działają natywnie.
- Zajmuje siÄ™ obydwoma zadaniami: metoda = 'class' dopasowuje klasyfikator, a metoda = 'anova' dopasowuje drzewo regresji.
- Szybko do wyszkolenia: duĹĽe zbiory danych mieszczÄ… siÄ™ w ciÄ…gu kilku sekund, dlatego drzewa stanowiÄ… przydatnÄ… pierwszÄ… liniÄ™ bazowÄ….
Wady
- Wysoka wariancja: niewielka zmiana danych treningowych może skutkować zupełnie innym drzewem.
- Skłonność do nadmiernego dopasowania: Nieograniczone drzewo rośnie, aż każdy liść będzie czysty, chyba że cp i maxdepth je ograniczą.
- Tylko podziały równoległe do osi: granice ukośne wymagają wielu cięć w kształcie schodów.
Rozwiązaniem pierwszych dwóch słabości jest uśrednianie wielu drzew, co jest losowy las robi.
Jak trenować i wizualizować drzewo decyzyjne w R
Aby zbudować swoje pierwsze drzewo decyzyjne w R, przejdziesz przez siedem kroków:
- Krok 1: Zaimportuj dane
- Krok 2: Wyczyść zbiór danych
- Krok 3: UtwĂłrz zestaw pociÄ…gowy/testowy
- Krok 4: Zbuduj model
- Krok 5: Przewiduj
- Krok 6: Zmierz wydajność
- Krok 7: Dostosuj hiperparametry
Krok 1) Zaimportuj dane
Jeśli ciekawi Cię los Titanica, możesz obejrzeć ten film na YouTube. Celem tego zbioru danych jest przewidzenie, którzy ludzie mają większe szanse na przeżycie po zderzeniu z górą lodową. Zbiór danych zawiera 13 zmiennych i 1309 obserwacji. Zbiór danych jest uporządkowany według zmiennej X.
set.seed(678) path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv' titanic <-read.csv(path) head(titanic)
Wyjście:
## X pclass survived name sex ## 1 1 1 1 Allen, Miss. Elisabeth Walton female ## 2 2 1 1 Allison, Master. Hudson Trevor male ## 3 3 1 0 Allison, Miss. Helen Loraine female ## 4 4 1 0 Allison, Mr. Hudson Joshua Creighton male ## 5 5 1 0 Allison, Mrs. Hudson J C (Bessie Waldo Daniels) female ## 6 6 1 1 Anderson, Mr. Harry male ## age sibsp parch ticket fare cabin embarked ## 1 29.0000 0 0 24160 211.3375 B5 S ## 2 0.9167 1 2 113781 151.5500 C22 C26 S ## 3 2.0000 1 2 113781 151.5500 C22 C26 S ## 4 30.0000 1 2 113781 151.5500 C22 C26 S ## 5 25.0000 1 2 113781 151.5500 C22 C26 S ## 6 48.0000 0 0 19952 26.5500 E12 S ## home.dest ## 1 St Louis, MO ## 2 Montreal, PQ / Chesterville, ON ## 3 Montreal, PQ / Chesterville, ON ## 4 Montreal, PQ / Chesterville, ON ## 5 Montreal, PQ / Chesterville, ON ## 6 New York, NY
tail(titanic)
Wyjście:
## X pclass survived name sex age sibsp ## 1304 1304 3 0 Yousseff, Mr. Gerious male NA 0 ## 1305 1305 3 0 Zabour, Miss. Hileni female 14.5 1 ## 1306 1306 3 0 Zabour, Miss. Thamine female NA 1 ## 1307 1307 3 0 Zakarian, Mr. Mapriededer male 26.5 0 ## 1308 1308 3 0 Zakarian, Mr. Ortin male 27.0 0 ## 1309 1309 3 0 Zimmerman, Mr. Leo male 29.0 0 ## parch ticket fare cabin embarked home.dest ## 1304 0 2627 14.4583 C ## 1305 0 2665 14.4542 C ## 1306 0 2665 14.4542 C ## 1307 0 2656 7.2250 C ## 1308 0 2670 7.2250 C ## 1309 0 315082 7.8750 S
Na podstawie danych wyjściowych typu „head and tail” można zauważyć, że dane nie są tasowane. To duży problem! Kiedy podzielisz dane pomiędzy zestawem pociągowym i zestawem testowym, dokonasz wyboru tylko pasażera z klasy 1 i 2 (żaden pasażer z klasy 3 nie znajduje się w górnych 80 procentach obserwacji), co oznacza, że ​​algorytm nigdy nie dostrzeże cech pasażera klasy 3. Ten błąd będzie skutkować słabą predykcją.
Aby rozwiązać ten problem, możesz użyć funkcji sample().
shuffle_index <- sample(1:nrow(titanic)) head(shuffle_index)
Drzewo decyzyjne Kod R Wyjaśnienie
- sample(1:nrow(titanic)): Wygeneruj losowÄ… listÄ™ indeksĂłw od 1 do 1309 (tzn. maksymalnÄ… liczbÄ™ wierszy).
Wyjście:
## [1] 288 874 1078 633 887 992
UĹĽyjesz tego indeksu do przetasowania zbioru danych Titanica.
titanic <- titanic[shuffle_index, ]
head(titanic)
Wyjście:
## X pclass survived ## 288 288 1 0 ## 874 874 3 0 ## 1078 1078 3 1 ## 633 633 3 0 ## 887 887 3 1 ## 992 992 3 1 ## name sex age ## 288 Sutton, Mr. Frederick male 61 ## 874 Humblen, Mr. Adolf Mathias Nicolai Olsen male 42 ## 1078 O'Driscoll, Miss. Bridget female NA ## 633 Andersson, Mrs. Anders Johan (Alfrida Konstantia Brogren) female 39 ## 887 Jermyn, Miss. Annie female NA ## 992 Mamee, Mr. Hanna male NA ## sibsp parch ticket fare cabin embarked home.dest## 288 0 0 36963 32.3208 D50 S Haddenfield, NJ ## 874 0 0 348121 7.6500 F G63 S ## 1078 0 0 14311 7.7500 Q ## 633 1 5 347082 31.2750 S Sweden Winnipeg, MN ## 887 0 0 14313 7.7500 Q ## 992 0 0 2677 7.2292 C
Krok 2) Wyczyść zbiór danych
Kilka zmiennych zawiera wartości NA. Czyszczenie przebiega w trzech etapach:
- Usuń zmienne home.dest, cabin, name, X i ticket
- UtwĂłrz zmienne czynnikowe dla pclass i przetrwaj
- Porzuć NA
library(dplyr) # Drop variables clean_titanic <- titanic %>% select(-c(home.dest, cabin, name, X, ticket)) %>% #Convert to factor level mutate(pclass = factor(pclass, levels = c(1, 2, 3), labels = c('Upper', 'Middle', 'Lower')), survived = factor(survived, levels = c(0, 1), labels = c('No', 'Yes'))) %>% na.omit() glimpse(clean_titanic)
Code Wyjaśnienie
- wybierz(-c(home.dest, kabina, nazwa, X, bilet)): Usuń niepotrzebne zmienne
- pclass = factor(pclass, levels = c(1,2,3), labels= c('GĂłrny', 'Ĺšrodkowy', 'Dolny')): Dodaj etykietÄ™ do zmiennej pclass. 1 staje siÄ™ GĂłrny, 2 staje siÄ™ Ĺšrodkowy, a 3 staje siÄ™ Dolny
- factor(survived, levels = c(0,1), labels = c('No', 'Yes')): Dodaj etykiety do zmiennej survive. 0 staje siÄ™ Nie, a 1 staje siÄ™ Tak
- na.omit(): Usuń obserwacje NA
Wyjście:
## Observations: 1,045 ## Variables: 8 ## $ pclass <fctr> Upper, Lower, Lower, Upper, Middle, Upper, Middle, U... ## $ survived <fctr> No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y... ## $ sex <fctr> male, male, female, female, male, male, female, male... ## $ age <dbl> 61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0, ... ## $ sibsp <int> 0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,... ## $ parch <int> 0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,... ## $ fare <dbl> 32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542, ... ## $ embarked <fctr> S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C...
Krok 3) UtwĂłrz zestaw pociÄ…gowy/testowy
Zanim wytrenujesz swój model, musisz wykonać dwa kroki:
- UtwĂłrz zestaw pociÄ…gowy i testowy: Trenujesz model na zestawie pociÄ…gowym i testujesz predykcjÄ™ na zestawie testowym (tj. Niewidoczne dane)
- Zainstaluj rpart.plot z konsoli
Powszechną praktyką jest dzielenie danych w stosunku 80/20, przy czym 80 procent danych służy do uczenia modelu, a 20 procent do tworzenia prognoz. Musisz utworzyć dwie oddzielne ramki danych. Nie chcesz dotykać zestawu testowego, dopóki nie zakończysz budowania modelu. Możesz utworzyć funkcję o nazwie create_train_test(), która przyjmuje trzy argumenty.
create_train_test(df, size = 0.8, train = TRUE) arguments: -df: Dataset used to train the model. -size: Size of the split. By default, 0.8. Numerical value -train: If set to `TRUE`, the function creates the train set, otherwise the test set. Default value sets to `TRUE`. Boolean value.You need to add a Boolean parameter because R does not allow to return two data frames simultaneously.
create_train_test <- function(data, size = 0.8, train = TRUE) { n_row = nrow(data) total_row = size * n_row train_sample <- 1: total_row if (train == TRUE) { return (data[train_sample, ]) } else { return (data[-train_sample, ]) } }
Code Wyjaśnienie
- funkcja(dane, rozmiar=0.8, pociÄ…g = TRUE): Dodaj argumenty funkcji
- n_row = nrow(data): Zlicz liczbÄ™ wierszy w zbiorze danych
- total_row = size*n_row: Zwróć n-ty wiersz, aby skonstruować zestaw
- train_sample <- 1:total_row: Wybierz pierwszy do n-tych wierszy
- if (train ==TRUE){ } else { }: Jeśli warunek ma wartość true, zwróć zestaw pociągowy, w przeciwnym razie zestaw testowy.
Możesz przetestować swoją funkcję i sprawdzić wymiar.
data_train <- create_train_test(clean_titanic, 0.8, train = TRUE) data_test <- create_train_test(clean_titanic, 0.8, train = FALSE) dim(data_train)
Wyjście:
## [1] 836 8
dim(data_test)
Wyjście:
## [1] 209 8
ZbiĂłr danych dotyczÄ…cych pociÄ…gu ma 836 wierszy i 8 kolumn, natomiast zbiĂłr danych testowych ma 209 wierszy i takie same 8 kolumn.
Używasz funkcji prop.table() w połączeniu z table() w celu sprawdzenia, czy proces randomizacji jest prawidłowy.
prop.table(table(data_train$survived))
Wyjście:
## ## No Yes ## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Wyjście:
## ## No Yes ## 0.5789474 0.4210526
W obu zbiorach danych liczba ocalałych jest taka sama i wynosi około 40 procent.
Zainstaluj rpart.plot
Plik rpart.plot nie jest dostępny w bibliotekach Conda. Możesz zainstalować go z konsoli:
install.packages("rpart.plot")
Krok 4) Zbuduj model
Jesteś gotowy do zbudowania modelu. Składnia funkcji drzewa decyzyjnego rpart() jest następująca:
rpart(formula, data=, method='') arguments: - formula: The function to predict - data: Specifies the data frame - method: - "class" for a classification tree - "anova" for a regression tree
UĹĽywasz metody klasowej, poniewaĹĽ przewidujesz klasÄ™.
library(rpart) library(rpart.plot) fit <- rpart(survived~., data = data_train, method = 'class') rpart.plot(fit, extra = 106)
Code Wyjaśnienie
- rpart(): Funkcja dopasowująca się do modelu. Argumenty są następujące:
- przetrwał ~.: Formuła drzew decyzyjnych
- dane = data_train: ZbiĂłr danych
- metoda = „klasa”: Dopasuj model binarny
- rpart.plot(fit, extra= 106): Wykreśl drzewo. Argument extra jest ustawiony na 106, co oznacza prawdopodobieństwo drugiej klasy plus procent obserwacji w każdym węźle. Możesz odwołać się do winieta aby uzyskać więcej informacji na temat innych opcji.
Wyjście:
Zaczynamy od węzła głównego, na górze grafu i na głębokości 0 z 3:
- Na górze jest to ogólne prawdopodobieństwo przeżycia. Pokazuje odsetek pasażerów, którzy przeżyli katastrofę. 41 procent pasażerów przeżyło.
- Ten węzeł pyta, czy pasażer jest płci męskiej. Jeśli tak, przechodzimy do lewego potomka korzenia (głębokość 1). 63 procent to mężczyźni z prawdopodobieństwem przeżycia 21 procent.
- W drugim węźle pytasz, czy pasażer płci męskiej ma więcej niż 3.5 roku. Jeśli tak, to szansa na przeżycie wynosi 19 procent.
- Kontynuuj w ten sposób, aby zrozumieć, jakie cechy wpływają na prawdopodobieństwo przeżycia.
Należy pamiętać, że jedną z wielu zalet drzew decyzyjnych jest to, że wymagają one bardzo niewielkiego przygotowania danych. W szczególności nie wymagają skalowania ani centrowania funkcji.
Domyślnie funkcja rpart() używa Gini Miara zanieczyszczenia do wyboru każdego podziału. Im wyższa wartość Giniego, tym bardziej zmieszane są klasy w danym węźle, więc algorytm zawsze wybiera podział, który obniża wartość najbardziej.
Krok 5) Przewiduj
Możesz przewidzieć swój testowy zbiór danych. Aby dokonać przewidywania, możesz użyć funkcji przewidywania(). Podstawowa składnia drzewa decyzyjnego przewidywania dla R jest następująca:
predict(fitted_model, df, type = 'class') arguments: - fitted_model: This is the object stored after model estimation. - df: Data frame used to make the prediction - type: Type of prediction - 'class': for classification - 'prob': to compute the probability of each class - 'vector': Predict the mean response at the node level
Teraz możesz przewidzieć, czy model przewiduje, że każdy z 209 pasażerów biorących udział w teście przeżyje zderzenie.
predict_unseen <-predict(fit, data_test, type = 'class')
Code Wyjaśnienie
- przewidywanie(fit, data_test, type = 'class'): Przewiduj klasÄ™ (0/1) zbioru testowego
PorĂłwnaj teraz przewidywane klasy z rzeczywistymi wynikami.
table_mat <- table(data_test$survived, predict_unseen)
table_mat
Code Wyjaśnienie
- table(data_test$survived, predict_unseen): Zbuduj tabelÄ™ kontyngencji przewidywanych klas na podstawie prawdziwego wyniku
Wyjście:
## predict_unseen ## No Yes ## No 106 15 ## Yes 30 58
Wiersze to wartości rzeczywiste, kolumny to prognozy. Model poprawnie zidentyfikował 106 osób, które nie przeżyły, i 58 osób, które przeżyły, ale oznaczył 15 osób, które nie przeżyły, jako osoby, które przeżyły, a 30 osób, które przeżyły, jako zmarłe.
Krok 6) Zmierz wydajność
Możesz obliczyć miarę dokładności dla zadania klasyfikacji za pomocą matryca zamieszania:
matryca zamieszania jest lepszym wyborem do oceny skuteczności klasyfikacji. Ogólna koncepcja polega na tym, aby policzyć, ile razy prawdziwe przypadki zostały sklasyfikowane jako fałszywe.
Każdy wiersz w macierzy pomyłek reprezentuje rzeczywisty cel, a każda kolumna – przewidywany cel. Pierwszy wiersz tej macierzy uwzględnia pasażerów, którzy zmarli (klasa negatywna): 106 zostało prawidłowo sklasyfikowanych jako zmarli (Prawdziwy negatyw), podczas gdy 15 błędnie zaklasyfikowano jako osoby, które przeżyły (Fałszywie pozytywne). W drugim rzędzie mowa o ocalałych: 58 osób zostało prawidłowo zidentyfikowanych (Prawdziwie pozytywne), podczas gdy 30 zostało pominiętych (Fałszywie negatywny).
Można obliczyć próba dokładności z macierzy zamieszania:
Jest to proporcja prawdziwie dodatniego i prawdziwie ujemnego w sumie macierzy. Za pomocą R możesz kodować w następujący sposób:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Code Wyjaśnienie
- sum(diag(table_mat)): Suma przekÄ…tnej
- sum(table_mat): Suma macierzy.
Możesz wydrukować dokładność zbioru testowego:
print(paste('Accuracy for test', accuracy_Test))
Wyjście:
## [1] "Accuracy for test 0.784688995215311"
Dokładność w zbiorze testowym wynosi 0.7847, czyli 78.47%. Powtórz ćwiczenie na zbiorze treningowym, aby sprawdzić, jak bardzo model się przeukłada.
Krok 7) Dostosuj hiperparametry
Drzewo decyzyjne w R ma różne parametry, które kontrolują aspekty dopasowania. W bibliotece drzewa decyzyjnego rpart możesz kontrolować parametry za pomocą funkcji rpart.control(). W poniższym kodzie wprowadzasz parametry, które będziesz dostrajać. Możesz odwołać się do winieta dla innych parametrów.
rpart.control(minsplit = 20, minbucket = round(minsplit/3), maxdepth = 30) Arguments: -minsplit: Set the minimum number of observations in the node before the algorithm perform a split -minbucket: Set the minimum number of observations in a terminal node, i.e. the leaf -maxdepth: Set the maximum depth of any node of the final tree. The root node is treated as depth 0
Postępujemy następująco:
- Skonstruuj funkcję zwracającą dokładność
- Dostrój maksymalną głębokość
- Dostosuj minimalną liczbę próbek, jaką musi mieć węzeł, zanim będzie mógł się podzielić
- Dostosuj minimalną liczbę próbek, jaką musi mieć węzeł liścia
Można napisać funkcję wyświetlającą dokładność. Po prostu zawiń kod, którego użyłeś wcześniej:
- przewidywać: przewidywać_unseen <- przewidywać(fit, data_test, type = 'class')
- UtwĂłrz tabelÄ™: table_mat <- table(data_test$survived, przewidywanie_unseen)
- Dokładność obliczeń: dokładność_Test <- sum(diag(table_mat))/sum(table_mat)
accuracy_tune <- function(fit) { predict_unseen <- predict(fit, data_test, type = 'class') table_mat <- table(data_test$survived, predict_unseen) accuracy_Test <- sum(diag(table_mat)) / sum(table_mat) accuracy_Test }
Teraz dostosuj parametry i sprawdź, czy możesz poprawić domyślny model. Przypominamy, że musisz osiągnąć dokładność 0.7847.
control <- rpart.control(minsplit = 4,
minbucket = round(5 / 3),
maxdepth = 3,
cp = 0)
tune_fit <- rpart(survived~., data = data_train, method = 'class', control = control)
accuracy_tune(tune_fit)
Wyjście:
## [1] 0.7990431
Z następującym parametrem:
minsplit = 4
minbucket = round(5/3)
maxdepth = 3
cp = 0
Dokładność wzrasta z 0.7847 do 0.7990, co oznacza, że ​​dostrojone drzewo przewyższa domyślną konfigurację o około 1.4 punktu procentowego.
Drzewa decyzyjne w R: szybki przeglÄ…d funkcji
W poniĹĽszej tabeli wymieniono wszystkie funkcje uĹĽywane w siedmiu powyĹĽszych krokach, wraz z pakietem, ktĂłry je dostarcza, oraz oczekiwanymi parametrami. R.
| Biblioteka | Cel | Funkcjonować | Klasa | Parametry | Szczegóły |
|---|---|---|---|---|---|
| część | Drzewo klasyfikacji pociągów w R | rpart() | klasa | formuła, df, metoda | |
| część | Drzewo regresji pociągu | rpart() | anowa | formuła, df, metoda | |
| część | Narysuj drzewa | rpart.plot() | dopasowany model | ||
| baza | przewidzieć | przepowiadać, wywróżyć() | klasa | dopasowany model, typ | |
| baza | przewidzieć | przepowiadać, wywróżyć() | prawd | dopasowany model, typ | |
| baza | przewidzieć | przepowiadać, wywróżyć() | wektor | dopasowany model, typ | |
| część | Parametry dotyczące kontroli | rpart.control() | podział minut | Ustaw minimalną liczbę obserwacji w węźle, zanim algorytm wykona podział | |
| minbucket | Ustaw minimalną liczbę obserwacji w węźle końcowym, czyli liściu | ||||
| maksymalna głębokość | Ustaw maksymalną głębokość dowolnego węzła w drzewie końcowym. Węzeł główny jest traktowany jako o głębokości 0. | ||||
| część | Model pociągu z parametrem kontrolnym | rpart() | formuła, df, metoda, kontrola |
Uwaga: trenuj model na danych szkoleniowych i przetestuj wydajność na niewidocznym zestawie danych, tj. zestawie testowym.



