Najlepszy sposób na wykonanie wieloklasowej SVM

18

Wiem, że SVM jest klasyfikatorem binarnym. Chciałbym rozszerzyć go na SVM klasy. Jaki jest najlepszy, a może najłatwiejszy sposób na jego wykonanie?

kod: w 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

Jak można to poprawić?

lakesh
źródło
Co robi zmienna classesw kodzie? To wydaje się bezużyteczne.
doszedłeś do jakichś wniosków? mam ten problem z moją pracą. jeśli osiągnąłeś odpowiedni wynik, udostępnij tutaj swój kod multiklasyfikacji. dzięki.
me.rasouli,

Odpowiedzi:

16

Istnieje wiele metod klasyfikacji wielu klas. Dwie klasyczne opcje, które nie są specyficzne dla SVM, to:

  1. Klasyfikacja jeden na wszystkich (OVA):
    Załóżmy, że masz klasy A, B, C i D. Zamiast robić klasyfikację czterokierunkową, wytrenuj cztery binarne klasyfikatory: A vs. nie-A, B vs. nie-B , C vs. not-C i D vs. not-D. Następnie wybierz albo pozytywną klasę, która jest „najlepsza” (np. Najdalej od marginesu we wszystkich czterech seriach). Jeśli żadna z klasyfikacji nie jest dodatnia (tzn. Wszystkie nie są X), wybierz „przeciwieństwo” klasy, która jest najgorsza (np. Najbliżej marginesu).

  2. All-vs.-All:
    Trenuj wszystkie możliwe pary klasyfikacji. Ranguj klasy według jakiegoś czynnika (np. # Razy wybranych) i wybierz najlepszy.

To, co działa najlepiej, było sporne: Duan i Keerthi przeprowadzili badanie empiryczne, które sugeruje konkretną metodę „wszystko przeciwko wszystkim”, podczas gdy Rifkin i Klautau opowiadają się za planem „ jeden na wszystkich”. Istnieją nawet schematy, w których uczy się kodów korygujących błędy opisujących etykiety klas, zamiast samych etykiet.

Powodzenia!

Edycja: To, czego naprawdę chcesz, szczególnie dla OVA, to prawdopodobieństwo prawdopodobieństwa każdej klasy. W przypadku niektórych metod, takich jak Naive Bayes, wydostanie się jest banalne. SVM zwykle nie dają prawdopodobieństw, ale istnieją sposoby ich obliczenia. Zobacz artykuł Johna Platta z 1999 r. „Wyjścia probabilistyczne dla maszyn wektorów pomocniczych ...”

Matt Krause
źródło
2
W przypadku OVA - czy możesz wybrać klasę, która ma największe prawdopodobieństwo (wywołane przez skalowanie Platta)?
B_Miner
1
Tak, to w zasadzie wynik pracy Duana i Keerthi. Łączą prawdopodobieństwa Platta ze sztuczką parowania Hastie i uzyskują dobre wyniki. Prawdopodobnie powinienem edytować tekst, aby to uwzględnić. Dobry połów B_Miner!
Matt Krause,
czy w SVM potrzebujesz głosować lub sumować?
lakesh
@lakesh, Jeden przeciw wszystkim lub Wszyscy przeciw wszystkim są jak schematy głosowania. Jeśli używasz zestawu klasyfikatorów binarnych, musisz zrobić coś, aby zmienić je w klasyfikator wieloklasowy. Alternatywnie możesz użyć zmodyfikowanego SVM opisanego przez carlosdc poniżej ...
Matt Krause
co to jest
lakesh