Destek Vektör Makinesi (Support Vector Machine-SVM) (Makine Öğrenmesi-3)
Bu öğrenme yöntemi bir önceki yazımda bahsettiğim denetimli öğrenme yöntemi kapsamına girer. Hatırlatma amacıyla kısaca denetimli öğrenmeden bahsetmek gerekirse; denetimli öğrenmede, eğitim aşamasında verilerin sınıf etiketleri yani hangi sınıfa ait oldukları bellidir. Daha çok bilgi için önceki yazıma göz atmanızı tavsiye ederim. Şimdi Destek Vektör Makinesinden bahsedelim.
Destek vektör makinesi eğitim verilerindeki herhangi bir noktadan en uzak olan iki sınıf arasında bir karar sınırı bulan vektör uzayı tabanlı makine öğrenme yöntemi olarak tanımlanabilir [1]. Kısaca ve daha anlaşılır şekilde olarak bu algoritma Logistic Regression ile benzer bir sınıflandırma algoritmasıdır. İkisi de iki veriyi ayıran en iyi çizgiyi bulmaya çalışır. Desktek vektör makinesi herhangi bir parametre kullanmaz (nonparametric). Ek olarak bu algoritma çizilecek çizginin iki verinin de elemanlarına en uzak yerden geçecek şekilde olmasını sağlar. Aşağıdaki şekilde SVM’nin doğrusal ve doğrusal olmayan verilerde nasıl davrandığı bir şema olarak gösterilmiştir. SVM algoritması genelde verileri doğrusal olarak sınıflandırmaya çalışsa da bazı durumlarda bu mümkün olmayabiliyor.
Burada bilmemiz gereken bir terim de ‘margin’dir. İki sınıfı ayıran doğrunun bölgeler arasında kalan alana margin denir. Margin ne kadar geniş olursa sınıflar o kadar iyi ayrıştırılır. Bazı durumlarda veriler margin bölgesine girebilir. Bu duruma ‘Soft Margin’ denir. Hard Margin ise veri doğrusal olarak ayrılabiliyorsa çalışır.
C hiperparametresinden de kısaca bahsedelim. Bu parametre margin alanının ne kadar geniş veya dar olacağını belirler. C ne kadar büyükse margin o kadar dardır. Ters orantı var diyebiliriz.
En başta doğrusal olan ve doğrusal olmayan iki şekilde sınıflandırma yapılabileceğini söylemiştik. Peki bu sınıflandırmayı neye göre yapıyoruz. Verileri doğrusal olarak sınıflandıramadığımız zaman doğrusal olmayan sınıflandırmaya başvururuz. Bu da bize Çekirdek Hilesi yani Kernel Trick yapmamızı söyler. 2 boyutlu olan veriyi 3 boyutlu hale getirerek yani veriye yeni bir boyut kazandırarak sınıflandırma daha mümkün hale gelir. Aşağıdaki şekilde de bu durum görsele dökülmüştür. Bu şekilde daha kolay anlaşılabilir hale geldiğini düşünüyorum.
Şimdi Python ile bir SVM örneği yazalım. Bu çalışmada voice.csv veri setini kullandık. Kütüphaneleri ekledikten sonra veri setimizi okuduk. Ardından veri setinde kullanacağımız kısımları bir label değişkenine atadık.
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.svm import SVC
from sklearn.metrics import confusion_matrix
from sklearn.metrics import accuracy_scoredata = pd.read_csv('voice.csv')
label = data.iloc[:,-1:].values
Test ve eğitim setimizi oluşturduktan sonra SVC fonksiyonunu çağırarak çekirdeği (kernel) linear olarak ayarladık. Modelin başarı oranına balarak ‘poly’, ‘rbf’, ‘sigmoid’ ve ‘precomputed’ olarak da yazılabilirdi.
x_train, x_test, y_train, y_test = train_test_split(data.iloc[:,:-1],label,test_size=0.33,random_state=0)svc = SVC(kernel = ‘linear’)svc.fit(x_train,y_train)
Son olarak test setlerinde tahmin ettiğimiz verilerin doğruluğunu tespit ettik daha sonra da başarı oranına bakarak işlemleri sonlandırdık.
result = svc.predict(x_test)
cm = confusion_matrix(y_test,result)
print(cm)
>>[[422 74]
[ 5 545]]accuracy = accuracy_score(y_test, result)
print(accuracy)
>>0.9244741873804971
Kodların tamamı aşağıda da verilmiştir.
Okuduğunuz için teşekkürler bir sonraki yazımızda görüşmek üzere…