Karar Ağaçları nedir?
Karar Ağaçları , hem sınıflandırma hem de regresyon görevlerini gerçekleştirebilen çok yönlü Makine Öğrenimi algoritmasıdır. Karmaşık veri kümelerini sığdırabilen çok güçlü algoritmalardır. Ayrıca karar ağaçları, günümüzde mevcut olan en güçlü Makine Öğrenimi algoritmalarından biri olan rastgele ormanların temel bileşenleridir.
Karar ağaçlarının eğitilmesi ve görselleştirilmesi
R örneğinde ilk karar ağacınızı oluşturmak için, bu Karar Ağacı eğitiminde aşağıdaki gibi ilerleyeceğiz:
- 1. Adım: Verileri içe aktarın
- 2. Adım: Veri kümesini temizleyin
- 3. Adım: Eğitim / test seti oluşturun
- 4. Adım: Modeli oluşturun
- 5. Adım: Tahmin yapın
- 6. Adım: Performansı ölçün
- Adım 7: Hiper parametreleri ayarlayın
Adım 1) Verileri içe aktarın
Titanic'in kaderini merak ediyorsanız bu videoyu Youtube üzerinden izleyebilirsiniz. Bu veri setinin amacı, buzdağıyla çarpışmadan sonra hangi insanların hayatta kalma olasılığının daha yüksek olduğunu tahmin etmektir. Veri kümesi 13 değişken ve 1309 gözlem içerir. Veri kümesi, X değişkeni ile sıralanır.
set.seed(678)path <- 'https://raw.githubusercontent.com/guru99-edu/R-Programming/master/titanic_data.csv'titanic <-read.csv(path)head(titanic)
Çıktı:
## 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)
Çıktı:
## 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
Baş ve kuyruk çıkışından verilerin karıştırılmadığını fark edebilirsiniz. Bu büyük bir sorun! Verilerinizi bir tren seti ile test seti arasında böldüğünüzde, yalnızca 1. ve 2. sınıf yolcuyu seçeceksiniz (3. sınıftan hiçbir yolcu, gözlemlerin ilk yüzde 80'inde değildir), yani algoritma 3. sınıf yolcunun özellikleri. Bu hata, kötü tahmine yol açacaktır.
Bu sorunun üstesinden gelmek için sample () işlevini kullanabilirsiniz.
shuffle_index <- sample(1:nrow(titanic))head(shuffle_index)
Karar ağacı R kodu Açıklama
- sample (1: nrow (titanik)): 1'den 1309'a kadar rastgele bir indeks listesi oluşturun (yani maksimum satır sayısı).
Çıktı:
## [1] 288 874 1078 633 887 992
Bu dizini titanik veri setini karıştırmak için kullanacaksınız.
titanic <- titanic[shuffle_index, ]head(titanic)
Çıktı:
## 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
Adım 2) Veri kümesini temizleyin
Verilerin yapısı bazı değişkenlerin NA'ya sahip olduğunu göstermektedir. Aşağıdaki gibi yapılacak veri temizliği
- Değişkenleri eve bırakın. Test, kabin, ad, X ve bilet
- Pclass için faktör değişkenleri oluşturun ve hayatta kaldı
- NA'yı bırak
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)
Kod Açıklama
- (-c (ev.dest, kabin, isim, X, bilet)) seçin: Gereksiz değişkenleri bırakın
- pclass = faktör (pclass, düzeyler = c (1,2,3), etiketler = c ('Upper', 'Middle', 'Lower')): Değişken pclass'a etiket ekleyin. 1 Yukarı, 2 MIddle olur ve 3 daha küçük olur
- faktör (hayatta kalan, düzeyler = c (0,1), etiketler = c ('Hayır', 'Evet')): Kalan değişkene etiket ekleyin. 1 Hayır olur ve 2 Evet olur
- na.omit (): NA gözlemlerini kaldırın
Çıktı:
## 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…
Adım 3) Eğitim / test seti oluşturun
Modelinizi eğitmeden önce iki adımı gerçekleştirmeniz gerekir:
- Bir tren ve test seti oluşturun: Modeli tren setinde eğitirsiniz ve tahmini test setinde test edersiniz (yani görünmeyen veriler)
- Konsoldan rpart.plot yükleyin
Yaygın uygulama verileri 80 / 20'ye bölmek, verilerin yüzde 80'i modeli eğitmeye ve yüzde 20'si tahminlerde bulunmaktır. İki ayrı veri çerçevesi oluşturmanız gerekir. Modelinizi oluşturmayı bitirene kadar test setine dokunmak istemezsiniz. Üç bağımsız değişken alan create_train_test () işlev adı oluşturabilirsiniz.
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, ])}}
Kod Açıklama
- işlev (veri, boyut = 0,8, tren = DOĞRU): İşlevdeki değişkenleri ekleyin
- n_row = nrow (data): Veri kümesindeki satırların sayısını sayın
- total_row = size * n_row: Tren kümesini oluşturmak için n'inci satırı döndürür
- train_sample <- 1: total_row: n'inci satırlara kadar olan ilk satırı seçin
- if (train == TRUE) {} else {}: Koşul true olarak ayarlanmışsa, tren setini, aksi takdirde test setini geri getirin.
Fonksiyonunuzu test edebilir ve boyutu kontrol edebilirsiniz.
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)
Çıktı:
## [1] 836 8
dim(data_test)
Çıktı:
## [1] 209 8
Tren veri kümesinde 1046 satır varken, test veri kümesinde 262 satır bulunur.
Randomizasyon işleminin doğru olup olmadığını doğrulamak için table () ile birlikte prop.table () işlevini kullanırsınız.
prop.table(table(data_train$survived))
Çıktı:
#### No Yes## 0.5944976 0.4055024
prop.table(table(data_test$survived))
Çıktı:
#### No Yes## 0.5789474 0.4210526
Her iki veri setinde de hayatta kalanların sayısı aynı, yaklaşık yüzde 40.
Rpart.plot yükleyin
rpart.plot, conda kitaplıklarında bulunmaz. Konsoldan kurabilirsiniz:
install.packages("rpart.plot")
Adım 4) Modeli oluşturun
Modeli oluşturmaya hazırsınız. Rpart karar ağacı işlevinin sözdizimi şöyledir:
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
Bir sınıfı tahmin ettiğiniz için sınıf yöntemini kullanırsınız.
library(rpart)library(rpart.plot)fit <- rpart(survived~., data = data_train, method = 'class')rpart.plot(fit, extra = 106
Kod Açıklama
- rpart (): Modele uyacak işlev. Argümanlar:
- hayatta ~ .: Karar Ağaçlarının Formülü
- data = data_train: Veri Kümesi
- method = 'class': Bir ikili model sığdır
- rpart.plot (sığdır, ekstra = 106): Ağacın grafiğini çizin. Ekstra özellikler, 2. sınıfın olasılığını görüntülemek için 101'e ayarlanmıştır (ikili yanıtlar için kullanışlıdır). Diğer seçenekler hakkında daha fazla bilgi için vinyete başvurabilirsiniz.
Çıktı:
Kök düğümden başlıyorsunuz (derinlik 0'a 3, grafiğin en üstünde):
- En tepede, genel hayatta kalma olasılığı var. Kazadan kurtulan yolcu oranını gösterir. Yolcunun yüzde 41'i kurtuldu.
- Bu düğüm, yolcunun cinsiyetinin erkek olup olmadığını sorar. Eğer evet ise, o zaman kökün sol alt düğümüne (derinlik 2) inersiniz. Yüzde 63'ü hayatta kalma olasılığı yüzde 21 olan erkek.
- İkinci düğümde, erkek yolcunun 3,5 yaşın üzerinde olup olmadığını sorarsınız. Evetse, hayatta kalma şansı yüzde 19'dur.
- Hangi özelliklerin hayatta kalma olasılığını etkilediğini anlamak için böyle devam edin.
Karar Ağaçlarının birçok özelliğinden birinin çok az veri hazırlığı gerektirmeleridir. Özellikle, özellik ölçeklendirme veya merkezleme gerektirmezler.
Varsayılan olarak, rpart () işlevi notu bölmek için Gini safsızlık ölçüsünü kullanır . Gini katsayısı ne kadar yüksekse, düğüm içindeki daha farklı örnekler.
Adım 5) Bir tahminde bulunun
Test veri kümenizi tahmin edebilirsiniz. Tahmin yapmak için, tahmin () işlevini kullanabilirsiniz. R karar ağacı için temel tahmin sözdizimi şöyledir:
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
Çarpışmadan sonra hangi yolcuların hayatta kalma olasılığının daha yüksek olduğunu test setinden tahmin etmek istiyorsunuz. Bu 209 yolcu arasından hangisinin hayatta kalıp kalmayacağını bileceğiniz anlamına gelir.
predict_unseen <-predict(fit, data_test, type = 'class')
Kod Açıklama
- tahmin (uyum, veri_test, tür = 'sınıf'): Test setinin sınıfını (0/1) tahmin edin
Başaramayan yolcuyu ve yapanları test etmek.
table_mat <- table(data_test$survived, predict_unseen)table_mat
Kod Açıklama
- tablo (data_test $ hayatta kaldı, tahmin_görünmedi): Kaç yolcunun hayatta kalanlar olarak sınıflandırıldığını ve vefat ettiğini saymak için R'deki doğru karar ağacı sınıflandırmasına kıyasla bir tablo oluşturun
Çıktı:
## predict_unseen## No Yes## No 106 15## Yes 30 58
Model doğru bir şekilde 106 ölü yolcu tahmin etti, ancak hayatta kalan 15 kişiyi ölü olarak sınıflandırdı. Benzetme yoluyla, model, ölü oldukları ortaya çıkan 30 yolcuyu kazazede olarak yanlış sınıflandırdı.
Adım 6) Performansı ölçün
Karışıklık matrisi ile sınıflandırma görevi için bir doğruluk ölçüsü hesaplayabilirsiniz :
Karışıklık matris sınıflandırma performansını değerlendirmek için daha iyi bir seçimdir. Genel fikir, Gerçek örneklerin kaç kez Yanlış olarak sınıflandırıldığını saymaktır.
Karışıklık matrisindeki her satır gerçek bir hedefi temsil ederken, her sütun tahmin edilen bir hedefi temsil eder. Bu matrisin ilk satırı ölü yolcuları (False sınıfı) dikkate alır: 106 doğru şekilde ölü ( Gerçek negatif ) olarak sınıflandırılırken, geri kalanı yanlışlıkla hayatta kalan olarak sınıflandırılmıştır ( Yanlış pozitif ). İkinci sıra hayatta kalanları kabul eder, pozitif sınıf 58 ( Gerçek pozitif ) iken Gerçek negatif 30'dur.
Doğruluk testini kafa karışıklığı matrisinden hesaplayabilirsiniz :
Matrisin toplamı üzerinden gerçek pozitif ve gerçek negatifin oranıdır. R ile aşağıdaki gibi kodlayabilirsiniz:
accuracy_Test <- sum(diag(table_mat)) / sum(table_mat)
Kod Açıklama
- sum (diag (table_mat)): Köşegenin toplamı
- toplam (tablo_mat): Matrisin toplamı.
Test setinin doğruluğunu yazdırabilirsiniz:
print(paste('Accuracy for test', accuracy_Test))
Çıktı:
## [1] "Accuracy for test 0.784688995215311"
Test seti için yüzde 78 puanınız var. Aynı alıştırmayı eğitim veri kümesiyle çoğaltabilirsiniz.
Adım 7) Hiper parametreleri ayarlayın
R'deki karar ağacı, uyumun yönlerini kontrol eden çeşitli parametrelere sahiptir. Rpart karar ağacı kitaplığında, parametreleri rpart.control () işlevini kullanarak kontrol edebilirsiniz. Aşağıdaki kodda, ayarlayacağınız parametreleri tanıtacaksınız. Diğer parametreler için vinyete başvurabilirsiniz.
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
Aşağıdaki gibi ilerleyeceğiz:
- Doğruluğu döndürmek için işlev oluşturun
- Maksimum derinliği ayarlayın
- Bir düğümün bölünmeden önce sahip olması gereken minimum örnek sayısını ayarlayın
- Bir yaprak düğümün sahip olması gereken minimum örnek sayısını ayarlayın
Doğruluğu görüntülemek için bir işlev yazabilirsiniz. Daha önce kullandığınız kodu sarmalamanız yeterlidir:
- tahmin: tahmin_unseen <- tahmin (sığdır, veri_ testi, tür = 'sınıf')
- Tablo üretin: table_mat <- tablo (data_test $ kaldı, tahmin_görünmeyen)
- Hesaplama doğruluğu: doğruluk_ test <- toplam (diag (tablo_mat)) / toplam (tablo_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}
Parametreleri ayarlamayı deneyebilir ve modeli varsayılan değerin üzerinde iyileştirip iyileştiremeyeceğinizi görebilirsiniz. 0,78'den daha yüksek bir doğruluk elde etmeniz gerektiğini hatırlatmak isteriz.
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)
Çıktı:
## [1] 0.7990431
Aşağıdaki parametre ile:
minsplit = 4minbucket= round(5/3)maxdepth = 3cp=0
Önceki modelden daha yüksek bir performans elde edersiniz. Tebrikler!
Özet
R'de bir karar ağacı algoritması eğitmek için işlevleri özetleyebiliriz
Kütüphane |
Amaç |
işlevi |
sınıf |
parametreleri |
detaylar |
---|---|---|---|---|---|
parça |
R'de tren sınıflandırma ağacı |
rpart () |
sınıf |
formül, df, yöntem | |
parça |
Tren regresyon ağacı |
rpart () |
Anova |
formül, df, yöntem | |
parça |
Ağaçları planla |
rpart.plot () |
takılı model | ||
temel |
tahmin etmek |
tahmin () |
sınıf |
takılı model, tip | |
temel |
tahmin etmek |
tahmin () |
araştırma |
takılı model, tip | |
temel |
tahmin etmek |
tahmin () |
vektör |
takılı model, tip | |
parça |
kontrol parametreleri |
rpart.control () |
dakika bölünmüş |
Algoritma bir bölünme gerçekleştirmeden önce düğümdeki minimum gözlem sayısını ayarlayın |
|
Minbucket |
Son notta, yani yaprakta minimum gözlem sayısını ayarlayın. |
||||
Maksimum derinlik |
Son ağacın herhangi bir düğümünün maksimum derinliğini ayarlayın. Kök düğüme 0 derinliğinde işlem yapılır |
||||
parça |
Kontrol parametresiyle eğitme modeli |
rpart () |
formül, df, yöntem, denetim |
Not: Modeli bir eğitim verisi üzerinde eğitin ve performansı görünmeyen bir veri kümesinde, yani test kümesinde test edin.