Support Vector Machine (SVM) ile Sınıflandırma: Python Örnek Uygulaması

Sınıflandırma notları serimize devam ediyoruz. Support Vector Machine (Destek Vektör Makinesi desek nasıl durur bilmiyorum) sınıflandırma için kullanılan yöntemlerden birisidir.  Temel olarak iki sınıfı bir doğru veya düzlem ile birbirinden ayırmaya çalışır. Bu ayırmayı da sınırdaki elemanlara göre yapar.

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)

SVM Modeli Oluşturmak ve Eğitmek

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

from sklearn.svm import SVC
classifier = SVC(kernel='linear', random_state = 0)
classifier.fit(X_train, y_train)

Sınıf parametrelerinden biraz bahsedelim. kernel linear, her seferinde aynı sonuçları almak için de random_state=0 diyoruz.

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)

Yukarıda y_test (gerçek veri) ile modelin tahmin ettiği y_pred bir görüntü bulunuyor. gördüğümüz kadarıyla tüm tahminler doğru görünüyor ancak daha buradan göremediğimiz bir çok değer var. Neyse hata matrisinde görünür artık.

Hata Matrisini Oluşturma

Yaptığımız sınıflandırmanın doğruluğunu kontrol etme yöntemlerinden birisi de hata matrisi oluşturmaktır. Hata matrisi için scikit-learn kütüphanesi metrics modülü confusion_matrix fonksiyonunu kullanıyoruz.

from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)
[[66 2]
 [ 8 24]]

Bildiğiniz gibi 100 kayıtlık test verisi ayırmıştık. Yukarıda gördüğümüz hata matrisine göre 10 kayıt yanlış sınıflandırılmış, 90 kayıt doğru sınıflandırılmış. Lojistik regresyonda yanlış sınıflandırma sayısı 11 idi. K en yakın komşuda ise 7 idi. Grafiğimizi görelim:

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', 'green')))
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(('yellow', 'green'))(i), label = j)
plt.title('SVM (Eğitim Seti)')
plt.xlabel('Yaş')
plt.ylabel('Maaş')
plt.legend()
plt.show()

Şimdi grafiğimizi test setleri için çizelim. Bunun için yukarıdaki kodda veri setini ve etiket bilgilerini değiştirmek yeterli olur.

Yanlış sınıflandırılan 10 noktayı buradan sayabiliriz. Grafik lojistik regresyona çok benzedi. Zaten hata sayımız da birbirine çok yakındı.

Yazar Hakkında
Toplam 180 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 (6 yorum)
Barış
Barış Yanıtla
- 14:17

Merhaba. Elimde 100 bin satırlık veri var. Ben bu verilerden text olanları sayıya çevirdim. Daha sonra ise SVM ile sınıflandırmaya soktum. Yaklaşık 5 saat oldu hala predict yapamadı. KNN de ise 5 dk da predict yaptı. Acaba sorun nedir.

    Erkan ŞİRİN
    Erkan ŞİRİN Yanıtla
    - 22:10

    Merhaba. Her algoritmanın sınıflandırma stratejisi farklı. SVM sınıflandırıcı büyük veriler ile performansı iyi değil maalesef. Ancak 5000 satır da çok fazla sayılmaz aslında. kaç nitelik var ona bakmak lazım? Başka ne sorun olabilir şuan için bilemem. Kodlarınızı incelemem gerekir.

      Barış
      Barış Yanıtla
      - 23:52

      Hocam öncelikle cevabınız için teşekkür ederim. 100k csv formatında veri var. 5 saat sonunda hesapladı çıkan oran 0.48 çok az değil mi? Hedef değişkene 6 adet nitelik ile modelleme yapıyorum. KNN oranı ise 0.57 çıktı.

        Erkan ŞİRİN
        Erkan ŞİRİN Yanıtla
        - 11:16

        O halde knn daha iyi

Barış
Barış Yanıtla
- 21:58

Tekrar merhaba hocam. Benim kullandığım label da 3500 adet farklı sınıf bulunmakta. Fakat ben bu kadar sınıfı ekranda göstermem mümkün değil. Nasıl öneride bulunursunuz.

    Erkan ŞİRİN
    Erkan ŞİRİN Yanıtla
    - 11:17

    Bu kadar çok kategoriyi sınıflandırmak çok kolay değil. Bu kategorileri daha aza indirgeme şansınız olurmu. Aklıma naive bayes geldi.

Bir yanıt yazın

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

×

Bir Şeyler Ara