Meilleure façon d'effectuer une SVM multiclasse

18

Je sais que le SVM est un classificateur binaire. Je voudrais l'étendre au SVM multi-classes. Quelle est la meilleure et peut-être la plus simple façon de la réaliser?

code: dans 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

Comment ça pourrait être amélioré?

Lakesh
la source
Que fait la variable classesdans le code? Cela semble inutile.
avez-vous tiré une conclusion? J'ai ce problème avec mon travail.Si vous êtes parvenu à un résultat approprié, veuillez partager votre code de multiclassification ici.Merci.
me.rasouli

Réponses:

16

Il existe de nombreuses méthodes de classification multi-classes. Deux options classiques, qui ne sont pas spécifiques à SVM sont:

  1. Classification un contre tous (OVA):
    Supposons que vous ayez les classes A, B, C et D. Au lieu de faire une classification à quatre voies, formez quatre classificateurs binaires: A contre non-A, B contre non-B , C contre non-C et D contre non-D. Ensuite, choisissez soit la classe positive qui est "la meilleure" (par exemple, la plus éloignée de la marge sur les quatre pistes). Si aucune des classifications n'est positive (c'est-à-dire qu'elles ne sont pas toutes des X), choisissez «l'opposé» de la classe qui est la pire (par exemple, la plus proche de la marge).

  2. All-vs-All:
    entraînez toutes les paires de classifications possibles. Classez les classes selon un facteur (par exemple, le nombre de fois sélectionné) et choisissez le meilleur.

Ce qui fonctionne le mieux a été controversé: Duan et Keerthi ont une étude empirique qui suggère une méthode spécifique du tout contre tout, tandis que Rifkin et Klautau plaident pour un schéma un contre tous. Il existe même des schémas où l'on apprend des codes correcteurs d'erreurs décrivant les étiquettes de classe, au lieu des étiquettes elles-mêmes.

Bonne chance!

Edit: Ce que vous voulez vraiment, en particulier pour l'OVA, c'est la probabilité postérieure de chaque classe. Pour certaines méthodes, comme Naive Bayes, c'est trivial de sortir. Les SVM ne vous donnent généralement pas de probabilités, mais il existe des moyens de les calculer. Voir l'article de John Platt de 1999 "Sorties probabilistes pour les machines à vecteurs de support ..."

Matt Krause
la source
2
Pour OVA - pouvez-vous choisir la classe qui a la plus grande probabilité (induite par la mise à l'échelle de Platt)?
B_Miner
1
Ouais, c'est essentiellement le résultat du journal Duan et Keerthi. Ils combinent les probabilités de Platt avec l'astuce de couplage par paire de Hastie et obtiennent de bons résultats. Je devrais probablement modifier le texte pour l'inclure. Bonne prise B_Miner!
Matt Krause du
dans SVM, avez-vous besoin de voter ou de mettre en commun?
Lakesh
@lakesh, One-vs-all ou All-vs-all sont comme des schémas de vote. Si vous utilisez un ensemble de classificateurs binaires, vous devez faire quelque chose pour les transformer en un classificateur multi-classes. Alternativement, vous pouvez utiliser le SVM modifié décrit par carlosdc ci-dessous ...
Matt Krause
c'est quoi quelque chose?
Lakesh