Kaj so drevesa odločanja?
Odločitvena drevesa so vsestranski algoritem strojnega učenja, ki lahko izvaja naloge klasifikacije in regresije. So zelo zmogljivi algoritmi, ki lahko prilegajo zapletene nabore podatkov. Poleg tega so drevesa odločanja temeljni sestavni deli naključnih gozdov, ki so danes med najmočnejšimi algoritmi strojnega učenja.
Usposabljanje in vizualizacija dreves odločanja
Če želite zgraditi prvo drevo odločitev v primeru R, bomo nadaljevali, kot sledi v tej vadnici drevesa odločanja:
- 1. korak: uvozite podatke
- 2. korak: Očistite nabor podatkov
- 3. korak: Ustvarite vlak / testni niz
- 4. korak: zgradite model
- 5. korak: Naredite napovedi
- 6. korak: Izmerite zmogljivost
- 7. korak: prilagodite hiperparametre
Korak 1) Uvozite podatke
Če vas zanima usoda titanica, si lahko ta video ogledate na Youtubeu. Namen tega nabora podatkov je predvideti, kateri ljudje bodo verjetneje preživeli po trku z ledeno goro. Nabor podatkov vsebuje 13 spremenljivk in 1309 opazovanj. Nabor podatkov ureja spremenljivka X.
set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)
Izhod:
## 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)
Izhod:
## 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 izhoda za glavo in rep lahko opazite, da se podatki ne premešajo. To je velika težava! Ko boste podatke razdelili med vlakovno in testno garnituro, boste izbrali samo potnika iz razreda 1 in 2 (Noben potnik iz razreda 3 ni med najboljših 80 odstotkov opazovanj), kar pomeni, da algoritem ne bo nikoli videl lastnosti potnika razreda 3. Ta napaka bo povzročila slabo napoved.
Če želite odpraviti to težavo, lahko uporabite vzorec funkcije ().
shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)
Koda odločitvenega drevesa Pojasnilo
- vzorec (1: nrow (titanic)): ustvarite naključni seznam indeksa od 1 do 1309 (tj. največje število vrstic).
Izhod:
## [1] 288 874 1078 633 887 992
S tem indeksom boste premešali nabor podatkov o titanu.
titanic <- titanic[shuffle_index, ]head(titanic)
Izhod:
## 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. korak) Očistite nabor podatkov
Struktura podatkov kaže, da imajo nekatere spremenljivke NA. Čiščenje podatkov na naslednji način
- Spustite spremenljivke home.dest, kabina, ime, X in vozovnica
- Ustvari spremenljivke faktorjev za pclass in preživeli
- Spustite 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)
Razlaga kode
- select (-c (home.dest, kabina, ime, X, vozovnica)): Spustite nepotrebne spremenljivke
- pclass = faktor (pclass, ravni = c (1,2,3), labels = c ('Upper', 'Middle', 'Lower')): spremenljivki pclass dodajte oznako. 1 postane zgornji, 2 postane MIddle in 3 postane nižji
- faktor (preživeli, ravni = c (0,1), oznake = c ('Ne', 'Da')): Dodaj oznako preživeli spremenljivki. 1 postane Ne in 2 postane Da
- na.omit (): Odstranite opažanja NA
Izhod:
## Observations: 1,045## Variables: 8## $ pclassUpper, 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) Ustvari vlak / testni niz
Preden izurite svoj model, morate izvesti dva koraka:
- Ustvarite vlak in testni sklop: model trenirate na vlakovnem kompletu in preizkusite napoved na testnem kompletu (tj. Nevidni podatki)
- Namestite rpart.plot iz konzole
Običajna praksa je razdelitev podatkov 80/20, 80 odstotkov podatkov služi za urjenje modela, 20 odstotkov pa za napovedovanje. Ustvariti morate dva ločena podatkovna okvira. Preizkusnega nabora se ne želite dotakniti, dokler ne dokončate izdelave modela. Ustvarite lahko ime funkcije create_train_test (), ki zajema tri argumente.
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, ])}}
Razlaga kode
- funkcija (podatki, velikost = 0,8, vlak = TRUE): dodajte argumente v funkcijo
- n_row = nrow (podatki): preštejte število vrstic v naboru podatkov
- total_row = size * n_row: vrnite n-to vrstico, da sestavite vlak
- train_sample <- 1: total_row: izberite prvo vrstico do n-ih vrstic
- if (train == TRUE) {} else {}: Če je pogoj nastavljen na true, vrni vlak, sicer pa testni niz.
Lahko preizkusite svojo funkcijo in preverite dimenzijo.
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)
Izhod:
## [1] 836 8
dim(data_test)
Izhod:
## [1] 209 8
Nabor podatkov o vlaku ima 1046 vrstic, preskusni nabor podatkov pa 262 vrstic.
S funkcijo prop.table () v kombinaciji s tabelo () preverite, ali je postopek randomizacije pravilen.
prop.table(table(data_train$survived))
Izhod:
#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Izhod:
#### No Yes## 0.5789474 0.4210526
V obeh naborih podatkov je število preživelih enako, približno 40 odstotkov.
Namestite rpart.plot
rpart.plot ni na voljo v knjižnicah conda. Namestite ga lahko iz konzole:
install.packages("rpart.plot")
4. korak) Izdelajte model
Pripravljeni ste na izdelavo modela. Sintaksa za funkcijo odločitvenega drevesa 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
Metodo razreda uporabljate, ker predvidevate razred.
library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106
Razlaga kode
- rpart (): Funkcija, ki ustreza modelu. Argumenti so:
- preživela ~ .: Formula odločitvenih dreves
- data = data_train: Nabor podatkov
- method = 'class': Namestite binarni model
- rpart.plot (fit, ekstra = 106): Narišite drevo. Dodatne funkcije so nastavljene na 101, da prikažejo verjetnost 2. razreda (koristno za binarne odzive). Za več informacij o drugih možnostih se lahko obrnete na vinjeto.
Izhod:
Začnete pri korenskem vozlišču (globina 0 nad 3, vrh grafa):
- Na vrhu je skupna verjetnost preživetja. Prikazuje delež potnikov, ki so preživeli nesrečo. Preživelo je 41 odstotkov potnikov.
- To vozlišče vpraša, ali je spol potnika moški. Če je odgovor pritrdilen, se spustite na levo podrejeno vozlišče korena (globina 2). 63 odstotkov je moških z verjetnostjo preživetja 21 odstotkov.
- V drugem vozlišču vprašate, ali je moški potnik starejši od 3,5 leta. Če je odgovor da, potem je možnost preživetja 19 odstotkov.
- Tako nadaljujete, da bi razumeli, katere značilnosti vplivajo na verjetnost preživetja.
Upoštevajte, da je ena od mnogih lastnosti dreves odločanja ta, da zahtevajo zelo malo priprave podatkov. Zlasti ne zahtevajo skaliranja ali centriranja funkcij.
Funkcija rpart () pri razdelitvi note uporablja mero Gini nečistoče. Višji je Ginijev koeficient, več različnih primerov znotraj vozlišča.
5. korak) Naredite napoved
Predvidete lahko testni nabor podatkov. Za napoved lahko uporabite funkcijo predvidevanja (). Osnovna sintaksa napovedi za drevo odločitev 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
Iz preizkusnega sklopa želite napovedati, kateri potniki bodo po trku bolj verjetno preživeli. Pomeni, med tistimi 209 potniki boste vedeli, kateri bo preživel ali ne.
predict_unseen <-predict(fit, data_test, type = 'class')
Razlaga kode
- napovedi (fit, data_test, type = 'class'): Predvidite razred (0/1) testnega niza
Testiranje potnika, ki ni uspel, in tistih, ki niso.
table_mat <- table(data_test$survived, predict_unseen)table_mat
Razlaga kode
- tabela (data_test $ preživelo, predict_unseen): ustvarite tabelo, da boste prešteli, koliko potnikov je razvrščenih kot preživelih in umrlih v primerjavi s pravilno klasifikacijo drevesa odločitev v R
Izhod:
## predict_unseen## No Yes## No 106 15## Yes 30 58
Model je pravilno napovedal 106 mrtvih potnikov, vendar je 15 preživelih uvrstil med mrtve. Po analogiji je model 30 potnikov napačno razvrstil med preživele, medtem ko se je izkazalo, da so mrtvi.
6. korak) Izmerite zmogljivost
Merjenje natančnosti za nalogo klasifikacije lahko izračunate z matriko zmede :
Zmeda matrika je boljša izbira za oceno uspešnosti klasifikacije. Splošna ideja je, da štejemo, kolikokrat so resnični primerki razvrščeni kot lažni.
Vsaka vrstica v matriki zmede predstavlja dejanski cilj, medtem ko vsak stolpec predstavlja predvideni cilj. Prva vrstica te matrike obravnava mrtve potnike (razred False): 106 je bilo pravilno razvrščenih kot mrtvih ( res negativno ), medtem ko je bilo preostalo napačno označeno kot preživelo ( lažno pozitivno ). Druga vrsta upošteva preživele, pozitivni razred je bil 58 ( res pozitiven ), resnični negativni pa 30.
Preizkus natančnosti lahko izračunate iz matrice zmede:
To je delež resničnih pozitivnih in resnično negativnih v vsoti matrike. Z R lahko kodirate na naslednji način:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Razlaga kode
- vsota (diag (table_mat)): vsota diagonale
- vsota (table_mat): vsota matrike.
Natisnete lahko natančnost testnega kompleta:
print(paste('Accuracy for test', accuracy_Test))
Izhod:
## [1] "Accuracy for test 0.784688995215311"
Za testni niz imate oceno 78 odstotkov. Isto vajo lahko ponovite z naborom podatkov o vadbi.
Korak 7) Uglasite hiper-parametre
Drevo odločitev v R ima različne parametre, ki nadzorujejo vidike prileganja. V knjižnici drevesa odločitev rpart lahko parametre nadzorujete s funkcijo rpart.control (). V naslednjo kodo vnesete parametre, ki jih boste nastavili. Za druge parametre se lahko sklicujete na vinjeto.
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
Nadaljevali bomo, kot sledi:
- Konstruirajte funkcijo za vrnitev natančnosti
- Nastavite največjo globino
- Nastavite najmanjše število vzorcev, ki jih mora imeti vozlišče, preden se lahko razdeli
- Nastavite najmanjše število vzorcev, ki jih mora imeti listno vozlišče
Za prikaz natančnosti lahko napišete funkcijo. Preprosto zavijete kodo, ki ste jo uporabljali prej:
- napovedi: predict_unseen <- napovedi (fit, data_test, type = 'class')
- Pripravi tabelo: table_mat <- tabela (test_podatkov $ preživet, predvid_neviden)
- Natančnost izračuna: natančnost_Test <- vsota (diag (tabela_mat)) / vsota (tabela_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}
Lahko poskusite prilagoditi parametre in preverite, ali lahko izboljšate model glede na privzeto vrednost. Kot opomnik moramo doseči natančnost, večjo 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)
Izhod:
## [1] 0.7990431
Z naslednjim parametrom:
minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0
Dobite večjo zmogljivost kot prejšnji model. Čestitamo!
Povzetek
V R lahko strnemo funkcije za urjenje algoritma drevesa odločitev
Knjižnica |
Cilj |
funkcijo |
razred |
parametrov |
podrobnosti |
---|---|---|---|---|---|
rpart |
Drevo klasifikacije vlakov v R |
rpart () |
razred |
formula, df, metoda | |
rpart |
Drevo regresije vlakov |
rpart () |
anova |
formula, df, metoda | |
rpart |
Narišite drevesa |
rpart.plot () |
opremljen model | ||
osnova |
napovedovati |
napovedi () |
razred |
vgrajeni model, tip | |
osnova |
napovedovati |
napovedi () |
prob |
vgrajeni model, tip | |
osnova |
napovedovati |
napovedi () |
vektor |
vgrajeni model, tip | |
rpart |
Nadzorni parametri |
rpart.control () |
minplit |
Nastavite najmanjše število opazovanj v vozlišču, preden algoritem izvede delitev |
|
minbucket |
V zadnji opombi, tj. Listu, določite najmanjše število opažanj |
||||
največja globina |
Nastavite največjo globino katerega koli vozlišča končnega drevesa. Koreninsko vozlišče je obdelano globino 0 |
||||
rpart |
Model vlaka s krmilnim parametrom |
rpart () |
formula, df, metoda, nadzor |
Opomba: Model usposobite na podatkih o vadbi in preizkusite delovanje na nevidnem naboru podatkov, tj. Testnem nizu.