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)

Yazar Hakkında
Toplam 174 yazı
Erkan ŞİRİN
Erkan ŞİRİN
10 yılı aşkın süredir yurtiçi ve yurtdışında sektörde büyük veri mühendisliği, platform yönetimi ve makine öğrenmesi ile ilgili çalışmalar yürütmekte ve aynı zamanda birçok kurum ve şirkete danışmanlık ve eğitimler vermektedir. Çalışma alanları: Data ve MLOps platformları, gerçek zamanlı veri işleme, değişen veriyi yakalama (CDC) ve Lakehouse.
Yorumlar (2 yorum)
erdem
erdem Yanıtla
- 20:32

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
    Erkan ŞİRİN Yanıtla
    - 23:16

    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 yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

×

Bir Şeyler Ara