Comment faire la classification multi-classe en utilisant des machines vectorielles de soutien (SVM)

dans chaque livre et exemple toujours ils montrent seulement la classification binaire (deux classes) et le nouveau vecteur peut appartenir à n'importe quelle classe.

ici le problème est que j'ai 4 classes(c1, c2, c3, c4). J'ai des données d'entraînement pour 4 classes.

pour un nouveau vecteur, la sortie doit être comme

C1 80% (le gagnant)

c2 10%

c3 6%

c4 4%

Comment faire cela? Je suis planification d'utiliser libsvm (parce qu'il est le plus populaire). Je ne sais pas beaucoup sur elle. Si l'un de vous l'a déjà utilisé, dites-moi les commandes que je suis censé utiliser.

38
demandé sur mlguy 2009-12-24 16:01:25

7 réponses

LibSVM utilise le un-contre-un approche pour les problèmes d'apprentissage multi-classes. À partir de la FAQ:

Q: Quelle méthode utilise libsvm pour la SVM multi-classes ? Pourquoi n'utilisez-vous pas la méthode" 1 contre le reste"?

c'est un contre un. Nous l'avons choisi après avoir fait la comparaison suivante: C.-W. Hsu et C.-J. Lin. Une comparaison des méthodes pour le multi-catégorie machines à vecteurs de support, IEEE Transactions on Neural Réseaux, 13 (2002), 415-425.

"1-contre-le reste" est une bonne méthode, dont les performances sont comparables à "1-contre-1."Nous faisons ce dernier simplement parce que son temps de formation est plus court.

32
répondu Oben Sonne 2011-02-23 08:50:01

les méthodes les plus couramment utilisées sont One vs. Rest et One vs. One. Dans le premier cas, vous obtenez n classificateurs et la classe résultante avec ont le score le plus élevé Dans la deuxième classe, la classe résultante est obtenue par vote majoritaire de tous les classificateurs.

AFAIR, libsvm supporte les deux stratégies du multiclass.

14
répondu Anton Kazennikov 2009-12-24 13:20:35

vous pouvez toujours réduire un problème de classification multi-classes à un problème binaire En choisissant des partitions aléatoires de l'ensemble des classes, récursivement. Cela n'est pas nécessairement moins efficace ou efficient que d'apprendre tout d'un coup, puisque les problèmes de sous-apprentissage nécessitent moins d'exemples puisque le problème de partitionnement est plus petit. (Il peut exiger tout au plus un temps d'ordre constant plus, par exemple deux fois plus long). Elle peut aussi mener à un apprentissage plus précis.

je ne suis pas nécessairement recommander, mais c'est une réponse à votre question, et est une technique générale peut être appliquée à toute binaire algorithme d'apprentissage.

3
répondu Larry Watanabe 2009-12-24 13:09:05

utilisez la bibliothèque SVM Multiclass. Trouver à le SVM page par Thorsten Joachims

1
répondu Birhanu Eshete 2011-12-02 20:07:41

il n'a pas de commutateur (commande) spécifique pour la prédiction multi-classes. il gère automatiquement la prédiction multi-classe si votre ensemble de données de formation contient plus de deux classes.

0
répondu Hamed 2015-10-01 15:44:48

rien de spécial par rapport à la prédiction binaire. voir l'exemple suivant pour la prédiction à 3 classes basée sur SVM.

install.packages("e1071")
library("e1071")
data(iris)
attach(iris)
## classification mode
# default with factor response:
model <- svm(Species ~ ., data = iris)
# alternatively the traditional interface:
x <- subset(iris, select = -Species)
y <- Species
model <- svm(x, y) 
print(model)
summary(model)
# test with train data
pred <- predict(model, x)
# (same as:)
pred <- fitted(model)
# Check accuracy:
table(pred, y)
# compute decision values and probabilities:
pred <- predict(model, x, decision.values = TRUE)
attr(pred, "decision.values")[1:4,]
# visualize (classes by color, SV by crosses):
plot(cmdscale(dist(iris[,-5])),
     col = as.integer(iris[,5]),
     pch = c("o","+")[1:150 %in% model$index + 1])
0
répondu Shicheng Guo 2016-07-25 18:10:02
data=load('E:\dataset\scene_categories\all_dataset.mat');
    meas = data.all_dataset;
    species = data.dataset_label;
    [g gn] = grp2idx(species);                      %# nominal class to numeric

%# split training/testing sets
[trainIdx testIdx] = crossvalind('HoldOut', species, 1/10);
%# 1-vs-1 pairwise models
num_labels = length(gn);
clear gn;
num_classifiers = num_labels*(num_labels-1)/2;
pairwise = zeros(num_classifiers ,2);
row_end = 0;
for i=1:num_labels - 1
    row_start = row_end + 1;
    row_end = row_start + num_labels - i -1;
    pairwise(row_start : row_end, 1) = i;
    count = 0;
    for j = i+1 : num_labels        
        pairwise( row_start + count , 2) = j;
        count = count + 1;
    end    
end
clear row_start row_end count i j num_labels num_classifiers;
svmModel = cell(size(pairwise,1),1);            %# store binary-classifers
predTest = zeros(sum(testIdx),numel(svmModel)); %# store binary predictions

%# classify using one-against-one approach, SVM with 3rd degree poly kernel
for k=1:numel(svmModel)
    %# get only training instances belonging to this pair
    idx = trainIdx & any( bsxfun(@eq, g, pairwise(k,:)) , 2 );

    %# train
    svmModel{k} = svmtrain(meas(idx,:), g(idx), ...
                 'Autoscale',true, 'Showplot',false, 'Method','QP', ...
                 'BoxConstraint',2e-1, 'Kernel_Function','rbf', 'RBF_Sigma',1);

    %# test
    predTest(:,k) = svmclassify(svmModel{k}, meas(testIdx,:));
end
pred = mode(predTest,2);   %# voting: clasify as the class receiving most votes

%# performance
cmat = confusionmat(g(testIdx),pred);
acc = 100*sum(diag(cmat))./sum(cmat(:));
fprintf('SVM (1-against-1):\naccuracy = %.2f%%\n', acc);
fprintf('Confusion Matrix:\n'), disp(cmat)
0
répondu lin0Xu 2017-01-04 12:06:44