Apakah Pokok Keputusan?
Decision Trees adalah algoritma Pembelajaran Mesin serba boleh yang dapat melakukan kedua-dua tugas klasifikasi dan regresi. Mereka adalah algoritma yang sangat kuat, mampu menyesuaikan set data yang kompleks. Selain itu, pokok keputusan adalah komponen asas hutan rawak, yang merupakan antara algoritma Pembelajaran Mesin yang paling kuat yang ada sekarang.
Melatih dan Menggambarkan pokok keputusan
Untuk membina pohon keputusan pertama anda dalam contoh R, kami akan mengikuti seperti berikut dalam tutorial Pokok Keputusan ini:
- Langkah 1: Import data
- Langkah 2: Bersihkan set data
- Langkah 3: Buat set kereta / ujian
- Langkah 4: Bina model
- Langkah 5: Buat ramalan
- Langkah 6: Ukur prestasi
- Langkah 7: Tentukan parameter hiper
Langkah 1) Import data
Sekiranya anda ingin tahu mengenai nasib titanic, anda boleh menonton video ini di Youtube. Tujuan kumpulan data ini adalah untuk meramalkan orang mana yang lebih cenderung bertahan setelah bertembung dengan gunung es. Set data mengandungi 13 pemboleh ubah dan 1309 pemerhatian. Set data disusun mengikut pemboleh ubah X.
set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)
Pengeluaran:
## 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)
Pengeluaran:
## 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
Dari output kepala dan ekor, anda dapat melihat data tidak digeser. Ini adalah masalah besar! Apabila anda akan membahagikan data anda antara satu set kereta api dan satu set ujian, anda hanya akan memilih penumpang dari kelas 1 dan 2 (Tidak ada penumpang dari kelas 3 yang berada di 80 peratus pemerhatian teratas), yang bermaksud algoritma tidak akan pernah melihat ciri penumpang kelas 3. Kesalahan ini akan menyebabkan ramalan buruk.
Untuk mengatasi masalah ini, anda boleh menggunakan contoh fungsi ().
shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)
Kod R keputusan keputusan Penjelasan
- contoh (1: nrow (titanic)): Hasilkan senarai indeks secara rawak dari 1 hingga 1309 (iaitu bilangan baris maksimum).
Pengeluaran:
## [1] 288 874 1078 633 887 992
Anda akan menggunakan indeks ini untuk mengombak set data titanic.
titanic <- titanic[shuffle_index, ]head(titanic)
Pengeluaran:
## 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
Langkah 2) Bersihkan set data
Struktur data menunjukkan beberapa pemboleh ubah mempunyai NA. Pembersihan data dilakukan seperti berikut
- Jatuhkan pemboleh ubah home.dest, kabin, nama, X dan tiket
- Buat pemboleh ubah faktor untuk pclass dan bertahan
- Jatuhkan 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)
Penjelasan Kod
- pilih (-c (home.dest, kabin, nama, X, tiket)): Jatuhkan pemboleh ubah yang tidak perlu
- pclass = factor (pclass, level = c (1,2,3), label = c ('Atas', 'Tengah', 'Bawah')): Tambahkan label ke pemboleh ubah pclass. 1 menjadi Atas, 2 menjadi MIddle dan 3 menjadi lebih rendah
- faktor (bertahan, tahap = c (0,1), label = c ('Tidak', 'Ya')): Tambahkan label ke pemboleh ubah yang bertahan. 1 Menjadi Tidak dan 2 menjadi Ya
- na.omit (): Keluarkan pemerhatian NA
Pengeluaran:
## 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…
Langkah 3) Buat set kereta / ujian
Sebelum melatih model anda, anda perlu melakukan dua langkah:
- Buat kereta api dan set ujian: Anda melatih model pada set kereta api dan menguji ramalan pada set ujian (iaitu data yang tidak kelihatan)
- Pasang rpart.plot dari konsol
Amalan yang biasa dilakukan adalah untuk membagi data 80/20, 80 persen data berfungsi untuk melatih model, dan 20 persen untuk membuat ramalan. Anda perlu membuat dua bingkai data yang berasingan. Anda tidak mahu menyentuh set ujian sehingga anda selesai membina model anda. Anda boleh membuat nama fungsi create_train_test () yang memerlukan tiga argumen.
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, ])}}
Penjelasan Kod
- fungsi (data, ukuran = 0.8, kereta = BENAR): Tambahkan argumen dalam fungsi
- n_row = nrow (data): Hitung bilangan baris dalam set data
- total_row = size * n_row: Kembalikan baris ke-9 untuk membina set kereta api
- train_sample <- 1: total_row: Pilih baris pertama hingga baris ke-9
- if (train == TRUE) {} lain {}: Jika keadaan ditetapkan menjadi benar, kembalikan set kereta api, jika tidak, set ujian.
Anda boleh menguji fungsi anda dan memeriksa dimensinya.
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)
Pengeluaran:
## [1] 836 8
dim(data_test)
Pengeluaran:
## [1] 209 8
Set data kereta api mempunyai 1046 baris sementara set data ujian mempunyai 262 baris.
Anda menggunakan fungsi prop.table () digabungkan dengan jadual () untuk mengesahkan sama ada proses rawak betul.
prop.table(table(data_train$survived))
Pengeluaran:
#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Pengeluaran:
#### No Yes## 0.5789474 0.4210526
Dalam kedua-dua set data, jumlah mangsa adalah sama, kira-kira 40 peratus.
Pasang rpart.plot
rpart.plot tidak tersedia dari perpustakaan conda. Anda boleh memasangnya dari konsol:
install.packages("rpart.plot")
Langkah 4) Bina model
Anda sudah bersedia untuk membina model. Sintaks untuk fungsi pohon keputusan Rpart adalah:
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
Anda menggunakan kaedah kelas kerana anda meramalkan kelas.
library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106
Penjelasan Kod
- rpart (): Fungsi untuk menyesuaikan model. Dalilnya adalah:
- selamat ~: Formula Pokok Keputusan
- data = data_train: Set data
- kaedah = 'kelas': Sesuai model binari
- rpart.plot (muat, tambahan = 106): Petak pokok. Ciri tambahan ditetapkan ke 101 untuk menunjukkan kebarangkalian kelas 2 (berguna untuk tindak balas binari). Anda boleh merujuk sketsa untuk maklumat lebih lanjut mengenai pilihan lain.
Pengeluaran:
Anda bermula di simpul akar (kedalaman 0 lebih dari 3, bahagian atas grafik):
- Di bahagian atas, ini adalah kebarangkalian keseluruhan hidup. Ini menunjukkan bahagian penumpang yang terselamat dalam nahas. 41 peratus penumpang selamat.
- Node ini bertanya sama ada jantina penumpang lelaki. Sekiranya ya, maka anda pergi ke simpul anak kiri akar (kedalaman 2). 63 peratus adalah lelaki dengan kebarangkalian bertahan hidup 21 peratus.
- Pada simpul kedua, anda bertanya sama ada penumpang lelaki berusia di atas 3.5 tahun. Sekiranya ya, maka peluang bertahan adalah 19 peratus.
- Anda terus berjalan seperti itu untuk memahami ciri apa yang mempengaruhi kemungkinan hidup.
Perhatikan bahawa, salah satu daripada banyak kualiti Pokok Keputusan adalah bahawa mereka memerlukan penyediaan data yang sangat sedikit. Secara khusus, mereka tidak memerlukan penskalaan fitur atau pemusatan.
Secara lalai, fungsi rpart () menggunakan ukuran kekotoran Gini untuk memisahkan nota. Semakin tinggi pekali Gini, semakin berbeza keadaan di dalam nod.
Langkah 5) Buat ramalan
Anda boleh meramalkan set data ujian anda. Untuk membuat ramalan, anda boleh menggunakan fungsi ramalan (). Sintaks asas ramalan untuk pokok keputusan R adalah:
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
Anda ingin meramalkan penumpang mana yang lebih cenderung bertahan selepas perlanggaran dari set ujian. Maknanya, anda akan tahu di antara 209 penumpang tersebut, yang mana satu akan bertahan atau tidak.
predict_unseen <-predict(fit, data_test, type = 'class')
Penjelasan Kod
- ramalkan (fit, data_test, type = 'class'): Ramalkan kelas (0/1) set ujian
Menguji penumpang yang tidak berjaya dan mereka yang berjaya.
table_mat <- table(data_test$survived, predict_unseen)table_mat
Penjelasan Kod
- table (data_test $ bertahan, prediksi_unseen): Buat jadual untuk mengira berapa banyak penumpang yang diklasifikasikan sebagai mangsa yang selamat dan meninggal dunia dibandingkan dengan klasifikasi pokok keputusan yang betul di R
Pengeluaran:
## predict_unseen## No Yes## No 106 15## Yes 30 58
Model itu dengan tepat meramalkan 106 penumpang mati tetapi mengelaskan 15 orang yang terselamat sebagai mati. Secara analogi, model tersebut salah mengklasifikasikan 30 penumpang sebagai mangsa yang terselamat sementara mereka mati.
Langkah 6) Ukur prestasi
Anda boleh mengira ukuran ketepatan untuk tugas klasifikasi dengan matriks kekeliruan :
The kekeliruan matriks adalah pilihan yang lebih baik untuk menilai prestasi klasifikasi. Idea umum adalah untuk mengira berapa kali Contoh sebenar dikelaskan adalah Salah.
Setiap baris dalam matriks kebingungan mewakili sasaran sebenar, sementara setiap lajur mewakili sasaran yang diramalkan. Baris pertama matriks ini menganggap penumpang mati (kelas Salah): 106 diklasifikasikan dengan betul sebagai mati ( Benar negatif ), sementara selebihnya salah diklasifikasikan sebagai mangsa yang selamat ( Palsu positif ). Baris kedua menganggap yang selamat, kelas positif adalah 58 ( Benar positif ), sementara Benar negatif adalah 30.
Anda boleh mengira ujian ketepatan dari matriks kekeliruan:
Ini adalah bahagian positif positif dan negatif benar daripada jumlah matriks. Dengan R, anda boleh membuat kod seperti berikut:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Penjelasan Kod
- jumlah (diag (table_mat)): Jumlah pepenjuru
- jumlah (table_mat): Jumlah matriks.
Anda boleh mencetak ketepatan set ujian:
print(paste('Accuracy for test', accuracy_Test))
Pengeluaran:
## [1] "Accuracy for test 0.784688995215311"
Anda mempunyai skor 78 peratus untuk set ujian. Anda boleh meniru latihan yang sama dengan set data latihan.
Langkah 7) Tentukan parameter hiper
Pokok keputusan dalam R mempunyai pelbagai parameter yang mengawal aspek kesesuaian. Di perpustakaan pohon keputusan rpart, anda boleh mengawal parameter menggunakan fungsi rpart.control (). Dalam kod berikut, anda memperkenalkan parameter yang akan anda tetapkan. Anda boleh merujuk sketsa untuk parameter lain.
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
Kami akan meneruskan seperti berikut:
- Fungsi konstruk untuk mengembalikan ketepatan
- Tentukan kedalaman maksimum
- Tentukan bilangan minimum sampel yang mesti dimiliki oleh node sebelum dapat berpisah
- Tentukan bilangan minimum sampel yang mesti dimiliki simpul daun
Anda boleh menulis fungsi untuk menunjukkan ketepatan. Anda hanya membungkus kod yang anda gunakan sebelum ini:
- ramalan: prediksi_unseen <- ramalan (muat, ujian_ data, jenis = 'kelas')
- Hasilkan jadual: table_mat <- table (data_test $ selamat, ramalkan_unseen)
- Ketepatan pengiraan: ketepatan_Test <- jumlah (diag (table_mat)) / jumlah (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}
Anda boleh cuba menyesuaikan parameter dan melihat apakah anda dapat meningkatkan model daripada nilai lalai. Sebagai peringatan, anda perlu mendapatkan ketepatan yang lebih tinggi daripada 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)
Pengeluaran:
## [1] 0.7990431
Dengan parameter berikut:
minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0
Anda mendapat prestasi yang lebih tinggi daripada model sebelumnya. Tahniah!
Ringkasan
Kita dapat meringkaskan fungsi untuk melatih algoritma pohon keputusan dalam R
Perpustakaan |
Objektif |
fungsi |
kelas |
parameter |
perincian |
---|---|---|---|---|---|
bahagian |
Latih pokok klasifikasi di R |
bahagian () |
kelas |
formula, df, kaedah | |
bahagian |
Melatih pokok regresi |
bahagian () |
anova |
formula, df, kaedah | |
bahagian |
Petak pokok |
rpart.plot () |
model yang dipasang | ||
pangkalan |
meramalkan |
meramalkan() |
kelas |
model yang dipasang, jenis | |
pangkalan |
meramalkan |
meramalkan() |
prob |
model yang dipasang, jenis | |
pangkalan |
meramalkan |
meramalkan() |
vektor |
model yang dipasang, jenis | |
bahagian |
Parameter kawalan |
rpart.control () |
minsplit |
Tetapkan bilangan pemerhatian minimum di simpul sebelum algoritma melakukan pemisahan |
|
minbucket |
Tetapkan bilangan pemerhatian minimum dalam nota akhir iaitu daun |
||||
jarak maksimum |
Tetapkan kedalaman maksimum mana-mana simpul pokok akhir. Node akar diperlakukan dengan kedalaman 0 |
||||
bahagian |
Model kereta api dengan parameter kawalan |
bahagian () |
formula, df, kaedah, kawalan |
Catatan: Latih model pada data latihan dan uji prestasi pada set data yang tidak kelihatan, iaitu set ujian.