Otsustuspuu R-s - Klassifikatsioonipuu & Kood R-s koos näitega

Lang L: none (table-of-contents):

Anonim

Mis on otsustuspuud?

Otsuspuud on mitmekülgne masinõppe algoritm, mis suudab täita nii klassifitseerimise kui ka regressiooni ülesandeid. Need on väga võimsad algoritmid, mis on võimelised sobitama keerukaid andmekogumeid. Pealegi on otsustuspuud juhuslike metsade põhikomponendid, mis kuuluvad tänapäeval kõige võimsamate masinõppe algoritmide hulka.

Koolitus ja otsustuspuude visualiseerimine

Esimese R-näite otsustuspuu koostamiseks jätkame selles otsustuspuu õpetuses järgmiselt:

  • 1. samm: importige andmed
  • 2. samm: puhastage andmekogum
  • 3. samm: looge rongi- / testikomplekt
  • 4. samm: ehitage mudel üles
  • 5. samm: ennustage
  • 6. samm: mõõtke jõudlust
  • 7. samm: häälestage hüperparameetrid

1. samm. Importige andmed

Kui olete huvitatud titaaniku saatusest, saate seda videot vaadata Youtube'is. Selle andmekogumi eesmärk on ennustada, millised inimesed jäävad suurema tõenäosusega ellu pärast kokkupõrget jäämäega. Andmekogum sisaldab 13 muutujat ja 1309 vaatlust. Andmekogum on järjestatud muutujaga X.

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

Väljund:

## 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äljund:

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

Pea ja saba väljundist võite märgata, et andmeid pole segatud. See on suur küsimus! Kui jagate oma andmed rongikomplekti ja katsekomplekti vahel, valite ainult 1. ja 2. klassi reisija (ükski 3. klassi reisija ei ole vaatluse 80 protsendi hulgas), mis tähendab, et algoritm ei näe kunagi klassi 3 reisija omadused. See viga toob kaasa halva prognoosi.

Selle probleemi lahendamiseks võite kasutada funktsiooni näidist ().

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

Otsustuspuu R-kood Selgitus

  • proov (1: now (titaaniline)): genereerige juhuslik loend indeksist vahemikus 1 kuni 1309 (st ridade maksimaalne arv).

Väljund:

## [1] 288 874 1078 633 887 992 

Kasutate seda indeksit titaanse andmestiku segamiseks.

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

Väljund:

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

2. samm. Puhastage andmekogum

Andmete struktuur näitab, et mõnel muutujal on NA. Andmete puhastamine toimub järgmiselt

  • Drop muutujad home.dest, kajut, nimi, X ja pilet
  • Loo pclassi tegurimuutujad ja jäid ellu
  • Laske NA ära
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)

Koodi selgitus

  • vali (-c (kodu.dest, kajut, nimi, X, pilet)): visake mittevajalikud muutujad
  • pclass = tegur (pclass, tasemed = c (1,2,3), sildid = c ('ülemine', 'keskmine', 'alumine')): lisage muutujale pclass silt. 1 saab Ülemine, 2 saab MIddle ja 3 madalam
  • tegur (ellu jäänud, tasemed = c (0,1), sildid = c ('Ei', 'Jah')): lisage säilinud muutujale silt. 1 saab Ei ja 2 saab Jah
  • na.omit (): eemaldage NA tähelepanekud

Väljund:

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

Samm 3) Looge rong / testikomplekt

Enne oma mudeli koolitamist peate tegema kaks sammu:

  • Rongi ja testikomplekti loomine: treenite rongikomplektis olevat mudelit ja katsetate testikomplekti prognoose (st nägemata andmeid)
  • Installige rpart.plot konsoolist

Levinud tava on jagada andmed 80/20, 80 protsenti andmetest on mudeli koolitamiseks ja 20 protsenti ennustamiseks. Peate looma kaks eraldi andmeraami. Te ei soovi katsekomplekti puudutada enne, kui olete mudeli ehitamise lõpetanud. Saate luua funktsiooni nime create_train_test (), mis võtab kolm argumenti.

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

Koodi selgitus

  • funktsioon (andmed, suurus = 0,8, rong = TÕENE): lisage funktsiooni argumendid
  • n_row = nrow (andmed): loendage andmekogumi ridade arv
  • total_row = suurus * n_row: tagastage rongikomplekti koostamiseks n-nda rida
  • rongi näidis <- 1: kogu_ rida: valige esimene rida n-nda reani
  • if (rong == TÕENE) {} muu {}: kui tingimuseks seatakse tõene, tagastage rongikomplekt, muidu testikomplekt.

Saate oma funktsiooni testida ja mõõdet kontrollida.

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äljund:

## [1] 836 8
dim(data_test)

Väljund:

## [1] 209 8 

Rongi andmekogumis on 1046 rida, katseandmekogumis aga 262 rida.

Randomiseerimisprotsessi õigsuse kontrollimiseks kasutate funktsiooni prop.table () koos tabeliga ().

prop.table(table(data_train$survived))

Väljund:

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

Väljund:

#### No Yes## 0.5789474 0.4210526

Mõlemas andmekogus on ellujäänute arv sama, umbes 40 protsenti.

Installige rpart.plot

rpart.plot pole conda raamatukogudest saadaval. Selle saate installida konsoolilt:

install.packages("rpart.plot") 

4. samm. Ehitage mudel

Olete valmis mudeli ehitama. Rpart otsustuspuu funktsiooni süntaks on järgmine:

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

Kasutate klassi meetodit, kuna ennustate klassi.

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

Koodi selgitus

  • rpart (): mudelile sobiv funktsioon. Argumendid on järgmised:
    • ellu jäänud ~ .: Otsustuspuude valem
    • data = data_train: Andmekogum
    • method = 'class': sobitage binaarne mudel
  • rpart.plot (fit, extra = 106): joonistage puu. Lisafunktsioonid on seatud väärtusele 101, et kuvada 2. klassi tõenäosus (kasulik binaarsete reaktsioonide korral). Teiste valikute kohta leiate lisateavet vinjetilt.

Väljund:

Alustate juursõlmest (sügavus 0 üle 3, graafiku ülaosa):

  1. Ülaosas on see üldine ellujäämise tõenäosus. See näitab õnnetuses ellu jäänud reisijate osakaalu. 41 protsenti reisijatest jäi ellu.
  2. See sõlm küsib, kas reisija sugu on mees. Kui jah, siis lähete alla juure vasakule alamsõlmele (sügavus 2). 63 protsenti on mehed, kelle ellujäämise tõenäosus on 21 protsenti.
  3. Teises sõlmes küsite, kas meesreisija on üle 3,5 aasta vana. Kui jah, siis on ellujäämise võimalus 19 protsenti.
  4. Jätkate nii, et mõista, millised omadused mõjutavad ellujäämise tõenäosust.

Pange tähele, et üks otsustuspuude paljudest omadustest on see, et need nõuavad väga vähe andmete ettevalmistamist. Eelkõige ei nõua need funktsioonide suuruse muutmist ega tsentreerimist.

Vaikimisi kasutab funktsioon rpart () noodi jagamiseks Gini lisandi mõõtu. Mida suurem on Gini koefitsient, seda rohkem on eksemplare sõlmes.

5. samm. Tehke ennustus

Saate oma testi andmekogumit ennustada. Ennustamiseks võite kasutada funktsiooni Ennusta (). R-otsustuspuu ennustamise põhisüntaks 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

Tahate ennustada, millised reisijad tõenäolisemalt pärast kokkupõrget ellu jäävad. See tähendab, et saate teada nende 209 reisija hulgast, kumb jääb ellu või mitte.

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

Koodi selgitus

  • ennustama (fit, data_test, type = 'class'): ennustama testikomplekti klassi (0/1)

Katsetamine reisijale, kes ei jõudnud, ja neile, kes ei jõudnud.

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

Koodi selgitus

  • tabel (data_test $ säilinud, ennustatav_ nägemata): looge tabel, et lugeda, kui palju reisijaid klassifitseeritakse ellujäänuteks ja surnuks, võrreldes õige otsustuspuu liigitusega R

Väljund:

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

Mudel ennustas õigesti 106 surnud reisijat, kuid klassifitseeris 15 ellujäänut surnuks. Analoogia põhjal klassifitseeris mudel 30 reisijat ellujäänuteks, kui nad osutusid surnuks.

6. samm. Mõõtke jõudlust

Segiajamise maatriksiga saate klassifitseerimisülesande täpsusmõõdu arvutada :

Segadust maatriks on parem valik, et hinnata klassifitseerimise jõudlust. Üldine idee on lugeda, mitu korda tõelised eksemplarid on valed klassifitseeritud.

Segiajamise maatriksi iga rida tähistab tegelikku sihtmärki, samas kui iga veerg tähistab ennustatud sihtmärki. Selle maatriksi esimeses reas loetakse surnud reisijad (väärklass): 106 liigitati õigesti surnuteks ( tõene negatiivne ), ülejäänud aga valesti liigitatuks ( valepositiivne ). Teises reas arvestatakse ellujäänutega, positiivne klass oli 58 ( tõeliselt positiivne ), samas kui tõeline negatiivne oli 30.

Saate arvutada täpsusega test alates segadust maatriks:

See on tõelise positiivse ja tõelise negatiivse osakaal maatriksi summast. R-iga saate kodeerida järgmiselt:

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

Koodi selgitus

  • summa (diag (tabeli_mat)): diagonaali summa
  • summa (tabeli_mat): maatriksi summa.

Testikomplekti täpsuse saate printida:

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

Väljund:

## [1] "Accuracy for test 0.784688995215311" 

Testikomplekti skoor on teil 78 protsenti. Sama harjutust saate korrata treeningu andmekogumiga.

7. samm. Häälestage hüperparameetrid

R-i otsustuspuul on erinevad parameetrid, mis kontrollivad sobivuse aspekte. Rpart otsustuspuu teegis saate parameetreid juhtida funktsiooni rpart.control () abil. Järgmises koodis tutvustate häälestatavaid parameetreid. Teiste parameetrite kohta saate viidata vinjetile.

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

Jätkame järgmiselt:

  • Konstrueeri funktsioon täpsuse tagastamiseks
  • Häälestage maksimaalne sügavus
  • Häälestage minimaalne proovide arv, mis sõlmel peab olema enne selle jagunemist
  • Häälestage minimaalne proovide arv, mis lehesõlmel peab olema

Täpsuse kuvamiseks võite kirjutada funktsiooni. Pakkige lihtsalt varem kasutatud kood:

  1. ennustama: ennustama_nägematut <- ennustama (sobivus, andmete_test, tüüp = 'klass')
  2. Produce table: table_mat <- tabel (data_test $ ellu jäänud, ennustada_nägemata)
  3. Arvuta täpsus: täpsuse_test <- summa (diag (tabeli_mat)) / summa (tabeli_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}

Võite proovida parameetreid häälestada ja vaadata, kas saate mudeli vaikeväärtusest paremaks muuta. Meeldetuletuseks peate saama täpsuse, mis on suurem kui 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äljund:

## [1] 0.7990431 

Järgmise parameetriga:

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

Saate suurema jõudluse kui eelmine mudel. Palju õnne!

Kokkuvõte

Võime kokku võtta otsustuspuu algoritmi koolitamise funktsioonid R-s

Raamatukogu

Eesmärk

funktsioon

klass

parameetrid

üksikasjad

rpart

Rongide klassifikatsioonipuu R-s

rpart ()

klass

valem, df, meetod

rpart

Rongi regressioonipuu

rpart ()

anova

valem, df, meetod

rpart

Tehke puid

rpart.plot ()

varustatud mudel

alus

ennustada

ennustama ()

klass

paigaldatud mudel, tüüp

alus

ennustada

ennustama ()

prob

paigaldatud mudel, tüüp

alus

ennustada

ennustama ()

vektor

paigaldatud mudel, tüüp

rpart

Juhtimisparameetrid

rpart.control ()

minilõhed

Enne algoritmi poolitamist määrake sõlmes minimaalne vaatluste arv

minämber

Määrake viimases märkuses minimaalne vaatluste arv ehk leht

maksimaalne sügavus

Määrake lõpliku puu suvalise sõlme maksimaalne sügavus. Juuresõlme töödeldakse sügavusega 0

rpart

Rongimudel koos parameetriga

rpart ()

valem, df, meetod, kontroll

Märkus. Treenige mudelit treeninguandmete põhjal ja katsetage jõudlust nähtamatu andmekogumi, st testikomplektiga.