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)

Karar Ağacı ile Sınıflandırma (Classification with Decision Tree): R ile Örnek Uygulama” için 2 yorum

  • 9 Ekim 2017 tarihinde, saat 20:32
    Permalink

    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.

    Yanıtla
    • 9 Ekim 2017 tarihinde, saat 23:16
      Permalink

      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…

      Yanıtla

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Fazla kilolardan mı şikayetçisiniz? O halde neden mide küçültme ameliyatı nı denemiyorsunuz. mide küçültme ameliyatı, zayıflamak isteyenler için kesin bir çözüm sunuyor. Üstelik çok kısa bir süre içersinde hayal ettiğiniz kilolara kavuşabilirsiniz.
Caminin önünde ve iki yanında geniş cami halısı dış avlusu olup bunun çevresi pencereli duvarlarla çevrilidir. Bu avulya 3 ü cephede olmak üzere, 8 kapıdan girilir. Şadırvan avlusu, 26 adet granit mermer ve porfir sütuna oturtulmuş, 30 kubbeyle çevrili geniş alandır. Mermer döşemeli bu geniş sahanın ortasında 6 mermer sütunlu şadırvan, sahanın azametini gösterir. Şadırvanın kemerleri, kabartma olarak Rumi geçmelerle ve köşebentleri, kabartma, lale ve karanfil motifleriyle bezelidir. İç avluya, biri cepheden ikisi yandan olmak üzere herbiri merdivenli 3 kapıdan girilmektedir. Bu kapılarla dış avlunun cümle kapısı, ozamana kadar benzeri görülmemiş bronz kapılardır. Kubbeden aşağı doğru indikçe mekan yayılmaktadır. Bu piramidel yükselme ve yayılma sonucunda göz yanlara ve yukarıya doğru aynı mesafelere ulaşmaktadır. Bu özelliklerden dolayı, mekanın neresinde olursanız olun, bütün mekana hakim görüş sağlarsınız. Kubbe yaklaşık olarak 43 metre yükseklikte ve köşeleri pandantifle doldurulmuş 4 muazzam kemer üzerine oturtulmaktadır. Caminin su basmanı üzerinde olması ve kubbe yüksekliği nedeniyle pencereleri oldukça fazladır. Böylece caminin içini süsleyen binlerce çini ve kalem işleri tatlı ışık altında görülmektedir. Caminin içindeki en önemli unsur, ince işçilikle yontulmuş mermerden yapılma mihraptır. Bitişik duvarları, seramik çinilerle kaplanmıştır fakat çevresindeki çok sayıdaki pencere onu daha az ihtişamlı gösterir. Mihrabın sağında, Caminin en kalabalık halinde dahi olsa, herkesin imamı rahatça duyabileceği şekilde dekore edilmiş mimber bulunur. Caminin içi her katında alçak düzeyde olmak üzere 50 farklı lale deseninden üretilmiş 20binden fazla çini ile döşenmiştir. Alt seviyelerdeki çiniler, geleneksel galerideki çinilerin desenleri çiçekler meyveler ve servilerle gösterişli ve ihtişamlıdır.