Stablo odluke u R - Stablo klasifikacije & Oznaka u R s primjerom

Sadržaj:

Anonim

Što su stabla odlučivanja?

Stabla za odlučivanje svestrani su algoritam strojnog učenja koji može obavljati i klasifikacijske i regresijske zadatke. Oni su vrlo moćni algoritmi, sposobni uklopiti složene skupove podataka. Osim toga, stabla odlučivanja temeljni su sastojci slučajnih šuma, koji su među najsnažnijim algoritmima strojnog učenja koji su danas dostupni.

Obuka i vizualizacija stabala odlučivanja

Da bismo izgradili vaše prvo stablo odluke u primjeru R, postupit ćemo kako slijedi u ovom vodiču za stablo odlučivanja:

  • Korak 1: Uvezite podatke
  • Korak 2: Očistite skup podataka
  • Korak 3: Stvorite vlak / testni set
  • Korak 4: Izradite model
  • Korak 5: Predvidite
  • Korak 6: Izmjerite izvedbu
  • Korak 7: Ugađajte hiper-parametre

Korak 1) Uvezite podatke

Ako vas zanima sudbina titanica, ovaj video možete pogledati na Youtubeu. Svrha ovog skupa podataka je predvidjeti koji će ljudi vjerojatnije preživjeti nakon sudara s ledenim brijegom. Skup podataka sadrži 13 varijabli i 1309 promatranja. Skup podataka poredan je varijablom X.

set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)

Izlaz:

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

Izlaz:

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

Iz izlaza za glavu i rep možete primijetiti da se podaci ne miješaju. Ovo je veliko pitanje! Kada podijelite svoje podatke između vlaka i testnog skupa, odabrat ćete samo putnika iz klase 1 i 2 (nijedan putnik iz klase 3 nije u prvih 80 posto promatranja), što znači da algoritam nikada neće vidjeti značajke putnika klase 3. Ova pogreška će dovesti do lošeg predviđanja.

Da biste prevladali ovaj problem, možete koristiti uzorak funkcije ().

shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)

R-kod stabla odluka Objašnjenje

  • uzorak (1: nrow (titanic)): Generirajte slučajni popis indeksa od 1 do 1309 (tj. maksimalan broj redaka).

Izlaz:

## [1] 288 874 1078 633 887 992 

Ovaj ćete indeks koristiti za miješanje titanskog skupa podataka.

titanic <- titanic[shuffle_index, ]head(titanic)

Izlaz:

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

Korak 2) Očistite skup podataka

Struktura podataka pokazuje da neke varijable imaju NA. Čišćenje podataka vrši se na sljedeći način

  • Ispustite varijable home.dest, kabina, ime, X i karta
  • Stvorite varijable faktora za pclass i preživjeli
  • Ispustite NA
library(dplyr)# Drop variablesclean_titanic <- titanic % > %select(-c(home.dest, cabin, name, X, ticket)) % > %#Convert to factor levelmutate(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)

Objašnjenje koda

  • select (-c (home.dest, kabina, ime, X, karta)): Ispustite nepotrebne varijable
  • pclass = faktor (pclass, razine = c (1,2,3), labels = c ('Gornji', 'Srednji', 'Donji')): Dodajte oznaku varijabli pclass. 1 postaje Gornji, 2 postaje MIddle i 3 postaje niži
  • faktor (preživio, razine = c (0,1), oznake = c ('Ne', 'Da')): Dodajte oznaku preživjeloj varijabli. 1 postaje Ne, a 2 postaje Da
  • na.omit (): Uklonite zapažanja NA

Izlaz:

## Observations: 1,045## Variables: 8## $ pclass  Upper, Lower, Lower, Upper, Middle, Upper, Middle, U… ## $ survived  No, No, No, Yes, No, Yes, Yes, No, No, No, No, No, Y… ## $ sex  male, male, female, female, male, male, female, male… ## $ age  61.0, 42.0, 39.0, 49.0, 29.0, 37.0, 20.0, 54.0, 2.0,… ## $ sibsp  0, 0, 1, 0, 0, 1, 0, 0, 4, 0, 0, 1, 1, 0, 0, 0, 1, 1,… ## $ parch  0, 0, 5, 0, 0, 1, 0, 1, 1, 0, 0, 1, 1, 0, 2, 0, 4, 0,… ## $ fare  32.3208, 7.6500, 31.2750, 25.9292, 10.5000, 52.5542,… ## $ embarked  S, S, S, S, S, S, S, S, S, C, S, S, S, Q, C, S, S, C… 

Korak 3) Stvorite vlak / testni set

