Kas ir lēmumu koki?
Lēmumu koki ir daudzpusīgs mašīnmācīšanās algoritms, kas var veikt gan klasifikācijas, gan regresijas uzdevumus. Tie ir ļoti spēcīgi algoritmi, kas spēj pielāgot sarežģītas datu kopas. Turklāt lēmumu koki ir nejauša meža pamatkomponenti, kas ir vieni no spēcīgākajiem mašīnmācīšanās algoritmiem, kas šodien ir pieejami.
Apmācība un lēmumu koku vizualizēšana
Lai izveidotu savu pirmo lēmumu koku R piemērā, mēs rīkosimies šādi šajā lēmumu koku apmācībā:
- 1. darbība: importējiet datus
- 2. darbība: notīriet datu kopu
- 3. solis: izveidojiet vilcienu / testa komplektu
- 4. solis: izveidojiet modeli
- 5. solis: prognozējiet
- 6. solis: Novērtējiet veiktspēju
- 7. darbība: iestatiet hiperparametrus
1. darbība. Importējiet datus
Ja jūs interesē titānika liktenis, varat noskatīties šo videoklipu vietnē Youtube. Šīs datu kopas mērķis ir paredzēt, kuri cilvēki, visticamāk, izdzīvos pēc sadursmes ar aisbergu. Datu kopa satur 13 mainīgos un 1309 novērojumus. Datu kopu sakārto mainīgais X.
set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)
Izeja:
## 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)
Izeja:
## 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ēc galvas un astes izejas jūs varat pamanīt, ka dati nav sajaukti. Tas ir liels jautājums! Kad jūs sadalīsit datus starp vilcienu sastāvu un testa komplektu, jūs atlasīsit tikai pasažieri no 1. un 2. klases (neviens no 3. klases pasažieriem nav 80% novērojumu augšdaļā), kas nozīmē, ka algoritms nekad neredzēs 3. klases pasažieru iezīmes. Šī kļūda novedīs pie sliktas prognozes.
Lai novērstu šo problēmu, varat izmantot funkciju paraugu ().
shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)
Lēmumu koka R kods Paskaidrojums
- paraugs (1: nrow (titānisks)): ģenerējiet nejaušu indeksa sarakstu no 1 līdz 1309 (ti, maksimālo rindu skaitu).
Izeja:
## [1] 288 874 1078 633 887 992
Jūs izmantosiet šo indeksu, lai sajauktu titānisko datu kopu.
titanic <- titanic[shuffle_index, ]head(titanic)
Izeja:
## 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. solis. Notīriet datu kopu
Datu struktūra rāda, ka dažiem mainīgajiem ir NA. Datu tīrīšana jāveic šādi
- Nometiet mainīgos home.dest, kabīne, nosaukums, X un biļete
- Izveidojiet faktoru mainīgos pclass un izdzīvojāt
- Nomet 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)
Kods Paskaidrojums
- select (-c (home.dest, kajīte, nosaukums, X, biļete)): nometiet nevajadzīgos mainīgos
- pclass = koeficients (pclass, level = c (1,2,3), labels = c ('Upper', 'Middle', 'Lower')): Pievienojiet iezīmi mainīgajam pclass. 1 kļūst par Augšējo, 2 par MIddle un 3 par zemāku
- faktors (izdzīvoja, līmeņi = c (0,1), etiķetes = c ('Nē', 'Jā')): pievienojiet iezīmi izdzīvojušajam mainīgajam. 1 kļūst par nē, bet 2 kļūst par jā
- na.omit (): noņemiet NA novērojumus
Izeja:
## 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…
3. solis) Izveidojiet vilcienu / testa komplektu
Pirms apmācāt savu modeli, jums jāveic divas darbības:
- Izveidojiet vilcienu un testa komplektu: jūs apmācāt modeli vilciena komplektā un pārbaudāt prognozi testa komplektā (ti, neredzētus datus)
- Instalējiet rpart.plot no konsoles
Kopējā prakse ir sadalīt datus 80/20, 80 procenti datu kalpo modeļa apmācībai un 20 procenti prognozēm. Jums jāizveido divi atsevišķi datu rāmji. Jūs nevēlaties pieskarties testa komplektam, kamēr neesat pabeidzis veidot savu modeli. Varat izveidot funkcijas nosaukumu create_train_test (), kas aizņem trīs argumentus.
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, ])}}
Kods Paskaidrojums
- funkcija (dati, izmērs = 0,8, vilciens = PATIESA): Funkcijā pievienojiet argumentus
- n_row = nrow (dati): saskaita rindu skaitu datu kopā
- total_row = size * n_row: atgrieziet n-to rindu, lai izveidotu vilcienu kopu
- vilciena_ paraugs <- 1: kopējā_ rinda: atlasiet pirmo rindu uz n-to rindu
- if (vilciens == PATIESA) {} cits {}: ja nosacījums ir iestatīts uz patiesu, atgrieziet vilciena kopu, citādi - testa kopu.
Jūs varat pārbaudīt savu funkciju un pārbaudīt izmēru.
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)
Izeja:
## [1] 836 8
dim(data_test)
Izeja:
## [1] 209 8
Vilciena datu kopai ir 1046 rindas, savukārt testa datu kopai - 262 rindas.
Jūs izmantojat funkciju prop.table () apvienojumā ar table (), lai pārbaudītu, vai randomizācijas process ir pareizs.
prop.table(table(data_train$survived))
Izeja:
#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Izeja:
#### No Yes## 0.5789474 0.4210526
Abās datu kopās izdzīvojušo skaits ir vienāds, aptuveni 40 procenti.
Instalējiet rpart.plot
rpart.plot nav pieejams conda bibliotēkās. To var instalēt no konsoles:
install.packages("rpart.plot")
4. solis. Izveidojiet modeli
Jūs esat gatavs izveidot modeli. Rpart lēmumu koka funkcijas sintakse ir šāda:
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
Jūs izmantojat klases metodi, jo jūs paredzat klasi.
library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106
Kods Paskaidrojums
- rpart (): Funkcija, kas piemērota modelim. Argumenti ir:
- izdzīvoja ~ .: Lēmumu koku formula
- data = data_train: Datu kopa
- method = 'class': piemērojiet bināro modeli
- rpart.plot (fit, extra = 106): uzzīmējiet koku. Papildu funkcijas ir iestatītas uz 101, lai parādītu 2. klases varbūtību (noderīga binārām atbildēm). Lai uzzinātu vairāk par citām iespējām, varat atsaukties uz vinjeti.
Izeja:
Jūs sākat no saknes mezgla (dziļums 0 virs 3, diagrammas augšdaļa):
- Augšpusē tā ir kopējā izdzīvošanas varbūtība. Tas parāda pasažieru īpatsvaru, kas izdzīvoja avārijā. Izdzīvoja 41 procents pasažieru.
- Šis mezgls jautā, vai pasažiera dzimums ir vīrietis. Ja jā, tad jūs dodaties uz leju līdz saknes kreisajam bērna mezglam (2. dziļums). 63 procenti ir vīrieši, kuru izdzīvošanas varbūtība ir 21 procents.
- Otrajā mezglā jūs jautājat, vai pasažieris ir vecāks par 3,5 gadiem. Ja jā, tad izdzīvošanas iespēja ir 19 procenti.
- Tu turpini tā turpināt, lai saprastu, kādas iezīmes ietekmē izdzīvošanas iespējamību.
Ņemiet vērā, ka viena no daudzajām lēmumu koku īpašībām ir tā, ka tām nepieciešama ļoti maz datu sagatavošanas. Jo īpaši tiem nav nepieciešama funkciju mērogošana vai centrēšana.
Pēc noklusējuma funkcija rpart () piezīmes sadalīšanai izmanto Džini piemaisījumu mēru. Jo lielāks ir Džini koeficients, jo vairāk dažādu gadījumu mezglā.
5. solis. Izveidojiet prognozi
Jūs varat paredzēt testa datu kopu. Lai veiktu prognozi, varat izmantot funkciju predikt (). R lēmuma koka prognozēšanas pamata sintakse ir:
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
Jūs vēlaties paredzēt, kuri pasažieri, iespējams, izdzīvos pēc sadursmes no testa komplekta. Tas nozīmē, ka starp šiem 209 pasažieriem jūs zināt, kurš no tiem izdzīvos vai nē.
predict_unseen <-predict(fit, data_test, type = 'class')
Kods Paskaidrojums
- pareģot (fit, data_test, type = 'class'): Paredzēt testa kopas klasi (0/1)
Pārbauda pasažieri, kurš nepaspēja, un tos, kas to paveica.
table_mat <- table(data_test$survived, predict_unseen)table_mat
Kods Paskaidrojums
- tabula (datu_tests $ izdzīvoja, prognozējams_nav redzams): izveidojiet tabulu, lai uzskaitītu, cik pasažieru ir klasificēti kā izdzīvojušie un aizgājuši mūžībā, salīdzinot ar pareizo lēmumu koku klasifikāciju R
Izeja:
## predict_unseen## No Yes## No 106 15## Yes 30 58
Modelis pareizi paredzēja 106 mirušos pasažierus, bet 15 izdzīvojušos klasificēja kā mirušus. Pēc analoģijas modelis nepareizi klasificēja 30 pasažierus kā izdzīvojušos, kamēr viņi izrādījās miruši.
6. solis) Izmēriet veiktspēju
Jūs varat aprēķināt precizitātes mērījumu klasifikācijas uzdevumam ar sajaukšanas matricu :
Apjukums matrica ir labāka izvēle, lai novērtētu klasifikācijas rezultātus. Vispārējā ideja ir saskaitīt reālo gadījumu klasifikācijas reižu skaitu kā nepatiesu.
Katra sajaukšanas matricas rinda apzīmē faktisko mērķi, bet katra kolonna - paredzamo mērķi. Šīs matricas pirmajā rindā tiek uzskatīti mirušie pasažieri (viltus klase): 106 tika pareizi klasificēti kā miruši ( patiess negatīvs ), bet pārējais tika kļūdaini klasificēts kā izdzīvojušais ( viltus pozitīvs ). Otrajā rindā ir izdzīvojušie, pozitīvā klase bija 58 ( patiess pozitīvs ), bet patiesais negatīvais bija 30.
Precizitātes testu varat aprēķināt no neskaidrības matricas:
Tā ir patiesā pozitīvā un patiesā negatīvā proporcija attiecībā pret matricas summu. Izmantojot R, jūs varat kodēt šādi:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Kods Paskaidrojums
- summa (diag (table_mat)): diagonāles summa
- summa (tabulas_mat): matricas summa.
Pārbaudes komplekta precizitāti var izdrukāt:
print(paste('Accuracy for test', accuracy_Test))
Izeja:
## [1] "Accuracy for test 0.784688995215311"
Pārbaudes komplekta rezultāts jums ir 78 procenti. To pašu vingrinājumu var atkārtot ar mācību datu kopu.
7. solis. Noregulējiet hiper parametrus
Lēmuma kokam R ir dažādi parametri, kas kontrolē atbilstības aspektus. Rpart lēmumu koku bibliotēkā parametrus varat kontrolēt, izmantojot funkciju rpart.control (). Šajā kodā jūs ievadāt parametrus, kurus jūs noskaņosiet. Citus parametrus varat skatīt vinjetē.
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
Mēs rīkosimies šādi:
- Konstruējiet funkciju, lai atgrieztu precizitāti
- Noregulējiet maksimālo dziļumu
- Noregulējiet minimālo parauga skaitu, kas mezglam ir jābūt, pirms tas var sadalīties
- Noregulējiet minimālo paraugu skaitu, kāds jābūt lapu mezglā
Lai parādītu precizitāti, varat uzrakstīt funkciju. Jūs vienkārši iesaiņojat iepriekš izmantoto kodu:
- pareģot: pareģot_nav redzams <- paredzēt (derēt, datu_tests, tips = 'klase')
- Ražot tabulu: table_mat <- table (datu_tests $ izdzīvoja, pareģot_nav redzams)
- Aprēķināt precizitāti: precizitāte_Tests <- summa (diag (tabulas_mat)) / summa (tabulas_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}
Varat mēģināt pielāgot parametrus un noskaidrot, vai modeli var uzlabot, salīdzinot ar noklusējuma vērtību. Atgādinām, ka jums jāiegūst precizitāte, kas lielāka par 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)
Izeja:
## [1] 0.7990431
Ar šādu parametru:
minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0
Jūs saņemat augstāku veiktspēju nekā iepriekšējais modelis. Apsveicam!
Kopsavilkums
Mēs varam apkopot funkcijas, lai apmācītu lēmumu koku algoritmu R
Bibliotēka |
Mērķis |
funkciju |
klasē |
parametriem |
informācija |
---|---|---|---|---|---|
rpart |
Vilcienu klasifikācijas koks R |
rpart () |
klasē |
formula, df, metode | |
rpart |
Vilciena regresijas koks |
rpart () |
anova |
formula, df, metode | |
rpart |
Uzzīmē kokus |
rpart.plot () |
aprīkots modelis | ||
bāze |
paredzēt |
paredzēt () |
klasē |
aprīkots modelis, tips | |
bāze |
paredzēt |
paredzēt () |
prob |
aprīkots modelis, tips | |
bāze |
paredzēt |
paredzēt () |
vektors |
aprīkots modelis, tips | |
rpart |
Kontroles parametri |
rpart.control () |
minsplit |
Iestatiet minimālo novērojumu skaitu mezglā, pirms algoritms veic sadalīšanu |
|
minbucket |
Nosakiet minimālo novērojumu skaitu pēdējā piezīmē, ti, lapā |
||||
maksimālais dziļums |
Iestatiet jebkura koka gala jebkura mezgla maksimālo dziļumu. Saknes mezgls tiek apstrādāts ar dziļumu 0 |
||||
rpart |
Vilciena modelis ar vadības parametru |
rpart () |
formula, df, metode, kontrole |
Piezīme. Apmāciet modeli uz apmācības datiem un pārbaudiet veiktspēju neredzētā datu kopā, ti, testa komplektā.