Hva er beslutningstrær?
Decision Trees er allsidig maskinlæringsalgoritme som kan utføre både klassifiserings- og regresjonsoppgaver. De er veldig kraftige algoritmer, i stand til å passe komplekse datasett. Dessuten er beslutningstrær grunnleggende komponenter i tilfeldige skoger, som er blant de mest potente maskinlæringsalgoritmene som er tilgjengelige i dag.
Trening og visualisering av beslutningstrær
For å bygge ditt første beslutningstreet i eksempel R, fortsetter vi som følger i denne beslutningstreetopplæringen:
- Trinn 1: Importer dataene
- Trinn 2: Rengjør datasettet
- Trinn 3: Lag tog / testsett
- Trinn 4: Bygg modellen
- Trinn 5: Forutsi
- Trinn 6: Mål ytelse
- Trinn 7: Still inn hyperparametrene
Trinn 1) Importer dataene
Hvis du er nysgjerrig på skjebnen til titanic, kan du se denne videoen på Youtube. Hensikten med dette datasettet er å forutsi hvilke mennesker som er mer sannsynlig å overleve etter kollisjonen med isfjellet. Datasettet inneholder 13 variabler og 1309 observasjoner. Datasettet ordnes av variabelen X.
set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)
Produksjon:
## 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)
Produksjon:
## 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
Fra hodet og halen kan du legge merke til at dataene ikke blandes. Dette er en stor sak! Når du vil dele opp dataene dine mellom togsett og testsett, vil du bare velge passasjer fra klasse 1 og 2 (Ingen passasjerer fra klasse 3 er i toppen 80 prosent av observasjonene), noe som betyr at algoritmen aldri vil se funksjoner av passasjer i klasse 3. Denne feilen vil føre til dårlig spådom.
For å løse dette problemet kan du bruke funksjonseksemplet ().
shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)
Beslutningstreet R-kode Forklaring
- sample (1: nrow (titanic)): Generer en tilfeldig liste over indekser fra 1 til 1309 (dvs. maksimalt antall rader).
Produksjon:
## [1] 288 874 1078 633 887 992
Du vil bruke denne indeksen til å blande det titaniske datasettet.
titanic <- titanic[shuffle_index, ]head(titanic)
Produksjon:
## 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
Trinn 2) Rengjør datasettet
Datastrukturen viser at noen variabler har NA-er. Rydding av data gjøres som følger
- Slipp variabler hjem. Dest, hytte, navn, X og billett
- Lag faktorvariabler for pclass og overlevde
- Slipp 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)
Kode Forklaring
- select (-c (home.dest, cabin, name, X, ticket)): Slipp unødvendige variabler
- pclass = faktor (pclass, levels = c (1,2,3), labels = c ('Upper', 'Middle', 'Lower')): Legg etikett til variabelen pclass. 1 blir Øvre, 2 blir Midlere og 3 blir lavere
- faktor (overlevd, nivåer = c (0,1), etiketter = c ('Nei', 'Ja')): Legg etikett til variabelen overlevd. 1 Blir Nei og 2 blir Ja
- na.omit (): Fjern NA-observasjonene
Produksjon:
## 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…
Trinn 3) Opprett tog / testsett
Før du trener modellen, må du utføre to trinn:
- Lag et tog og testsett: Du trener modellen på togsettet og tester spådommen på testsettet (dvs. usynlige data)
- Installer rpart.plot fra konsollen
Vanlig praksis er å dele dataene 80/20, 80 prosent av dataene tjener til å trene modellen og 20 prosent for å komme med spådommer. Du må opprette to separate datarammer. Du vil ikke berøre testsettet før du er ferdig med å bygge modellen. Du kan opprette et funksjonsnavn create_train_test () som tar tre argumenter.
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, ])}}
Kode Forklaring
- funksjon (data, størrelse = 0,8, tog = SANT): Legg til argumentene i funksjonen
- n_row = nrow (data): Tell antall rader i datasettet
- total_row = størrelse * n_row: Returner den niende raden for å konstruere togsettet
- train_sample <- 1: total_row: Velg første rad til nende rad
- if (tog == SANT) {} annet {}: Hvis tilstanden er satt til sant, returner togsettet, ellers testsettet.
Du kan teste funksjonen din og sjekke dimensjonen.
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)
Produksjon:
## [1] 836 8
dim(data_test)
Produksjon:
## [1] 209 8
Togdatasettet har 1046 rader mens testdatasettet har 262 rader.
Du bruker funksjonen prop.table () kombinert med tabell () for å kontrollere om randomiseringsprosessen er riktig.
prop.table(table(data_train$survived))
Produksjon:
#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Produksjon:
#### No Yes## 0.5789474 0.4210526
I begge datasettene er mengden overlevende den samme, omtrent 40 prosent.
Installer rpart.plot
rpart.plot er ikke tilgjengelig fra conda-biblioteker. Du kan installere den fra konsollen:
install.packages("rpart.plot")
Trinn 4) Bygg modellen
Du er klar til å bygge modellen. Syntaksen for Rpart beslutningstreet funksjon er:
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
Du bruker klassemetoden fordi du forutsier en klasse.
library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106
Kode Forklaring
- rpart (): Funksjon som passer til modellen. Argumentene er:
- overlevde ~ .: Formel for beslutningstrær
- data = data_train: datasett
- metode = 'klasse': Monter en binær modell
- rpart.plot (passform, ekstra = 106): Plott treet. De ekstra funksjonene er satt til 101 for å vise sannsynligheten for 2. klasse (nyttig for binære svar). Du kan se på vignetten for mer informasjon om de andre valgene.
Produksjon:
Du starter ved rotnoden (dybde 0 over 3, toppen av grafen):
- På toppen er det den totale sannsynligheten for å overleve. Den viser andelen passasjerer som overlevde krasj. 41 prosent av passasjerene overlevde.
- Denne noden spør om kjønnet til passasjeren er mann. Hvis ja, så går du ned til rotens venstre barneknute (dybde 2). 63 prosent er menn med en overlevelsessannsynlighet på 21 prosent.
- I den andre noden spør du om den mannlige passasjeren er over 3,5 år. Hvis ja, så er sjansen for å overleve 19 prosent.
- Du fortsetter slik for å forstå hvilke funksjoner som påvirker sannsynligheten for å overleve.
Merk at en av de mange egenskapene til Decision Trees er at de krever svært lite dataklargjøring. Spesielt krever de ikke skalering eller sentrering av funksjoner.
Som standard bruker rpart () -funksjonen Gini- urenhetsmål for å dele notatet. Jo høyere Gini-koeffisienten er, desto flere forskjellige forekomster i noden.
Trinn 5) Gjør en spådom
Du kan forutsi testdatasettet ditt. For å gjøre en prediksjon, kan du bruke predict () -funksjonen. Den grunnleggende syntaksen for å forutsi for R-beslutningstreet er:
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
Du vil forutsi hvilke passasjerer som er mer sannsynlig å overleve etter kollisjonen fra testsettet. Det betyr at du vil vite blant de 209 passasjerene, hvilken som vil overleve eller ikke.
predict_unseen <-predict(fit, data_test, type = 'class')
Kode Forklaring
- forutsi (fit, data_test, type = 'class'): Forutsi klassen (0/1) av testsettet
Testet passasjeren som ikke klarte det, og de som gjorde det.
table_mat <- table(data_test$survived, predict_unseen)table_mat
Kode Forklaring
- tabell (data_test $ overlevd, forutsi_ usett): Lag en tabell for å telle hvor mange passasjerer som er klassifisert som overlevende og gått bort sammenlignet med riktig beslutningstreet klassifisering i R
Produksjon:
## predict_unseen## No Yes## No 106 15## Yes 30 58
Modellen forutsa korrekt 106 døde passasjerer, men klassifiserte 15 overlevende som døde. Analogt, klassifiserte modellen 30 passasjerer som overlevende mens de viste seg å være døde.
Trinn 6) Mål ytelse
Du kan beregne et nøyaktighetsmål for klassifiseringsoppgaven med forvirringsmatrisen :
Den forvirring matrise er et bedre valg for å vurdere klassifiseringen ytelse. Den generelle ideen er å telle antall ganger Sanne forekomster blir klassifisert som falske.
Hver rad i en forvirringsmatrise representerer et faktisk mål, mens hver kolonne representerer et forutsagt mål. Den første raden i denne matrisen vurderer døde passasjerer (den falske klassen): 106 ble riktig klassifisert som døde ( ekte negativ ), mens den gjenværende feilaktig ble klassifisert som en overlevende ( falsk positiv ). Den andre raden vurderer de overlevende, den positive klassen var 58 ( ekte positiv ), mens den sanne negative var 30.
Du kan beregne nøyaktighetstesten fra forvirringsmatrisen:
Det er andelen ekte positiv og sann negativ over summen av matrisen. Med R kan du kode som følger:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Kode Forklaring
- sum (diag (table_mat)): Summen av diagonalen
- sum (table_mat): Summen av matrisen.
Du kan skrive ut nøyaktigheten til testsettet:
print(paste('Accuracy for test', accuracy_Test))
Produksjon:
## [1] "Accuracy for test 0.784688995215311"
Du har en score på 78 prosent for testsettet. Du kan replikere den samme øvelsen med treningsdatasettet.
Trinn 7) Still inn hyperparametrene
Beslutningstreet i R har forskjellige parametere som styrer aspekter av passformen. I rpart beslutningstreetbibliotek kan du kontrollere parametrene ved hjelp av funksjonen rpart.control (). I den følgende koden introduserer du parametrene du vil stille inn. Du kan se på vignetten for andre parametere.
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
Vi fortsetter som følger:
- Konstruer funksjon for å gi nøyaktighet
- Still inn maksimal dybde
- Still inn minimum antall prøver en node må ha før den kan deles
- Still inn minimum antall prøver en bladnode må ha
Du kan skrive en funksjon for å vise nøyaktigheten. Du pakker ganske enkelt koden du brukte før:
- forutsi: forutsi_ usett <- forutsi (fit, data_test, type = 'class')
- Produser tabell: table_mat <- tabell (data_test $ overlevd, forutsi usynlig)
- Beregn nøyaktighet: nøyaktighet_Test <- sum (diag (table_mat)) / sum (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}
Du kan prøve å stille inn parametrene og se om du kan forbedre modellen over standardverdien. Som en påminnelse må du få en nøyaktighet høyere enn 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)
Produksjon:
## [1] 0.7990431
Med følgende parameter:
minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0
Du får høyere ytelse enn forrige modell. Gratulerer!
Sammendrag
Vi kan oppsummere funksjonene for å trene en beslutningstresalgoritme i R
Bibliotek |
Objektiv |
funksjon |
klasse |
parametere |
detaljer |
---|---|---|---|---|---|
rpart |
Togklassifiseringstreet i R |
rpart () |
klasse |
formel, df, metode | |
rpart |
Tren regresjonstreet |
rpart () |
anova |
formel, df, metode | |
rpart |
Plott trærne |
rpart.plot () |
montert modell | ||
utgangspunkt |
forutsi |
forutsi() |
klasse |
montert modell, type | |
utgangspunkt |
forutsi |
forutsi() |
prob |
montert modell, type | |
utgangspunkt |
forutsi |
forutsi() |
vektor |
montert modell, type | |
rpart |
Kontrollparametere |
rpart.control () |
minsplit |
Angi minimum antall observasjoner i noden før algoritmen utfører en splittelse |
|
minbøtte |
Sett minimum antall observasjoner i sluttnotatet, dvs. bladet |
||||
maks dybde |
Angi maksimal dybde for en hvilken som helst node i det endelige treet. Rotnoden behandles en dybde 0 |
||||
rpart |
Togmodell med kontrollparameter |
rpart () |
formel, df, metode, kontroll |
Merk: Tren modellen på treningsdata og test ytelsen på et usett datasett, dvs. testsett.