Karar Ağacı ile Sınıflandırma (Classification with Decision Tree): R ile Örnek Uygulama
Python ile yaptığımız Karar Ağacı örneğini bu yazımızda R ile yapacağız.
Çalışma Dizinini Ayarlama, Veri Setini İndirme
Veri setini buradan indirebilirsiniz.
setwd('Calisma_Dizininiz') dataset = read.csv('SosyalMedyaReklamKampanyası.csv', encoding = 'UTF-8')
setwd('Calisma_Dizininiz') dataset = read.csv('SosyalMedyaReklamKampanyası.csv', encoding = 'UTF-8')
Veri Seti Görünüm
Veriyi Anlamak
Yukarıda gördüğümüz veri seti beş nitelikten oluşuyor. Veri seti bir sosyal medya kayıtlarından derlenmiş durumda. KullaniciID müşteriyi belirleyen eşsiz rakam, Cinsiyet, Yaş, Tahmini Gelir yıllık tahmin edilen gelir, SatinAldiMi ise belirli bir ürünü satın almış olup olmadığı, hadi lüks araba diyelim. Bu veri setinde kolayca anlaşılabileceği gibi hedef değişkenimiz SatinAldiMi’dir. Diğer dört nitelik ise bağımsız niteliklerdir. Bu bağımsız niteliklerle bağımlı nitelik (satın alma davranışının gerçekleşip gerçekleşmeyeceği) tahmin edilecek.
Bağımsız değişkenlerin hepsini analizde kullanmayacağız. Analiz için kullanacağımız nitelikleri seçelim:
dataset = dataset[3:5]
3,4 ve 5’inci nitelikleri alacağımız için parantez içine 3:5 dedik. Yeni veri setimizi de görelim:
Hedef niteliğimiz SatinAldiMi niteliğini factor yapalım.
dataset\$SatinAldiMi = factor(dataset\$SatinAldiMi, levels = c(0, 1))
Veri Setini Eğitim ve Test Olarak Ayırmak
Aynı sonuçları almak için random değeri belirlemek için bir sayı belirliyoruz. 123. split fonksiyonu ile hangi kayıtların eğitim hangi kayıtların test grubunda kalacağını damgalıyoruz. Sonra bu damgalara göre ana veri setinden yeni eğitim ve test setlerini oluşturuyoruz.
library(caTools) set.seed(123) split = sample.split(dataset\$SatinAldiMi, SplitRatio = 0.75) training_set = subset(dataset, split == TRUE) test_set = subset(dataset, split == FALSE)
Yaş ile maaş aynı ölçekte olmadığı için bu nitelikleri normalizasyona tabi tutuyoruz.
training_set[-3] = scale(training_set[-3]) test_set[-3] = scale(test_set[-3])
Naive Bayes Modeli Oluşturmak ve Eğitmek
R’ın rpart paketi içindeki rpart nesnesini model oluşturmak için kullanacağız.
library(rpart) classifier = rpart(formula = SatinAldiMi ~ ., data = training_set)
İlk parametremiz formül; bağımlı değişken solda ve bağımsız değişkenleri temsilen nokta sağda. İkinci parametremiz eğitim veri setimiz.
Test Seti ile Tahmin Yapmak
Eğittiğimiz modeli ve test setini kullanarak tahmin yapalım ve bakalım modelimiz ne kadar isabetli sınıflandırma yapıyor.
y_pred = predict(classifier, newdata = test_set[-3]) y_pred
Sınıflandırıcımız her bir kaydın aldı veya almadı sınıflarına ait olasılıklarını hesaplamış. Buna göre büyük olan rakam hangi sınıfta ise tahmin o sınıfa ait olacaktır. Ancak burada şöyle bir sıkıntı var. Biz y_pred değişkenini hata matrisine bu haliyle sokar isek hata alırız. Çünkü hata matrisi gerçek sonuçlar ile tahmin sonuçlarını birebir karşılaştırıp hata matrisini oluşturuyor. Bunu sorunun oluşmasını engellemek için predict() fonksiyonuna bir parametre eklememiz yeterlidir.
y_pred = predict(classifier, newdata = test_set[-3], type = 'class') y_pred 2 4 5 9 12 18 19 20 22 29 32 34 35 38 45 46 48 52 66 69 74 75 82 84 85 86 87 89 103 ..... 0 0 0 0 0 0 1 1 0 0 1 0 1 0 0 0 0 0 0 0 1 0 0 1 0 1 0 0 1 .....
Hata Matrisini Oluşturmak
cm = table(test_set[, 3], y_pred) cm 0 1 0 53 11 1 6 30
Toplam 17 hatalı sınıflandırma yapmış Karar Ağacı.
Eğitim Seti Grafik
library(ElemStatLearn) set = training_set X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01) X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01) grid_set = expand.grid(X1, X2) colnames(grid_set) = c('Yas', 'TahminiMaas') y_grid = predict(classifier, newdata = grid_set, type = 'class') plot(set[, -3], main = 'Karar Ağacı (Eğitim seti)', xlab = 'Yaş', ylab = 'Maaş', xlim = range(X1), ylim = range(X2)) contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE) points(grid_set, pch = '.', col = ifelse(y_grid == 1, 'springgreen3', 'tomato')) points(set, pch = 21, bg = ifelse(set[, 3] == 1, 'green4', 'red3'))
Test Seti Grafik
library(ElemStatLearn) set = test_set X1 = seq(min(set[, 1]) - 1, max(set[, 1]) + 1, by = 0.01) X2 = seq(min(set[, 2]) - 1, max(set[, 2]) + 1, by = 0.01) grid_set = expand.grid(X1, X2) colnames(grid_set) = c('Yas', 'TahminiMaas') y_grid = predict(classifier, newdata = grid_set, type = 'class') plot(set[, -3], main = 'Karar Ağacı (Test seti)', xlab = 'Yaş', ylab = 'Maaş', xlim = range(X1), ylim = range(X2)) contour(X1, X2, matrix(as.numeric(y_grid), length(X1), length(X2)), add = TRUE) points(grid_set, pch = '.', col = ifelse(y_grid == 1, 'springgreen3', 'tomato')) points(set, pch = 21, bg = ifelse(set[, 3] == 1, 'green4', 'red3'))
Ağaç Çizimi
plot(classifier) plot(text)
Yazınızda yer alan Hedef niteliğimiz SatinAldiMi niteliğini factor yapalım. başlığı altındaki koda html tagları karışmış galiba.
birde bu örnek özelinde değil ancak SatinAldiMi değişkeni 2 durumlu değilde likert ölçekli bir konu -değişken olsaydı acaba nasıl bir çözüm olacaktı.
Örneğin aldığı üründen memnun olma durumu olsaydı (1.Memnun 2.Orta 3.Memnun değil)
yine karar ağacında nasıl bir çözüm izlenecekti.
Merhaba. İkazınız için teşekkürler. Enlighter eklentisi yüklenince dolar işaretlerini farklı algılamaya başlamış o yüzden \ ile önlem almak gerekti. Bu yazımızda hedef değişkenimiz sadece iki değer alabiliyor, satın adı almadı diye, yani binary. Sizin bahsettiğiniz likert ölçekte değişken ikiden fazla değer alabiliyor, yaygın olarak 5. Probleminiz ve veriniz hakkında bilgi sahibi olmadan fazla birşey söylemek zor, ancak Lineer Discriminant analizi olabilir. Ayrıca Hedef değişkeniniz aynı zamanda sıralı değişken muhtemelen bağımlı değişkenleriniz de aynı türdendir. Bunları sürekli değişken olarak kabul edip regresyon analizi de yapabilirsiniz. Kurduğunuz modelde örneğin çıkan değer 2.9 civarında ise siz bu sonucu memnun olarak kabul edebilirsiniz. Saygılarımızla, iyi çalışmalar…