Päätöspuu R: ssä Luokittelupuu & Koodi R: ssä esimerkin kanssa

Mitä ovat päätöksentekopuut?

Päätöspuut ovat monipuolinen koneoppimisalgoritmi, joka voi suorittaa sekä luokittelu- että regressiotehtäviä. Ne ovat erittäin tehokkaita algoritmeja, jotka kykenevät sopimaan monimutkaisiin tietojoukoihin. Lisäksi päätöksentekopuut ovat satunnaismetsien perustekijöitä, jotka kuuluvat nykyään tehokkaimpiin koneoppimisen algoritmeihin.

Koulutus ja päätöksentekopuiden visualisointi

Voit rakentaa ensimmäisen päätöspuun R-esimerkissä seuraavalla tavalla tässä päätöksentekopuun opetusohjelmassa:

  • Vaihe 1: Tuo tiedot
  • Vaihe 2: Puhdista tietojoukko
  • Vaihe 3: Luo juna- / testisarja
  • Vaihe 4: Rakenna malli
  • Vaihe 5: Tee ennuste
  • Vaihe 6: Mittaa suorituskyky
  • Vaihe 7: Viritä hyperparametrit

Vaihe 1) Tuo tiedot

Jos olet utelias titanicin kohtalosta, voit katsoa tämän videon Youtubessa. Tämän tietojoukon tarkoituksena on ennustaa, mitkä ihmiset todennäköisemmin selviävät törmäyksestä jäävuoren kanssa. Aineisto sisältää 13 muuttujaa ja 1309 havaintoa. Aineisto on järjestetty muuttujan X avulla.

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

Tuotos:

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

Tuotos:

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

Pään ja hännän ulostulosta voit huomata, että tietoja ei ole sekoitettu. Tämä on iso asia! Kun jaat tietosi junajoukon ja testijoukon välillä, valitset vain luokan 1 ja 2 matkustajan (luokan 3 matkustajia ei ole havaintojen 80 prosentin kärjessä), mikä tarkoittaa, että algoritmi ei koskaan näe luokan 3 matkustajien ominaisuudet. Tämä virhe johtaa huonoon ennusteeseen.

Voit ratkaista tämän ongelman käyttämällä funktionäytettä ().

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

Päätöspuun R-koodi Selitys

  • näyte (1: nrow (titanic)): Luo satunnainen luettelo indeksistä välillä 1-1309 (eli rivien enimmäismäärä).

Tuotos:

## [1] 288 874 1078 633 887 992 

Tätä hakemistoa käytetään sekoittamaan titaanista tietoaineistoa.

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

Tuotos:

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

Vaihe 2) Puhdista tietojoukko

Tietorakenne osoittaa, että joillakin muuttujilla on NA: t. Tiedot puhdistetaan seuraavasti

  • Pudota muuttujat koti. Mökki, mökki, nimi, X ja lippu
  • Luo tekijämuuttujia pclassille ja selvisi
  • Pudota 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)

Koodin selitys

  • select (-c (home.dest, hytti, nimi, X, lippu)): Pudota turhat muuttujat
  • pclass = kerroin (pclass, tasot = c (1,2,3), tunnisteet = c ('Ylä', 'Keski', 'Alempi')): Lisää tunniste muuttujaan pclass. 1 tulee Ylempi, 2 tulee MIddle ja 3 alempi
  • kerroin (selviytynyt, tasot = c (0,1), tunnisteet = c ('Ei', 'Kyllä')): Lisää tunniste selviytyneeseen muuttujaan. 1 tulee Ei ja 2 tulee Kyllä
  • na.omit (): Poista NA-havainnot

Tuotos:

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

Vaihe 3) Luo juna / testisarja

Ennen mallin kouluttamista sinun on suoritettava kaksi vaihetta:

  • Luo juna ja testijoukko: Koulutat mallin junajoukossa ja testaat testisarjan ennustetta (eli näkymättömiä tietoja)
  • Asenna rpart.plot konsolista

Yleinen käytäntö on jakaa tiedot 80/20, 80 prosenttia tiedoista palvelee mallin kouluttamista ja 20 prosenttia ennusteiden tekemistä. Sinun on luotava kaksi erillistä tietokehystä. Et halua koskettaa testisarjaa, ennen kuin olet valmistanut mallisi. Voit luoda funktion nimen create_train_test (), joka vie kolme argumenttia.

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, ])}}

Koodin selitys

  • function (data, koko = 0.8, juna = TOSI): Lisää funktion argumentit
  • n_row = nrow (data): Laske tietojoukon rivien määrä
  • total_row = koko * n_row: Palauta n. rivi junajoukon muodostamiseksi
  • juna_näyte <- 1: yhteensä_rivi: Valitse ensimmäinen rivi n: nnelle riville
  • if (juna == TOSI) {} else {}: Jos ehto asetetaan tosi, palauta junajoukko, muuten testijoukko.

Voit testata toimintosi ja tarkistaa mitat.

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)

Tuotos:

## [1] 836 8
dim(data_test)

Tuotos:

## [1] 209 8 

Juna-tietojoukossa on 1046 riviä, kun testitietojoukossa on 262 riviä.

Voit tarkistaa satunnaistamisprosessin oikean toiminnan funktiolla prop.table () yhdessä taulukon () kanssa.

prop.table(table(data_train$survived))

Tuotos:

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

Tuotos:

#### No Yes## 0.5789474 0.4210526

Molemmissa aineistoissa eloonjääneiden määrä on sama, noin 40 prosenttia.

Asenna rpart.plot

rpart.plot ei ole saatavilla conda-kirjastoista. Voit asentaa sen konsolista:

install.packages("rpart.plot") 

Vaihe 4) Rakenna malli

Olet valmis rakentamaan mallin. Rpart-päätöksentekopuun toiminnon syntaksi on:

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

Käytät luokkamenetelmää, koska ennustat luokan.

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

Koodin selitys

  • rpart (): Toiminto malliin sopivaksi. Väitteet ovat:
    • selviytynyt ~: Päätöspuiden kaava
    • data = data_train: Dataset
    • method = 'class': Sovita binaarimalli
  • rpart.plot (fit, extra = 106): Piirrä puu. Lisäominaisuudet on asetettu 101: een näyttämään 2. luokan todennäköisyys (hyödyllinen binaarivasteille). Voit katsoa vinjettistä lisätietoja muista vaihtoehdoista.

Tuotos:

Aloitat juurisolmusta (syvyys 0 yli 3, kaavion yläosa):

  1. Huipulla se on selviytymisen yleinen todennäköisyys. Se osoittaa, kuinka suuri osa matkustajista selviytyi onnettomuudesta. 41 prosenttia matkustajista selvisi.
  2. Tämä solmu kysyy, onko matkustajan sukupuoli mies. Jos kyllä, siirry juuren vasempaan lapsisolmuun (syvyys 2). 63 prosenttia on miehiä, joiden selviytymisen todennäköisyys on 21 prosenttia.
  3. Toisessa solmussa kysytään, onko miesmatkustaja yli 3,5-vuotias. Jos kyllä, niin selviytymisen mahdollisuus on 19 prosenttia.
  4. Jatkat samalla tavalla ymmärtääksesi, mitkä ominaisuudet vaikuttavat selviytymisen todennäköisyyteen.

Huomaa, että yksi päätöksentekopuiden monista ominaisuuksista on, että ne vaativat hyvin vähän tietojen valmistelua. Erityisesti ne eivät vaadi ominaisuuksien skaalausta tai keskittämistä.

Oletuksena rpart () -funktio käyttää Gini- epäpuhtausmittaa jakamaan nuotin. Mitä suurempi Gini-kerroin, sitä enemmän erilaisia ​​instansseja solmussa on.

Vaihe 5) Tee ennuste

Voit ennustaa testitiedostosi. Voit tehdä ennusteen käyttämällä ennustaa () -toimintoa. R-päätöksen puun ennustamisen perussyntaksi on:

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

Haluat ennustaa, mitkä matkustajat todennäköisesti selviävät törmäyksen jälkeen testisarjasta. Se tarkoittaa, että tiedät näiden 209 matkustajan joukossa, kuka selviää vai ei.

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

Koodin selitys

  • ennustaa (fit, data_test, type = 'class'): Ennusta testijoukon luokka (0/1)

Testataan matkustajaa, joka ei päässyt toimeen, ja niitä, jotka pääsivät.

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

Koodin selitys

  • taulukko (data_test $ selviytyi, ennustaa näkymättömät): Luo taulukko laskemaan, kuinka monta matkustajaa on luokiteltu perheeseen ja kuollut, verrattuna oikeaan päätöksentekopuuluokkaan R

Tuotos:

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

Malli ennusti oikein 106 kuollutta matkustajaa, mutta luokitti 15 eloonjääneen kuolleeksi. Vastaavasti malli luokitteli 30 matkustajaa eloonjääneiksi, kun he osoittautuivat kuolleiksi.

Vaihe 6) Mittaa suorituskyky

Voit laskea luokitustehtävän tarkkuusmitan sekaannusmatriisin avulla :

Sekaannus matriisi on parempi vaihtoehto arvioida luokituksen suorituskykyä. Yleisenä ajatuksena on laskea, kuinka monta kertaa todelliset esiintymät luokitellaan vääriksi.

Sekoitusmatriisin kukin rivi edustaa todellista kohdetta, kun taas kukin sarake edustaa ennustettua kohdetta. Tämän matriisin ensimmäisellä rivillä otetaan huomioon kuolleet matkustajat (väärä luokka): 106 luokiteltiin oikein kuolleiksi ( tosi negatiivinen ), kun taas loput luokiteltiin virheellisesti perheeksi ( väärä positiivinen ). Toisella rivillä otetaan huomioon selviytyneet, positiivinen luokka oli 58 ( tosi positiivinen ), kun taas tosi negatiivinen oli 30.

Voit laskea tarkkuustestin sekaannusmatriisista:

Se on todellisten positiivisten ja todellisten negatiivisten osuus matriisin summasta. R: llä voit koodata seuraavasti:

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

Koodin selitys

  • summa (diag (taulukko_mat)): Lävistäjän summa
  • summa (taulukon_matti): Matriisin summa.

Voit tulostaa testisarjan tarkkuuden:

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

Tuotos:

## [1] "Accuracy for test 0.784688995215311" 

Testisarjan pisteet ovat 78 prosenttia. Voit kopioida saman harjoituksen harjoitustietojoukolla.

Vaihe 7) Viritä hyperparametrit

R: n päätöspuulla on useita parametreja, jotka säätävät sovituksen näkökohtia. Rpart-päätöspuukirjastossa voit hallita parametreja rpart.control () -toiminnon avulla. Seuraavassa koodissa esität viritettävät parametrit. Voit katsoa muita parametreja vinjettistä.

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

Menemme seuraavasti:

  • Rakenna toiminto palauttaaksesi tarkkuuden
  • Viritä suurin syvyys
  • Viritä vähimmäismäärä näytteitä, jotka solmulla on oltava ennen sen jakamista
  • Viritä vähimmäismäärä näytteitä, jotka lehtisolmulla on oltava

Voit kirjoittaa toiminnon tarkkuuden näyttämiseksi. Kääri vain aiemmin käyttämäsi koodi:

  1. ennustaa: ennustaa_näkymätön <- ennustaa (sovi, data_testi, tyyppi = 'luokka')
  2. Tuota taulukko: table_mat <- taulukko (data_test $ selvinnyt, ennustaa_näkymätön)
  3. Laske tarkkuus: tarkkuustesti <- summa (diag (taulukon_matti)) / summa (taulukon_matti)
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}

Voit yrittää virittää parametrit ja nähdä, pystytkö parantamaan mallia oletusarvoon nähden. Muistutuksena sinun on saatava tarkkuus yli 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)

Tuotos:

## [1] 0.7990431 

Seuraavalla parametrilla:

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

Saat paremman suorituskyvyn kuin edellinen malli. Onnittelut!

Yhteenveto

Voimme tiivistää funktiot päätöksentekopuun algoritmin kouluttamiseksi R: ssä

Kirjasto

Tavoite

toiminto

luokassa

parametrit

yksityiskohdat

rpart

Junan luokituspuu R: ssä

rpart ()

luokassa

kaava, df, menetelmä

rpart

Juna regressiopuu

rpart ()

anova

kaava, df, menetelmä

rpart

Piirrä puut

rpart.plot ()

asennettu malli

pohja

ennustaa

ennustaa()

luokassa

asennettu malli, tyyppi

pohja

ennustaa

ennustaa()

prob

asennettu malli, tyyppi

pohja

ennustaa

ennustaa()

vektori

asennettu malli, tyyppi

rpart

Ohjausparametrit

rpart.control ()

minisplit

Aseta solmun havaintojen vähimmäismäärä ennen kuin algoritmi suorittaa jaon

minikauha

Aseta viimeisessä nuotissa havaintojen vähimmäismäärä eli lehti

enimmäissyvyys

Aseta lopullisen puun minkä tahansa solmun enimmäissyvyys. Juurisolmua käsitellään syvyydellä 0

rpart

Junamalli ohjausparametrilla

rpart ()

kaava, df, menetelmä, kontrolli

Huomaa: Harjoittele mallia harjoitustietojen perusteella ja testaa suorituskyky näkymättömällä tietojoukolla eli testijoukolla.

Mielenkiintoisia artikkeleita...