Il modo migliore per eseguire SVM multiclasse


18

So che SVM è un classificatore binario. Vorrei estenderlo a SVM multi-classe. Qual è il modo migliore, e forse il più semplice, per eseguirlo?

codice: in 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

Come può essere migliorato?


Cosa fa la variabile classesnel codice? Sembra essere inutile.

sei arrivato a qualche conclusione? ho questo problema con il mio lavoro. Se hai raggiunto un risultato adeguato, ti preghiamo di condividere qui il tuo codice di multiclassificazione. Grazie.
me.rasouli,

Risposte:


16

Esistono molti metodi per la classificazione multi-classe. Due opzioni classiche, che non sono specifiche di SVM sono:

  1. Classificazione uno contro tutti (OVA):
    supponi di avere le classi A, B, C e D. Invece di fare una classificazione a quattro vie, addestra quattro classificatori binari: A vs. non-A, B vs. non-B , C vs. not-C e D vs. not-D. Quindi, scegli la classe positiva che è "migliore" (ad esempio, il più lontano dal margine in tutte e quattro le corse). Se nessuna delle classificazioni è positiva (cioè, non sono tutte-X), scegli il "contrario" della classe che è la peggiore (ad esempio, il più vicino al margine).

  2. All-vs-All:
    Allena tutte le possibili coppie di classificazioni. Classificare le classi in base a un fattore (ad esempio, il numero di volte selezionato) e scegliere il migliore.

Quello che funziona meglio è stato controverso: Duan e Keerthi hanno uno studio empirico che suggerisce uno specifico metodo all-vs-all, mentre Rifkin e Klautau sostengono uno schema uno contro tutti. Esistono persino schemi in cui si imparano i codici di correzione degli errori che descrivono le etichette delle classi, anziché le etichette stesse.

In bocca al lupo!

Modifica: ciò che vuoi davvero, in particolare per OVA, è la probabilità posteriore di ogni classe. Per alcuni metodi, come Naive Bayes, è banale uscire. Gli SVM in genere non ti danno probabilità, ma ci sono modi per calcolarli. Vedi il documento di John Platt del 1999 "Probabilistic Outputs for Support Vector Machines ..."


2
Per OVA: puoi scegliere la classe che ha la maggiore probabilità (indotta dal ridimensionamento di Platt)?
B_Miner

1
Sì, questo è fondamentalmente il risultato del documento Duan e Keerthi. Combinano le probabilità di Platt con il trucco di accoppiamento a coppie di Hastie e ottengono buoni risultati. Probabilmente dovrei modificare il testo per includerlo. Buona cattura B_Miner!
Matt Krause

in SVM, devi fare il voto o il pooling di somma?
Lakesh,

@lakesh, One-vs-all o All-vs-all sono come schemi di voto. Se stai usando un set di classificatori binari, devi fare qualcosa per trasformarli in un classificatore multi-classe. In alternativa, puoi utilizzare l'SVM modificato descritto da carlosdc di seguito ...
Matt Krause,

che cos'è quel qualcosa?
Lakesh,

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.