Karar Ağaçlarında Random Forest Tekniği ile Sınıflandırma: Örnek Python Uygulaması

Random forest, birden fazla karar ağacını kullanarak daha uyumlu modeller üreterek daha isabetli sınıflandırma yapmaya çalışan bir sınıflandırma modelidir. Bu yazımızda Python ile basit bir random forest sınıflandırması uygulaması yapacağız.

Kütüphaneleri İndirme, Çalışma Dizinini Ayarlama, Veri Setini İndirme

Veri setini buradan indirebilirsiniz.

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
os.chdir('Calisma_Dizniniz')
dataset = pd.read_csv('SosyalMedyaReklamKampanyası.csv')

Spyder’ın variable explorer penceresinden veri setimizi görelim:

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.

Veri Setini Bağımlı ve Bağımsız Niteliklere Ayırmak

Yukarıda gördüğümüz niteliklerden bağımsız değişken olarak sadece yaş ve tahmini maaşı kullanacağız.

X = dataset.iloc[:, [2,3]].values
y = dataset.iloc[:, 4].values

Veriyi Eğitim ve Test Olarak Ayırmak

Veri setinde 400 kayıt var bunun 300’ünü eğitim, 100’ünü test için ayıralım.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)

Normalizasyon – Feature Scaling

Bağımsız değişkenlerden yaş ile tahmini gelir aynı birimde olmadığı için feature scaling uygulayacağız.

from sklearn.preprocessing import StandardScaler
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.transform(X_test)

Random Forest Modeli Oluşturmak ve Eğitmek

Şimdi scikit-learn kütüphanesi ensemble modülü RandomForestClassifier sınıfından yaratacağımız classifier nesnesi ile modelimiz oluşturalım.

from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(n_estimators=10, criterion='entropy', random_state=0)
classifier.fit(X_train, y_train)

n_estimator parametresiyle kaç tane ağaç kullanacağımızı belirtiyoruz. Varsayılan değer 10, biz de onu kullanıyoruz. Yazmasaydık zaten 10 olarak kabul edilecekti. İkinci parametre criterion, bilgi kazancını kullanmak için entropy değerini seçiyoruz.

Test Seti ile Tahmin Yapmak

Ayırdığımız test setimizi (X_test) kullanarak oluşturduğumuz model ile tahmin yapalım  ve elde ettiğimiz set (y_pred) ile hedef değişken (y_test) test setimizi karşılaştıralım.

y_pred = classifier.predict(X_test)

Tahmin ile gerçek sonuçların karşılaştırılmasını tablo olarak görelim:

Solda gerçek, sağda ise tahmin değerleri görüyoruz. 9 indeksli kayıt satın almamış iken satın aldı diye sınıflandırılmış. Yani yanlışa doğru demiş, false positive (FP).

Hata Matrisini Oluşturma

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
cm
array([[
63, 5],
[3, 29]])

Matriste gördüğümüz gibi 8 adet hatalı sınıflandırma var.

Eğitim Seti İçin Grafik

 from matplotlib.colors import ListedColormap
 X_set, y_set = X_train, y_train
 X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                      np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
 plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
              alpha = 0.75, cmap = ListedColormap(('blue', 'yellow')))
 plt.xlim(X1.min(), X1.max())
 plt.ylim(X2.min(), X2.max())
 for i, j in enumerate(np.unique(y_set)):
        plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                    c = ListedColormap(('blue', 'yellow'))(i), label = j)
 plt.title('Random Forest (Eğitim seti)')
 plt.xlabel('Yaş')
 plt.ylabel('Maaş')
 plt.legend()
 plt.show()

Test Seti İçin Grafik

from matplotlib.colors import ListedColormap
X_set, y_set = X_test, y_test
X1, X2 = np.meshgrid(np.arange(start = X_set[:, 0].min() - 1, stop = X_set[:, 0].max() + 1, step = 0.01),
                     np.arange(start = X_set[:, 1].min() - 1, stop = X_set[:, 1].max() + 1, step = 0.01))
plt.contourf(X1, X2, classifier.predict(np.array([X1.ravel(), X2.ravel()]).T).reshape(X1.shape),
             alpha = 0.75, cmap = ListedColormap(('blue', 'yellow')))
plt.xlim(X1.min(), X1.max())
plt.ylim(X2.min(), X2.max())
for i, j in enumerate(np.unique(y_set)):
       plt.scatter(X_set[y_set == j, 0], X_set[y_set == j, 1],
                   c = ListedColormap(('blue', 'yellow'))(i), label = j)
plt.title('Random Forest (Test seti)')
plt.xlabel('Yaş')
plt.ylabel('Maaş')
plt.legend()
plt.show()

8 tane hatalı sınıflandırma yapmış demiştik. Sayalım: Mavi bölgede 3 tane sarı, sarı bölgede 5 tane mavi var. Test seti grafiğinde bazı bölgeler mavi ile işaretlendiği halde içinde hiç mavi nokta yok. Bu istenen bir şey değil. Sınıflandırmada genel hedef aşırı öğrenmeye (overfit) dalmadan en fazla doğru sonucu (accuracy) tahmin etmektir.

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 (4 yorum)
özay
özay Yanıtla
- 22:10

import os
os.chdir(‘Calisma_Dizniniz’)

Bende Jupiterde hata veriyor…

    Erkan ŞİRİN
    Erkan ŞİRİN Yanıtla
    - 19:46

    Merhaba buraya kendi veri dosyanızın bulunduğu adresi yazacaksınız. Örneğin: os.chdir(“C:\\Users\\toshiba”) ayrıca import os yapmış olmalısınız. İyi çalışmalar…

      özay
      özay Yanıtla
      - 23:27

      import numpy as np
      import matplotlib.pyplot as plt
      import pandas as pd
      import os
      os.chdir(‘C:\Users\ozayo\Desktop\blog’)
      dataset = pd.read_csv(‘istanbul.csv’)

      File “”, line 5
      os.chdir(‘C:\Users\ozayo\Desktop\blog’)
      ^
      SyntaxError: (unicode error) ‘unicodeescape’ codec can’t decode bytes in position 2-3: truncated \UXXXXXXXX escape

        Erkan ŞİRİN
        Erkan ŞİRİN Yanıtla
        - 21:19

        Windows’ta ters slash \\ kullanılmalıdır. Tek ters slash kaçma anlamına geldiğinden sıkıntı olabilir.

Bir yanıt yazın

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

×

Bir Şeyler Ara