Karar Ağaçlarında Random Forest Tekniği ile Sınıflandırma: Örnek R Uygulaması
Python ile yaptığımız Random Forest ö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')
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])
Normalizasyon sonrasında veri setimizdeki dönüşümü görelim:
Evet şimdi taş ve maaş üzerinde işlem yapabiliriz artık.
Random Forest Modeli Oluşturmak ve Eğitmek
R’ın randomForest paketi içindeki randomForest fonksiyonunu model oluşturmak için kullanacağız.
library(randomForest) classifier = randomForest(x = training_set[-3], y = training_set\$SatinAldiMi, ntree = 10)
İlk parametremiz nitelikler matrisi (bağımsız değişkenler) x, ikinci parametre bağımlı değişken y (SatinAldiMi), üçüncü parametre ntree, kaç tane ağaç kullanılacağı.
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 2 4 5 9 12 18 19 20 22 29 32 34 35 38 45 46 48 52 66 69 74 75 82 84 .... 0 0 0 0 0 0 1 1 0 0 0 0 0 0 0 0 0 0 0 0 1 0 0 1 ....
Hata Matrisini Oluşturmak
cm = table(test_set[, 3], y_pred) cm y_pred 0 1 0 58 6 1 9 27
Toplam 15 hatalı sınıflandırma yapmış Random Forest.
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) plot(set[, -3], main = 'Random Forest Sınıflandırma (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 = 'Random Forest Sınıflandırma (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'))