Prije nego što obučite svoj model, morate izvršiti dva koraka:

  • Stvorite vlak i testni set: Trenirate model na vlakovnom kompletu i testirate predviđanje na testnom skupu (tj. Nevidljivi podaci)
  • Instalirajte rpart.plot s konzole

Uobičajena je praksa dijeljenje podataka 80/20, 80 posto podataka služi za obuku modela, a 20 posto za predviđanje. Trebate stvoriti dva zasebna okvira podataka. Ne želite dodirivati ​​testni set dok ne završite izradu svog modela. Možete stvoriti ime funkcije create_train_test () koje uzima tri argumenta.

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_rowtrain_sample < - 1: total_rowif (train == TRUE) {return (data[train_sample, ])} else {return (data[-train_sample, ])}}

Objašnjenje koda

  • funkcija (podaci, veličina = 0,8, vlak = ISTINA): dodajte argumente u funkciji
  • n_row = nrow (podaci): Broji broj redaka u skupu podataka
  • total_row = size * n_row: Vratite n-ti red da biste konstruirali vlak
  • train_sample <- 1: total_row: Odaberite prvi red do n-ih redaka
  • if (train == TRUE) {} else {}: Ako se uvjet postavi na true, vratite skup vlakova, inače testni skup.

Možete testirati svoju funkciju i provjeriti dimenziju.

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)

Izlaz:

## [1] 836 8
dim(data_test)

Izlaz:

## [1] 209 8 

Skup vlakova ima 1046 redaka, dok testni skup ima 262 redaka.

Koristite funkciju prop.table () u kombinaciji s tablicom () da biste provjerili je li postupak randomizacije točan.

prop.table(table(data_train$survived))

Izlaz:

#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))

Izlaz:

#### No Yes## 0.5789474 0.4210526

U oba skupa podataka broj preživjelih je jednak, oko 40 posto.

Instalirajte rpart.plot

rpart.plot nije dostupan iz biblioteka conda. Možete ga instalirati s konzole:

install.packages("rpart.plot") 

Korak 4) Izgradite model

Spremni ste za izgradnju modela. Sintaksa funkcije stabla odluka Rpart je:

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

Koristite metodu klase jer predviđate klasu.

library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106

Objašnjenje koda

  • rpart (): Funkcija koja odgovara modelu. Argumenti su:
    • preživjelo ~ .: Formula stabala odluke
    • data = data_train: Skup podataka
    • method = 'class': Uklapa se binarni model
  • rpart.plot (stane, ekstra = 106): Nacrtajte stablo. Dodatne značajke postavljene su na 101 za prikaz vjerojatnosti 2. klase (korisno za binarne odgovore). Više informacija o ostalim mogućnostima možete potražiti u vinjeti.

Izlaz:

Počinjete od korijenskog čvora (dubina 0 preko 3, vrh grafikona):

  1. Na vrhu je ukupna vjerojatnost preživljavanja. Prikazuje udio putnika koji su preživjeli nesreću. Preživio je 41 posto putnika.
  2. Ovaj čvor pita je li spol putnika muški. Ako da, onda se spustite na korijenov lijevi podređeni čvor (dubina 2). 63 posto su muškarci s vjerojatnošću preživljavanja od 21 posto.
  3. U drugom čvoru pitate je li muški putnik stariji od 3,5 godine. Ako je odgovor da, tada je šansa za preživljavanje 19 posto.
  4. Nastavljate dalje tako da biste shvatili koje značajke utječu na vjerojatnost preživljavanja.

Imajte na umu da je jedna od mnogih osobina stabala za odlučivanje da zahtijevaju vrlo malo pripreme podataka. Posebno im nije potrebno skaliranje ili centriranje značajki.

Prema zadanim postavkama funkcija rpart () koristi Ginijevu mjeru nečistoće za razdvajanje note. Što je veći Ginijev koeficijent, to je više različitih slučajeva unutar čvora.

Korak 5) Napravite predviđanje

Možete predvidjeti testni skup podataka. Za predviđanje možete koristiti funkciju predviđanja (). Osnovna sintaksa predviđanja za R stablo odluka je:

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

Na skupu za ispitivanje želite predvidjeti koji će putnici vjerojatnije preživjeti nakon sudara. Znači, među tih 209 putnika znat ćete koji će preživjeti ili ne.

predict_unseen <-predict(fit, data_test, type = 'class')

Objašnjenje koda

  • predviđati (stane, test_ podataka, tip = 'klasa'): Predvidjeti klasu (0/1) testnog skupa

Testiranje putnika koji nije stigao i onih koji jesu.

table_mat <- table(data_test$survived, predict_unseen)table_mat

Objašnjenje koda

  • tablica (data_test $ preživio, predict_unseen): Stvorite tablicu za brojanje koliko je putnika klasificirano kao preživjelih i preminulih u usporedbi s ispravnom klasifikacijom stabla odluka u R

