Anasayfa / Makine Öğrenmesi (Machine Learning) / Sınıflandırma / Karar Ağacı (Decision Tree) / Karar Ağacı ile Sınıflandırma (Classification with Decision Tree): R ile Örnek Uygulama

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)

Hakkında Erkan ŞİRİN

2014'ten beri hem akademik alanda hem de sektörde pratik anlamda büyük veri ve veri bilimi ile ilgili çalışmalar yürütmektedir. Halihazırda İmpektra Bilişim A.Ş.'de büyük veri yöneticisi olarak çalışmakta olup aynı zamanda Gazi Üniversitesi Yönetim Bilişim Sistemleri doktora öğrencisidir. Büyük veri ve veri bilimi ile ilgili birçok kurum ve şirkete eğitimler vermekte ve projeler icra etmektedir. Çalışma alanları: büyük veri platformlarının kurulum ve yönetimi, büyük veri üzerinde makine öğrenmesi, olağan dışılık tespiti, sahtecilik tespiti, veri hazırlama sürecidir.

GÖZ ATMAK İSTEYEBİLİRSİNİZ

Uçtan Uca Makine Öğrenmesi Örneği: Titanik Gemi Kazası Uygulaması

21. yüzyılın en popüler mesleklerinden biri olan veri bilimi; çok kısaca, geçmiş gözlem değerlerine bakarak …

2 yorumlar

  1. 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.

    • Erkan ŞİRİN

      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…

Bir cevap yazın

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