Cara terbaik untuk melakukan multiclass SVM

18

Saya tahu bahwa SVM adalah classifier biner. Saya ingin memperluasnya ke multi-class SVM. Mana yang terbaik, dan mungkin cara termudah untuk melakukannya?

kode: di MATLAB

   u=unique(TrainLabel); 
    N=length(u); 
    if(N>2)    
        itr=1;    
        classes=0;   
        while((classes~=1)&&(itr<=length(u)))   
            c1=(TrainLabel==u(itr));    
            newClass=double(c1); 
            tst = double((TestLabel == itr));
            model = svmtrain(newClass, TrainVec, '-c 1 -g 0.00154');  
            [predict_label, accuracy, dec_values] = svmpredict(tst, TestVec, model);    
            itr=itr+1;   
        end
        itr=itr-1;
    end

Bagaimana ini bisa diperbaiki?

Lakesh
sumber
Apa yang dilakukan variabel classesdalam kode? Sepertinya tidak berguna.
Apakah Anda sampai pada kesimpulan? Saya punya masalah dengan pekerjaan saya. Jika Anda telah mencapai rusult yang sesuai, silakan bagikan kode multiklasifikasi Anda di sini. Terima kasih.
me.rasouli

Jawaban:

16

Ada banyak metode untuk klasifikasi multi-kelas. Dua opsi klasik, yang tidak spesifik untuk SVM adalah:

  1. Klasifikasi satu-lawan-semua (OVA):
    Misalkan Anda memiliki kelas A, B, C, dan D. Alih-alih melakukan klasifikasi empat arah, latih empat klasifikasi biner: A vs bukan-A, B vs tidak-B , C vs tidak-C, dan D vs tidak-D. Kemudian, pilih salah satu kelas positif yang "terbaik" (mis., Jarak terjauh dari margin di keempat run). Jika tidak ada klasifikasi yang positif (yaitu, semuanya bukan-X), pilih "kebalikan" dari kelas yang terburuk (mis., Paling dekat dengan margin).

  2. All-vs-All:
    Latih semua kemungkinan klasifikasi. Buat peringkat kelas berdasarkan beberapa faktor (mis., # Waktu yang dipilih), dan pilih yang terbaik.

Yang paling berhasil adalah perdebatan: Duan dan Keerthi memiliki studi empiris yang menyarankan metode spesifik semua-vs-semua, sementara Rifkin dan Klautau berpendapat untuk skema satu- lawan -semua. Bahkan ada skema di mana orang belajar kode koreksi kesalahan yang menggambarkan label kelas, bukan label itu sendiri.

Semoga berhasil!

Sunting: Apa yang sebenarnya Anda inginkan, terutama untuk OVA, adalah probabilitas posterior masing-masing kelas. Untuk beberapa metode, seperti Naif Bayes, itu sepele untuk keluar. SVM biasanya tidak memberi Anda probabilitas, tetapi ada beberapa cara untuk menghitungnya. Lihat makalah John Platt 1999 "Output Probabilistik untuk Mendukung Mesin Vektor ..."

Matt Krause
sumber
2
Untuk OVA - dapatkah Anda memilih kelas yang memiliki probabilitas terbesar (diinduksi oleh penskalaan Platt)?
B_Miner
1
Ya, itu pada dasarnya hasil dari kertas Duan dan Keerthi. Mereka menggabungkan kemungkinan Platt dengan trik kopling berpasangan Hastie dan mendapatkan hasil yang baik. Saya mungkin harus mengedit teks untuk memasukkan itu. Tangkapan bagus B_Miner!
Matt Krause
dalam SVM, apakah Anda perlu melakukan voting atau penjumlahan?
lakesh
@lakesh, One-vs-semua atau All-vs-semua seperti skema pemilihan. Jika Anda menggunakan sekumpulan classifier biner, Anda harus melakukan sesuatu untuk mengubahnya menjadi classifier multi-kelas. Sebagai alternatif, Anda dapat menggunakan SVM modifikasi yang dijelaskan oleh carlosdc di bawah ini ...
Matt Krause
apa itu sesuatu?
lakesh
6

Izinkan saya menambahkan bahwa ada pekerjaan memperluas SVM ke beberapa kelas (yang bertentangan dengan metode yang dijelaskan oleh Matt Krause yang didekomposisi menjadi beberapa tugas klasifikasi biner). Salah satu pekerjaan penting adalah: Pada Implementasi Algoritma Mesin Vektor Berbasis Kernel Multiclass

carlosdc
sumber