Izlaz:

## predict_unseen## No Yes## No 106 15## Yes 30 58

Model je točno predvidio 106 mrtvih putnika, ali je 15 preživjelih klasificirao kao mrtve. Po analogiji, model je 30 putnika pogrešno klasificirao kao preživjele dok se ispostavilo da su mrtvi.

Korak 6) Izmjerite izvedbu

Možete izračunati mjeru točnosti za zadatak klasifikacije pomoću matrice zbrke :

Zbunjenost matrica je bolji izbor za procjenu uspješnosti klasifikacije. Općenita je ideja računati koliko su puta istinite instance klasificirane kao Lažne.

Svaki redak u matrici zabune predstavlja stvarni cilj, dok svaki stupac predstavlja predviđeni cilj. Prvi red ove matrice razmatra mrtve putnike (klasa False): 106 je ispravno klasificirano kao mrtvo ( istina negativno ), dok je preostalo pogrešno klasificirano kao preživjelo ( lažno pozitivno ). Drugi red uzima u obzir preživjele, pozitivna klasa bila je 58 ( istina pozitivna ), dok je istinito negativna bila 30.

Test točnosti možete izračunati iz matrice zbrke:

To je udio istinito pozitivnih i istinito negativnih u zbroju matrice. Pomoću R možete kodirati kako slijedi:

accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)

Objašnjenje koda

  • zbroj (diag (table_mat)): zbroj dijagonale
  • zbroj (table_mat): Zbroj matrice.

Možete ispisati točnost testnog skupa:

print(paste('Accuracy for test', accuracy_Test))

Izlaz:

## [1] "Accuracy for test 0.784688995215311" 

Za testni set imate ocjenu 78 posto. Istu vježbu možete ponoviti s nizom podataka o treningu.

Korak 7) Ugodite hiper-parametre

Stablo odluke u R ima razne parametre koji kontroliraju aspekte uklapanja. U biblioteci stabla odluka rpart možete kontrolirati parametre pomoću funkcije rpart.control (). U sljedećem kodu uvodite parametre koje ćete podesiti. Za ostale parametre možete se obratiti vinjeti.

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 the final note i.e. the leaf-maxdepth: Set the maximum depth of any node of the final tree. The root node is treated a depth 0

Nastavit ćemo kako slijedi:

  • Konstruirajte funkciju za povrat točnosti
  • Podesite maksimalnu dubinu
  • Ugodite minimalni broj uzorka koji čvor mora imati da bi se mogao podijeliti
  • Podesite minimalni broj uzorka koji mora imati čvor lista

Možete napisati funkciju za prikaz točnosti. Jednostavno umotate kod koji ste koristili prije:

  1. predvidjeti: predict_unseen <- predvidjeti (stane, test_ podataka, tip = 'klasa')
  2. Izrada tablice: table_mat <- tablica (test_datoteka $ preživio, predvidjeti_nevidljivo)
  3. Izračunajte točnost: točnost_Test <- zbroj (diag (table_mat)) / zbroj (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}

Možete pokušati podesiti parametre i provjeriti možete li poboljšati model u odnosu na zadanu vrijednost. Podsjećanja radi, trebate dobiti točnost veću od 0,78

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)

Izlaz:

## [1] 0.7990431 

Sa sljedećim parametrom:

minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0 

Dobivate veće performanse od prethodnog modela. Svaka čast!

Sažetak

Možemo sažeti funkcije za treniranje algoritma stabla odluka u R

Knjižnica

Cilj

funkcija

razred

parametri

pojedinosti

rpart

Stablo klasifikacije vlakova u R

rpart ()

razred

formula, df, metoda

rpart

Stablo regresije vlakova

rpart ()

anova

formula, df, metoda

rpart

Ucrtajte stabla

rpart.plot ()

ugrađeni model

baza

predvidjeti

predvidjeti()

razred

ugrađeni model, tip

baza

predvidjeti

predvidjeti()

prob

ugrađeni model, tip

baza

predvidjeti

predvidjeti()

vektor

ugrađeni model, tip

rpart

Kontrolni parametri

rpart.control ()

minsplit

Postavite minimalni broj promatranja u čvoru prije nego što algoritam izvede podjelu

minbucket

U zadnjoj bilješci, tj. Listu, postavite minimalni broj opažanja

maksimalna dubina

Postavite maksimalnu dubinu bilo kojeg čvora završnog stabla. Korijenski čvor tretira se dubinom 0

rpart

Model vlaka s upravljačkim parametrom

rpart ()

formula, df, metoda, kontrola

Napomena: Obučite model na podacima treninga i testirajte izvedbu na neviđenom skupu podataka, tj. Testnom skupu.