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é?
classes
dans le code? Cela semble inutile.Réponses:
Il existe de nombreuses méthodes de classification multi-classes. Deux options classiques, qui ne sont pas spécifiques à SVM sont:
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).
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 ..."
la source
Permettez-moi d'ajouter qu'il y a du travail sur l'extension des SVM à plusieurs classes (contrairement aux méthodes décrites par Matt Krause qui sont la décomposition en plusieurs tâches de classification binaire). Un travail important est: sur la mise en œuvre algorithmique de la machine vectorielle basée sur le noyau multiclasse
la source