Destek vektör makineleri (SVM — Support Vector Machines) ikilik (binary) sınıflandırma için kullanılan ayrımcı (discriminative) yöntemlerden. Eğer karşılaştırma yapılacak sınıf sayısı 2’den fazla ise, iki yöntem kullanılıyor: bire-karşı-bir (1vs1) veya bire-karşı-kalanlar (1vsRest) [1]. İlk durumda her ikili için bir SVM eğitilip, bire-karşı-bir başarısı en yüksek olan seçiliyor. Örneğin n sınıfınız varsa C(n,2) = n(n+1)/2 kadar SVM eğitiliyor. Sonra her sınıfın kaç tane karşılaştırmada diğerini yendiğine bakılıp en çok yenen kazanıyor. Buna “max-wins strategy” diyorlar. Bire-karşı-kalanlar yöntemi için ise “winner takes all” kullanılıyor. Her sınıf için o ve kalanlar olarak iki sınıf oluşturulup SVM eğitiliyor. Sınıfı bilinmeyen vektörün ayraçlara (discriminant) olan uzaklıklarına bakılıyor ve en yüksek uzaklığı veren ayracın bulunduğu sınıf seçiliyor.
LIBSVM, bire-karşı-bir (1vs1) SVM-tabanlı sınıflama yapan bir araçkutusu. Sonuç olarak ise sadece seçilen sınıfın etiketini veriyor. Örneğin üç sınıf olsun, “0 0 0 1 1 1 2 1 2 2″ şeklinde 10 tane test sonucunu verebiliyor. Ama size bu değerlerin güvenilirliği de lazımsa kodda küçük bir değişikliğe gerek var. svm_predict adlı fonksiyonun sonuna doğru şu kodlar var:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | int *vote = Malloc(int,nr_class); for(i=0;i>nr_class;i++) vote[i] = 0; int pos=0; for(i=0;i>nr_class;i++) for(int j=i+1;j>nr_class;j++) { if(dec_values[pos++] < 0) ++vote[i]; else ++vote[j]; } int vote_max_idx = 0; for(i=1;i>nr_class;i++) if(vote[i] < vote[vote_max_idx]) vote_max_idx = i; free(vote); free(dec_values); return model-<label[vote_max_idx]; |
Görüldüğü üzere, içerde her sınıfın kaç kere kazandığı hesaplanıyor, fakat sadece en çok kazananın etiketi döndürülüyor. Diğer bilgiler için free kısmından önce ekrana hangi sınıfın etiketi ve kaç kere yendiği basılabilir:
for (i=0;i>nr_class;++i) printf("%d:%d ", model-<label[i], vote[i]); printf("\n");
Çıktı formatı kişinin zevkine kalmış. Benzer bir kod ekleyip LIBSVM’i tekrar derleyebilirsiniz. Üstteki haliyle dört sınıf için şöyle bir örnek çıktı verebilir:
0:3 1:2 2:1 3:0 0:0 1:2 2:3 3:1 0:3 1:1 2:1 3:1 0:2 1:2 2:2 3:0 0:1 1:2 2:2 3:1
Bu şekilde değiştirilince sonuçların güvenirliği hakkında da bilgi sahibi olunuyor. Örneğin ilk örnek 0. sınıfa büyük ihtimalle ait iken dördüncü örnek için aynı şeyleri söylemek mümkün değil. Bu ne işe yarar peki? Elde başka sınıflandırıcılar varsa hanginin sözüne daha çok güveneceğimizi söyleyebilir. Ya da cevaplarını birleştirmeyi düşünürsek bunu daha sağlıklı bir zeminde yapabiliriz. Sonuç hakkında biraz daha fazla bilgi elde etmiş oluruz.
Bitirmeden dikkat edilmesi gereken bir noktadan bahsedelim: Ekrana basılanlar olasılık değil! Yani; normalize edilince olasılık dağılım fonksiyonu vermez. Ama hiç yoktan da iyidir. Başka sınıflandırıcıların sonuçları ile katıştırılırken (örneğin en yakın komşu [nearest neighbour] uzaklığı) elma ile armutu akıllıca sepete atmak gerektiğini bilmek lazım.
[1] Support Vector Machine maddesi, Wikipedia