Support Vector Machine (SVM) Algoritması-Makine Öğrenmesi-

M. Fatih Türkoğlu
4 min readJul 14, 2021

--

Support Vector Machine (Destek Vektör Makineleri diğer adıyla DVM yada SVM) sınıflandırma, regresyon ve aykırı değerleri bulmak için kullanılan denetimli (superwised) bir öğrenme tekniğidir. SVM algoritması classification kavramı adı altında gelişen ve diğer classification türlerinden farklı olan bir algoritmadır. Şimdi bu algoritmanın nasıl çalıştığına ve altında nasıl bir fikir yattığına bakalım.

Image by NewTech Dojo

SVM algoritması bir düzlem üzerine yerleştirilmiş 2 veya daha fazla nokta kümelerini ayırmak için doğrular çizer. 2 veri kümesi düşünüldüğünde bu doğrunun, iki kümenin noktaları için de maksimum uzaklıkta olmasını amaçlar. Karmaşık ama küçük ve orta ölçekteki veri setleri için uygundur. Bu anlattıklarımızı bir grafik üzerinde anlatalım.

Görüldüğü üzere iki veri kümesi grafik üzerinde görülmekte ve 3 doğrusal çizgi. Buradaki öncelikli amacımız veri kümelerinin ayıran bir doğru çizmek. Görüldüğü üzere L_1 doğrusu bu iki kümeyi ayırmakta en başarısız olanı. Diğer iki doğruya bakacak olursak L_2 mavi renkli noktaların oluşturduğu kümeye daha yakınken kırmızı veri kümesine daha uzak kalır. Buradaki dengesizlik yeni tahmin edilmesi istenen verinin daha hatalı bir tahminle sonuçlanmasına neden olacaktır. Bundan dolayı algoritma 2 veri kümesindeki birbirlerine en yakın olan verilerin (kırmızı ve mavi verilerin) arasındaki en fazla aralığı yakaladığı doğruyu çizmeyi tercih edecektir. Bu arada sınıflar arası çizilebilecek sonsuz adet doğru vardır ve bu çizilebilecek doğrulara karar doğruları adı verilir.

Bu iki sınıfı en iyi ayıran doğrunun (L_3) bölgeler arasında kalan alana margin denir. Margin ne kadar geniş olursa sınıflar okadar iyi ayrıştırılır. Bazı durumlarda veirler margin bölgesine girebilir. Bu duruma ‘Soft Margin’ denir. Hard Margin ise veri doğrusal olarak ayrılabiliyorsa çalışır.

Burada görüldüğü gibi her iki veri kümesine destek vektörleri çizilmiştir. Bu destek vektörleri referans alınarak SVM çizilebilecek en iyi doğruyu çizer (w.x+b=0). SVM lerde sınıflar +1 veya -1 olarak etiketlenir. Bundan dolayı karar doğrusu (hiper düzlem) üstünde kalan doğruya wx+b=1 altında kalan doğruya ise wx+b=-1 olarak yazılır.

Şimdi de SVM algoritmasını python kodlaması üzerinde görelim.

# Kütüphaneleri İndirme, Çalışma Dizinini Ayarlama, Veri Setini İndirme
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import os
os.chdir('\Games\PyCharm\PyCharm_Projects')
dataset = pd.read_csv('SosyalMedyaReklamKampanyasi.csv')

# Veri Setini Bağımlı ve Bağımsız Niteliklere Ayırmak
X = dataset.iloc[:, [2,3]].values
y = dataset.iloc[:, 4].values

# Veriyi Eğitim ve Test Olarak Ayırmak
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
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
from sklearn.svm import SVC
classifier = SVC(kernel='linear', random_state = 0)
classifier.fit(X_train, y_train)

# Test Seti ile Tahmin Yapmak
y_pred = classifier.predict(X_test)

# Hata Matrisini Oluşturma
from sklearn.metrics import confusion_matrix
cm = confusion_matrix(y_test, y_pred)
print(cm)

# Grafik Çizimi
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()
Kod Çıktı Grafiği
Kod Çıktı Terminali

--

--