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.

  • 🌳 Definicja podstawowa: Drzewo rekurencyjnie partycjonuje przestrzeĹ„ predykcyjnÄ…, wybierajÄ…c w kaĹĽdym węźle podziaĹ‚ najbardziej redukujÄ…cy zanieczyszczenie klas.
  • 🔄 Przygotowywanie danych: PrzeprowadĹş analizÄ™ uporzÄ…dkowanego pliku Titanica za pomocÄ… sample(), usuĹ„ kolumny identyfikatorĂłw, przekonwertuj współczynniki, a nastÄ™pnie usuĹ„ wiersze NA.
  • 🛠️. SkĹ‚adnia modelu: WywoĹ‚aj rpart(survived~., data = data_train, method = 'class') i wygeneruj wynik za pomocÄ… rpart.plot(fit, extra = 106).
  • ⚙️ Strojenie: rpart.control() udostÄ™pnia minsplit, minbucket, maxdepth i cp, podnoszÄ…c dokĹ‚adność do 79.90 procent.
  • 📊 Ocena: Zbuduj macierz pomyĹ‚ek za pomocÄ… funkcji table(), a nastÄ™pnie podziel przekÄ…tnÄ… przez sumÄ™, aby uzyskać dokĹ‚adność testu na poziomie 78.47 procent.

Drzewo decyzyjne w R

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:

  1. Oceń każdy podział kandydatów. Dla każdego predyktora i punktu odcięcia zmierz, jak bardzo zanieczyszczone będą dwie powstałe grupy.
  2. Zachowaj najlepszy. Podział, który najbardziej redukuje zanieczyszczenia, staje się pytaniem zadawanym w tym węźle.
  3. Powtórz dla każdego dziecka dopóki reguła sterująca tego nie zatrzyma: minsplit, minbucket, maxdepth lub cp.
  4. 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:

 Zbuduj model drzew decyzyjnych w R

Zaczynamy od węzła głównego, na górze grafu i na głębokości 0 z 3:

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Zmierz wydajność drzew decyzyjnych w R

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:

Zmierz wydajność drzew decyzyjnych w R

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:

  1. przewidywać: przewidywać_unseen <- przewidywać(fit, data_test, type = 'class')
  2. UtwĂłrz tabelÄ™: table_mat <- table(data_test$survived, przewidywanie_unseen)
  3. 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.

FAQ

Zarówno klasyfikacja, jak i drzewa regresji są dopasowane. rpart() implementuje CART ze wbudowaną funkcją przycinania z walidacją krzyżową za pomocą cp i łączy się z rpart.plot, aby tworzyć przejrzyste diagramy, co czyni je częściej wybieranym wyborem.

Parametr cp określa minimalną poprawę, jaką podział musi zapewnić, aby został utrzymany. Większe wartości są agresywnie przycinane i generują mniejsze drzewa. Użyj funkcji printcp() i plotcp(), aby znaleźć wartość o najniższym błędzie walidacji krzyżowej.

Tak. Funkcja rpart() używa podziałów zastępczych do kierowania obserwacji z brakującymi predyktorami do najbardziej podobnej gałęzi. W tym samouczku zamiast tego wywoływana jest funkcja na.omit(), wyłącznie po to, aby zachować prostotę przykładowego zbioru danych.

Drzewa decyzyjne napędzają wyjaśnialną sztuczną inteligencję w sektorze kredytowym, ubezpieczeniowym i opieki zdrowotnej, gdzie regulator może żądać dokładnego uzasadnienia decyzji. Stanowią one również bazę dla modeli gradient boosting i lasów losowych.

Tak. Asystenci AI mogą tłumaczyć reguły podziału na prosty język, sugerować wartości cp do przetestowania i sygnalizować przeuczenie w wynikach printcp(). Przed podjęciem działań sprawdź każdą sugestię pod kątem własnych wyników walidacji krzyżowej.

Podsumuj ten post następująco: