Rozhodovací strom v R - Klasifikačný strom & Kód v R s príkladom

Obsah:

Anonim

Čo sú rozhodovacie stromy?

Rozhodovacie stromy sú všestranný algoritmus strojového učenia, ktorý umožňuje vykonávanie úloh klasifikácie aj regresie. Sú to veľmi výkonné algoritmy schopné prispôsobiť zložité súbory údajov. Okrem toho sú rozhodovacie stromy základnou súčasťou náhodných lesov, ktoré patria medzi najsilnejšie algoritmy strojového učenia, aké sú dnes k dispozícii.

Školenie a vizualizácia rozhodovacích stromov

Ak chcete zostaviť svoj prvý rozhodovací strom v príklade R, budeme postupovať nasledovne v tomto návode na rozhodovací strom:

  • Krok 1: Importujte údaje
  • Krok 2: Vyčistite množinu údajov
  • Krok 3: Vytvorte vlak / testovaciu súpravu
  • Krok 4: Zostavte model
  • Krok 5: Vytvorte predpoveď
  • Krok 6: Merajte výkon
  • Krok 7: Nalaďte hyperparametre

Krok 1) Importujte údaje

Ak ste zvedaví na osud titanicu, môžete si toto video pozrieť na Youtube. Účelom tohto súboru údajov je predpovedať, u ktorých je pravdepodobnejšie, že ľudia prežijú po zrážke s ľadovcom. Dataset obsahuje 13 premenných a 1309 pozorovaní. Dataset je zoradený podľa premennej X.

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

Výkon:

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

Výkon:

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

Z výstupu hlavy a chvosta si môžete všimnúť, že údaje nie sú zamiešané. Toto je veľký problém! Keď rozdelíte svoje údaje medzi vlakovú súpravu a skúšobnú súpravu, vyberiete iba cestujúceho z triedy 1 a 2 (žiadny cestujúci z triedy 3 nie je v horných 80 percentách pozorovaní), čo znamená, že algoritmus nikdy neuvidí vlastnosti cestujúceho triedy 3. Táto chyba povedie k zlej predikcii.

Na prekonanie tohto problému môžete použiť funkciu sample ().

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

Rozhodovací strom R kód Vysvetlenie

  • sample (1: nrow (titanic)): Vytvorte náhodný zoznam indexov od 1 do 1309 (tj maximálny počet riadkov).

Výkon:

## [1] 288 874 1078 633 887 992 

Tento index použijete na zamiešanie titánskej množiny údajov.

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

Výkon:

## 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) Vyčistite množinu údajov

Štruktúra údajov ukazuje, že niektoré premenné majú NA. Vyčistenie údajov sa vykonáva nasledujúcim spôsobom

  • Presuňte premenné home.dest, kabína, meno, X a lístok
  • Vytvorte faktorové premenné pre pclass a prežili
  • Odhoďte 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)

Vysvetlenie kódu

  • select (-c (home.dest, cabin, name, X, ticket)): Zrušiť nepotrebné premenné
  • pclass = factor (pclass, levels = c (1,2,3), labels = c ('Upper', 'Middle', 'Lower')): Pridajte štítok do premennej pclass. 1 sa stáva horným, 2 sa stáva stredným a 3 sa stáva nižším
  • faktor (prežil, úrovne = c (0,1), štítky = c ('nie', 'áno')): Pridajte štítok k premennej prežil. 1 sa stáva Nie a 2 sa stáva Áno
  • na.omit (): Odstráni pozorovania NA

Výkon:

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

Krok 3) Vytvorte vlak / testovaciu súpravu

Pred trénovaním modelu musíte vykonať dva kroky:

  • Vytvorte vlak a testovaciu súpravu: Trénujete model na vlakovej súprave a testujete predpoveď na testovacej súprave (tj neviditeľné údaje).
  • Nainštalujte si rpart.plot z konzoly

Bežnou praxou je rozdelenie údajov na 80/20, 80 percent údajov slúži na trénovanie modelu a 20 percent na predpovedanie. Musíte vytvoriť dva samostatné dátové rámce. Nechcete sa dotknúť testovacej súpravy, kým nedokončíte zostavovanie modelu. Môžete vytvoriť názov funkcie create_train_test (), ktorý bude obsahovať tri 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_rowtrain_sample < - 1: total_rowif (train == TRUE) {return (data[train_sample, ])} else {return (data[-train_sample, ])}}

Vysvetlenie kódu

  • function (data, size = 0.8, train = TRUE): Pridajte argumenty do funkcie
  • n_row = nrow (data): Spočítava počet riadkov v množine údajov
  • total_row = size * n_row: Vráťte n-tý riadok a zostrojte vlakovú súpravu
  • train_sample <- 1: total_row: Vyberte prvý riadok až po n-tý riadok
  • if (train == TRUE) {} else {}: Ak je podmienka nastavená na hodnotu true, vráti vlakovú súpravu, inak skúšobnú sadu.

Môžete vyskúšať svoju funkciu a skontrolovať rozmer.

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)

Výkon:

## [1] 836 8
dim(data_test)

Výkon:

## [1] 209 8 

Vlaková množina údajov má 1046 riadkov, zatiaľ čo skúšobná množina údajov má 262 riadkov.

Pomocou funkcie prop.table () v kombinácii s tabuľkou () overíte, či je proces randomizácie správny.

prop.table(table(data_train$survived))

Výkon:

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

Výkon:

#### No Yes## 0.5789474 0.4210526

V obidvoch súboroch údajov je počet pozostalých rovnaký, asi 40 percent.

Nainštalujte si rpart.plot

rpart.plot nie je k dispozícii z knižníc conda. Môžete ho nainštalovať z konzoly:

install.packages("rpart.plot") 

Krok 4) Zostavte model

Ste pripravení na zostavenie modelu. Syntax pre funkciu rozhodovacieho stromu 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

Metódu triedy používate, pretože predpovedáte triedu.

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

Vysvetlenie kódu

  • rpart (): Funkcia prispôsobená modelu. Argumenty sú:
    • prežil ~ .: Vzorec rozhodovacích stromov
    • data = data_train: dataset
    • method = 'class': Prispôsobenie binárneho modelu
  • rpart.plot (fit, extra = 106): Vynesie sa strom. Extra funkcie sú nastavené na 101, aby zobrazovali pravdepodobnosť 2. triedy (užitočné pre binárne odpovede). Ďalšie informácie o ďalších možnostiach nájdete na vignete.

Výkon:

Začínate od koreňového uzla (hĺbka 0 až 3, horná časť grafu):

  1. Na vrchole je to celková pravdepodobnosť prežitia. Ukazuje podiel cestujúcich, ktorí nehodu prežili. Prežilo 41 percent cestujúcich.
  2. Tento uzol sa pýta, či je pohlavie cestujúceho mužské. Ak áno, potom pôjdete do ľavého detského uzla koreňa (hĺbka 2). 63 percent tvoria muži s pravdepodobnosťou prežitia 21 percent.
  3. V druhom uzle sa pýtate, či má mužský cestujúci viac ako 3,5 roka. Ak áno, potom je šanca na prežitie 19 percent.
  4. Pokračujete v tom, aby ste pochopili, aké vlastnosti majú vplyv na pravdepodobnosť prežitia.

Všimnite si, že jednou z mnohých kvalít rozhodovacích stromov je, že vyžadujú veľmi malú prípravu dát. Najmä nevyžadujú zmenu mierky alebo centrovanie funkcií.

Funkcia rpart () štandardne používa na rozdelenie noty mieru Giniho nečistoty. Čím vyšší je Gini koeficient, tým viac rôznych prípadov v uzle.

Krok 5) Vytvorte predpoveď

Môžete predpovedať svoju testovaciu množinu údajov. Na predpovedanie môžete použiť funkciu predpovedať (). Základná syntax predikcie pre rozhodovací strom R 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

Z testovacej sady chcete predpovedať, ktorí cestujúci po zrážke s väčšou pravdepodobnosťou prežijú. To znamená, že medzi tými 209 cestujúcimi budete vedieť, ktorý z nich prežije alebo nie.

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

Vysvetlenie kódu

  • predpovedat (fit, data_test, type = 'class'): Predpovedať triedu (0/1) testovacej sady

Testovanie pasažiera, ktorý to nestihol, a tých, ktorí to nestihli.

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

Vysvetlenie kódu

  • tabuľka (data_test $ survived, predict_unseen): Vytvorte tabuľku, ktorá spočíta, koľko cestujúcich je klasifikovaných ako preživších a zomrelo v porovnaní so správnou klasifikáciou rozhodovacieho stromu v R

Výkon:

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

Model správne predpovedal 106 mŕtvych cestujúcich, ale 15 preživších klasifikoval ako mŕtvych. Analogicky model nesprávne klasifikoval 30 cestujúcich ako preživších, zatiaľ čo sa ukázalo, že sú mŕtvi.

Krok 6) Zmerajte výkon

Pomocou matice zámeny môžete vypočítať mieru presnosti úlohy klasifikácie :

Zmätok matrix je lepšou voľbou pre hodnotenie výkonu klasifikácie. Všeobecnou myšlienkou je spočítať, koľkokrát sú prípady True klasifikované ako nepravdivé.

Každý riadok v konfúznej matici predstavuje skutočný cieľ, zatiaľ čo každý stĺpec predstavuje predpovedaný cieľ. Prvý riadok tejto matice uvažuje o mŕtvych pasažieroch (trieda Falošná): 106 bolo správne klasifikovaných ako mŕtvych ( skutočná záporná ), zatiaľ čo ten zvyšný bol nesprávne klasifikovaný ako preživší ( Falošná pozitívna ). Druhý rad považuje tých, ktorí prežili, pozitívna trieda bola 58 ( skutočne pozitívna ), zatiaľ čo skutočná negatíva bola 30.

Test presnosti môžete vypočítať z matice zámeny:

Je to podiel skutočných kladných a skutočných záporných hodnôt na súčte matice. Pomocou R môžete kódovať nasledovne:

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

Vysvetlenie kódu

  • sum (diag (table_mat)): Súčet uhlopriečky
  • sum (table_mat): Súčet matice.

Môžete vytlačiť presnosť testovacej súpravy:

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

Výkon:

## [1] "Accuracy for test 0.784688995215311" 

Za testovaciu súpravu máte skóre 78 percent. Rovnaké cvičenie môžete replikovať pomocou množiny údajov o tréningu.

Krok 7) Nalaďte hyperparametre

Rozhodovací strom v R má rôzne parametre, ktoré riadia aspekty prispôsobenia. V knižnici rozhodovacieho stromu rpart môžete parametre riadiť pomocou funkcie rpart.control (). V nasledujúcom kóde uvádzate parametre, ktoré budete ladiť. Ďalšie parametre nájdete na vinete.

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

Budeme postupovať nasledovne:

  • Vytvorte funkciu na návratnosť presnosti
  • Nalaďte maximálnu hĺbku
  • Nalaďte minimálny počet vzoriek, ktoré musí uzol mať, aby sa mohol rozdeliť
  • Nalaďte minimálny počet vzoriek, ktoré musí mať listový uzol

Môžete napísať funkciu na zobrazenie presnosti. Jednoducho zabalíte kód, ktorý ste použili predtým:

  1. predpovedať: predict_unseen <- predpovedať (fit, data_test, type = 'class')
  2. Produkčná tabuľka: table_mat <- tabuľka (data_test $ prežil, predict_unseen)
  3. Výpočet presnosti: presnosť_Test <- súčet (diag (table_mat)) / súčet (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}

Môžete sa pokúsiť vyladiť parametre a zistiť, či je možné vylepšiť model oproti predvolenej hodnote. Pripomíname, že musíte dosiahnuť presnosť vyššiu ako 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)

Výkon:

## [1] 0.7990431 

S nasledujúcim parametrom:

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

Získate vyšší výkon ako v predchádzajúcom modeli. Blahoželáme!

Zhrnutie

Môžeme zhrnúť funkcie na trénovanie algoritmu rozhodovacieho stromu v R.

Knižnica

Cieľ

funkcia

trieda

parametre

podrobnosti

rpart

Strom klasifikácie vlakov v R

rpart ()

trieda

vzorec, df, metóda

rpart

Trénujte regresný strom

rpart ()

anova

vzorec, df, metóda

rpart

Pozemokujte stromy

rpart.plot ()

vybavený model

základňa

predvídať

predpovedať ()

trieda

vybavený model, typ

základňa

predvídať

predpovedať ()

prob

vybavený model, typ

základňa

predvídať

predpovedať ()

vektor

vybavený model, typ

rpart

Kontrolné parametre

rpart.control ()

minisplit

Nastavte minimálny počet pozorovaní v uzle predtým, ako algoritmus vykoná rozdelenie

minbucket

V záverečnej poznámke, tj. V liste, nastavte minimálny počet pozorovaní

maximálna hĺbka

Nastavte maximálnu hĺbku ľubovoľného uzla konečného stromu. Koreňový uzol je spracovaný v hĺbke 0

rpart

Model vlaku s riadiacim parametrom

rpart ()

vzorec, df, metóda, kontrola

Poznámka: Trénujte model na cvičných dátach a testujte výkon na neviditeľnej množine údajov, tj na testovacej sade.