Python ile Karar Ağacı (Decision Tree with Python)
Karar ağaçları sınıflandırma problemlerinin çözümünde yaygın olarak kullanılan algoritmalardandır. Anlaşılması diğer algoritmalara göre daha kolaydır. Karar ağacında öncelikle ağaç oluşturulur ve eldeki veri bu ağaca uygulanır. Bu yazımızla Python dilinde karar ağacı kullanarak sınıflandırma 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)
Karar Ağacı Modeli Oluşturmak ve Eğitmek
Şimdi scikit-learn kütüphanesi tree modülü DecisionTreeClassifier sınıfından yaratacağımız classifier nesnesi ile modelimiz oluşturalım. İlk parametrede ağaç oluşturma kriteri olarak entropi seçildi.
from sklearn.tree import DecisionTreeClassifier classifier = DecisionTreeClassifier(criterion = 'entropy', random_state=0) classifier.fit(X_train, y_train)
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. 13 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) print(cm)
Çıktı:
[[62 6] [ 3 29]]
Matriste gördüğümüz gibi 9 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('Karar Ağacı (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('Karar Ağacı (Test seti)') plt.xlabel('Yaş') plt.ylabel('Maaş') plt.legend() plt.show()
9 tane hatalı sınıflandırma yapmış demiştik. Sayalım: Mavi bölgede 3 tane sarı, sarı bölgede 7 tane mavi var.
ImportError: cannot import name ‘DecisionTreeClassifier’ bu hatayı alıyorum nasıl düzeltebilirim?
from sklearn.tree import DecisionTreeClassifier
classifier = DecisionTreeClassifier (criterion = ‘entropy’, random_state=0)
classifier.fit(X_train, y_train)
Bu şekilde düzeltebilirsin.